In der Quelle GroupKFold
ist random_state
auf None
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.
Die Ausgabe:
%Vor%KFold
wird nur randomisiert, wenn shuffle=True
. Einige Datensätze sollten nicht gemischt werden.
GroupKFold
wird überhaupt nicht randomisiert. Daher die random_state=None
. GroupShuffleSplit
kann näher an dem sein, wonach Sie suchen. Ein Vergleich der gruppenbasierten Splitter:
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
.
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.
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.
Daten:
%Vor%Zufallszustand als 4
%Vor%Zufallszustand als 5
%Vor%Tags und Links python numpy scikit-learn