Ich habe einen Pandas-Datenrahmen und möchte ihn in 3 separate Sätze aufteilen. Ich weiß, dass man mit train_test_split von sklearn.cross_validation
die Daten in zwei Sätze (Zug und Test) aufteilen kann. Ich konnte jedoch keine Lösung für die Aufteilung der Daten in drei Sätze finden. Am liebsten hätte ich die Indizes der Originaldaten.
Ich weiß, dass eine Problemumgehung darin besteht, train_test_split
zwei Indizes zu verwenden und die Indizes irgendwie anzupassen. Aber gibt es eine standardmäßigere / integrierte Möglichkeit, die Daten in 3 statt in 2 Sätze aufzuteilen?
Antworten:
Numpy Lösung. Wir werden zuerst den gesamten Datensatz mischen (df.sample (frac = 1)) und dann unseren Datensatz in die folgenden Teile aufteilen:
[int(.6*len(df)), int(.8*len(df))]
- ist einindices_or_sections
Array für numpy.split () .Hier ist eine kleine Demo zur
np.split()
Verwendung - teilen wir das Array mit 20 Elementen in die folgenden Teile auf: 80%, 10%, 10%:quelle
frac=1
weist diesample()
Funktion an, alle (100%
oder gebrochenen =1.0
) Zeilen zurückzugebennp.random.seed(any_number)
vor der Trennlinie, um bei jedem Lauf das gleiche Ergebnis zu erzielen. Zweitens, um ein ungleiches Verhältnis wietrain:test:val::50:40:10
Gebrauch zu machen[int(.5*len(dfn)), int(.9*len(dfn))]
. Hier bezeichnet das erste Element die Größe fürtrain
(0,5%), das zweite Element die Größe fürval
(1-0,9 = 0,1%) und die Differenz zwischen den beiden die Größe fürtest
(0,9-0,5 = 0,4%). Korrigieren Sie mich, wenn ich falschHinweis:
Die Funktion wurde geschrieben, um das Seeding der zufälligen Set-Erstellung zu handhaben. Sie sollten sich nicht auf die Aufteilung von Sätzen verlassen, bei der die Sätze nicht zufällig angeordnet werden.
Demonstration
quelle
Allerdings ist ein Ansatz , um die Datenmenge in der zu Dividieren
train
,test
,cv
mit0.6
,0.2
,0.2
wäre es , die verwendentrain_test_split
Methode zweimal.quelle
np.split()
. Außerdem ist keine zusätzliche Abhängigkeit von erforderlichsklearn
.Hier ist eine Python-Funktion, die einen Pandas-Datenrahmen in Zug-, Validierungs- und Testdatenrahmen mit geschichteten Stichproben aufteilt. Diese Aufteilung wird durchgeführt, indem die Funktion von scikit-learn
train_test_split()
zweimal aufgerufen wird .Unten finden Sie ein vollständiges Arbeitsbeispiel.
Stellen Sie sich einen Datensatz mit einer Bezeichnung vor, auf der Sie die Schichtung durchführen möchten. Dieses Etikett hat eine eigene Verteilung im Originaldatensatz, z. B. 75%
foo
, 15%bar
und 10%baz
. Lassen Sie uns nun den Datensatz in Zug, Validierung und Test in Teilmengen unter Verwendung eines Verhältnisses von 60/20/20 aufteilen, wobei jede Aufteilung die gleiche Verteilung der Beschriftungen beibehält. Siehe die Abbildung unten:Hier ist der Beispieldatensatz:
Rufen wir nun die
split_stratified_into_train_val_test()
Funktion von oben auf, um Zug-, Validierungs- und Testdatenrahmen nach einem Verhältnis von 60/20/20 abzurufen.Die drei Datenrahmen
df_train
,df_val
unddf_test
enthalten alle ursprünglichen Reihen , aber ihre Größe wird das obige Verhältnis folgen.Ferner hat jede der drei Teilungen die gleiche Verteilung des Etiketts, nämlich 75%
foo
, 15%bar
und 10%baz
.quelle
Es ist sehr bequem zu verwenden,
train_test_split
ohne eine Neuindizierung durchzuführen, nachdem Sie in mehrere Sätze aufgeteilt und keinen zusätzlichen Code geschrieben haben. Die beste Antwort oben erwähnt nicht, dass durch zweimaliges Trennen unter Verwendungtrain_test_split
nicht ändernder Partitionsgrößen keine ursprünglich beabsichtigte Partition erhalten wird:Dann ändert sich der Teil der Validierungs- und Testsätze in der x_remain und könnte als gezählt werden
In diesem Fall werden alle anfänglichen Partitionen gespeichert.
quelle