So erhalten Sie reproduzierbare, aber unterschiedliche Instanzen von GroupKFold

9

In der Quelle GroupKFold ist random_state auf None

festgelegt %Vor%

Daher, wenn es mehrmals ausgeführt wird (Code von hier )

%Vor%

o / p

%Vor%

usw. ...

Die Splits sind identisch.

Wie setze ich random_state für GroupKFold , um bei einigen verschiedenen Versuchen der Kreuzvalidierung eine andere (aber replizierbare) Menge von Aufteilungen zu erhalten?

ZB möchte ich

%Vor%

Bisher scheint es eine Strategie zu sein, zuerst ein sklearn.utils.shuffle zu verwenden, wie in diesem posten . Dies ordnet jedoch nur die Elemente jeder Falte neu an - es gibt uns keine neuen Splits.

%Vor%

Die Ausgabe:

%Vor%     
user86895 25.01.2017, 19:05
quelle

3 Antworten

4

Ein Vergleich der gruppenbasierten Splitter:

  • In GroupKFold bilden die Testsätze eine vollständige Partition von alle Daten.
  • LeavePGroupsOut hinterlässt alle möglichen Untergruppen von P-Gruppen kombinatorisch aus; Testsätze überschneiden sich für P & gt; 1. Da dies bedeutet P ** n_groups teilt sich ganz, oft wollen Sie ein kleines P, und am häufigsten wollen LeaveOneGroupOut , was im Grunde dasselbe ist wie GroupKFold mit k=1 .
  • GroupShuffleSplit gibt keine Aussage über die Beziehung zwischen aufeinanderfolgenden Testsätzen; jeder Zug / Test-Split wird unabhängig durchgeführt.

Nebenbei, Dmytro Lituiev hat einen alternativen GroupShuffleSplit -Algorithmus vorgeschlagen, der besser die richtige Anzahl von Proben liefert (nicht nur die richtige Anzahl von Gruppen) in der Testmenge für eine angegebene test_size .

    
joeln 12.07.2017, 10:57
quelle
1

Unterklasse und implementieren

a random_state abhängige _iter_test_masks( ... random_state = None ) Methode, wie es in der Quelle des sci-kit super(...) selbst dokumentiert wurde. Der Parameter random_state , der bei der Instantiierung verwendet wird ( .__init__() ist "nur" gespeichert und der Kreativität des Benutzers überlassen, wenn es für eine test_mask -Erzeugung (wie sie in sci-kit-Quellkommentaren ausgedrückt wird) in irgendeiner angepassten Weise verwendet wird oder nicht:

(Zitat:)

%Vor%

Das Definieren eines Prozesses, der von extern bereitgestellten random_state != None abhängig wird, sollte auch eine angemessene Vorgehensweise zum Schützen - Speichern / Speichern des aktuellen aktuellen Status des Zufallsgenerators ( RNG_stateTUPLE = numpy.random.get_state() ), den von .__init__() aufrufenden bereitstellen Schnittstelle und nach dem Beenden, stellen Sie den RNG-Status aus dem gespeicherten ( numpy.random.set_state( RNG_stateTUPLE ) ).

Auf diese Weise erhält ein solcher benutzerdefinierter Prozess sowohl die erforderliche Abhängigkeit von random_state -Wert als auch die Reproduzierbarkeit. Q.E.D.

    
user3666197 11.07.2017 14:10
quelle
1

Meine bisherige Lösung bestand darin, die Gruppen einfach nach dem Zufallsprinzip aufzuteilen. Dies könnte zu sehr unausgewogenen Gruppen führen (von denen ich denke, dass GroupKFold darauf abzielen würde abzuwehren), aber die Hoffnung ist, dass die Anzahl der Beobachtungen pro Gruppe gering ist.

%Vor%

Daten:

%Vor%

Zufallszustand als 4

%Vor%

Zufallszustand als 5

%Vor%     
user86895 17.07.2017 19:52
quelle

Tags und Links