sklearn train_test_split auf pandas Schichten von mehreren Spalten
Ich bin ein relativ neuer Benutzer sklearn und führen Sie in eine unerwartete Verhalten in train_test_split von sklearn.model_selection. Ich habe ein pandas dataframe, dass ich möchte, aufgeteilt in eine Trainings-und Testsatz. Ich möchte zu Schichten, dass meine Daten von mindestens 2, idealerweise aber 4 Spalten in meiner dataframe.
Gab es keine Warnungen aus sklearn, wenn ich versuchte, dies zu tun, jedoch fand ich später, dass es wiederholte Zeilen in meinem letzten Datensatz. Erstellt habe ich ein Probe-test zeigen dieses Verhalten:
from sklearn.model_selection import train_test_split
a = np.array([i for i in range(1000000)])
b = [i%10 for i in a]
c = [i%5 for i in a]
df = pd.DataFrame({'a':a, 'b':b, 'c':c})
Es scheint zu funktionieren wie erwartet, wenn ich die Schichten entweder durch Spalte:
train, test = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['b']])
print(len(train.a.values)) # prints 800000
print(len(set(train.a.values))) # prints 800000
train, test = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['c']])
print(len(train.a.values)) # prints 800000
print(len(set(train.a.values))) # prints 800000
Aber wenn ich versuche zu Schichten, die durch beide Spalten, bekomme ich wiederholte Werte:
train, test = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['b', 'c']])
print(len(train.a.values)) # prints 800000
print(len(set(train.a.values))) # prints 640000
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deshalb sind Sie immer Duplikate, weil
train_test_split()
schließlich definiert Schichten als eindeutigen Satz von Werten von was auch immer Sie ging in diestratify
argument. Da die Schichten definiert sind, die aus zwei Spalten, eine Zeile von Daten darstellen können mehr als eine Schicht, und so kann die Probenahme wählen Sie die gleiche Zeile zweimal, weil es denkt, es ist die Probenahme aus verschiedenen Klassen.Den
train_test_split()
Funktion AufrufeStratifiedShuffleSplit
, die verwendetnp.unique()
aufy
(das ist, was Sie überstratify
). Aus dem Quellcode:Hier ist ein Vereinfachtes Beispiel, eine variation auf das Beispiel, das Sie zur Verfügung gestellt:
Die Schichtung Funktion denkt, es gibt vier Klassen aufteilen auf:
foo
,bar
,y
, undz
. Aber da diese Klassen sind im wesentlichen geschachtelte, Bedeutungy
undz
beide zeigen, bis inb == foo
undb == bar
wir erhalten Duplikate, wenn der splitter versucht, Muster aus jeder Klasse.Gibt es eine größere design-Frage hier: wollen Sie verwendet verschachtelte stratified sampling, oder tun Sie eigentlich nur behandeln wollen jede Klasse
df.b
unddf.c
als eine separate Klasse Probe aus? Wenn letzteres, das ist, was du bist schon immer. Das erstere ist komplizierter, und das ist nicht das, wastrain_test_split
eingerichtet ist, zu tun.Finden Sie vielleicht diese Diskussion verschachtelt geschichteten Probenahme sinnvoll.
Welche version von scikit-learn verwenden Sie ? Sie können
sklearn.__version__
zu überprüfen.Vorherige version 0.19.0, scikit-learn ist nicht in der Lage 2-dimensionale Schichtung richtig. Es ist gepatcht 0.19.0.
Ist es describled in Ausgabe #9044.
Aktualisieren Sie Ihre scikit-learn sollte das problem lösen. Wenn Sie nicht aktualisieren Sie Ihre scikit-lernen, sehen diese commit-Historie hier für das Update.
Wenn Sie wollen
train_test_split
zu Verhalten, als Sie erwarten (Schichten von mehreren Spalten ohne Duplikate) erstellen Sie eine neue Spalte, die eine Verkettung der Werte in den anderen Spalten und Schichten auf die neue Spalte.Wenn Sie besorgt sind über den Zusammenstoß durch Werte wie
11
und3
und1
und13
sowohl die Erstellung einer verketteten Wert von113
, dann kannst du einen beliebigen string in der Mitte: