2016-07-01 15 views
0

Ich möchte roh Datenrahmen in drei Untergruppen aufgeteilt: Zug, Test, ValidierungSplit Datenrahmen in 3 Untergruppen

Ich sehe drei Lösungen, aber Angst, sie sind nicht korrekt und kann Flaschenhals-Effekt

1 Ursache) hinzufügen Wörterbuch mit Schlüssel

my_dict = {'train':raw_df.loc[start:end], 'test':raw_df.loc[start:end], 
      'val':raw_df.loc[start:end]} 

2) schaffen drei Datenrahmen

train_df = df.loc[start:end] 
test_df = df.loc[start:end] 
val_df = df.loc[start:end] 

3) fügen Sie neue Spalte mit einer von drei zufälligen Werten zufällig

df['train/test/val'] = pd.Series('train', index=df.index) 

Außerdem wird das Hinzufügen Datenrahmen im Wörterbuch Ursache: bottle_neck Wirkung der Vorteile von Datenrahmen ist Hilfe im Wörterbuch oder Listen Leistung zu verlieren? neue Spalten in der Theorie Hinzufügen nimmt Dimension der Daten neuen Datenrahmen erstellen Ich denke, das Schlimmste Variante ist weil es Tonnen von Speicher

+1

Durch Hinzufügen einer neuen Spalte wird die Dimension nicht vergrößert, da Sie sie nicht in einen Lernprozess einbeziehen. Wenn Sie sich Sorgen um den Platz machen (obwohl ich nicht glaube, dass viel Platz benötigt wird), können Sie die Schnittpunkte einfach speichern (zB 0, 25, 70, 100) und bei Bedarf die Scheiben des Datenrahmens verwenden (df [0: 25], df [25:70] usw.). Wenn Sie sie in drei verschiedene Datenfelder aufteilen, erhöht dies auch nicht die Speichernutzung. – ayhan

Antwort

0

Technisch essen, ich glaube nicht, dass Sie drei Datenrahmen haben müssen, wenn Sie testen möchten Ihr maschinelles Lernmodell. Warum? Weil Sie Ihr Modell auf Ihrem training_set bauen und Sie müssen es mit Ihrem validation_set validieren. Sie werden nur Ihre test_set verwenden, sobald Ihr Modell validiert ist. Auch Ihre test_set enthält nicht die Y Bezeichnung.

Mehrere Bibliotheken enthalten Funktionen zum einfachen Teilen Ihrer Daten.

ohne Verwendung eines externen Bibliothek zu verwenden:

msk = np.random.rand(len(df)) < 0.8 
train = df[msk] 
validation = df[~msk] 

(Antwort von: How do I create test and train samples from one dataframe with pandas?)

Hoffe, das hilft!

+0

Der Zug/Test/Validieren ist ein Split-Modus, der zum Beispiel bei Kaggle-Wettbewerben verwendet wird. Wenn Sie auf dieser Art von Plattenformen trainieren, kann es nützlich sein, Ihre Daten in drei Sätze zu teilen. Was den Rest der Zeit angeht, stimme ich Ihnen vollkommen zu. – ysearka

+0

@ysearka Ich habe Kaggle vor einiger Zeit ausgecheckt, weißt du, warum sie drei Splits wollen? –

+1

Sie können 'train' /' test' verwenden, um Ihr Modell zu validieren und einen 'validate'-Satz (der mit anderen Personen gemeinsam sein kann) zu behalten, um Ihre Ergebnisse zu vergleichen. Dies ermöglicht einen objektiven Vergleich auf demselben Set. – ysearka

3

Wenn Sie eine neue Spalte hinzufügen, werden Sie nicht viele Memorys aufnehmen, aber Sie werden immer dann, wenn Sie auf eines Ihrer drei Sets zugreifen möchten, eine Slicing-Kosten hinzufügen. Das Erstellen neuer Dataframes führt dazu, dass dieser Slicing-Part nur einmal ausgeführt wird.

Dazu können Sie sample verwenden. Lassen Sie uns Ihnen 80% Ihrer Datenrahmen in trainieren wollen, und 10% in Test und Validierung:

train = df.sample(frac = 0.8) 
test = df.drop(train.index).sample(frac = 0.5) 
validate = df.drop(train.index).drop(test.index) 
0

Eine reine Pandas Lösung für nur eine einzige Iteration wäre Probe zu verwenden, und den Index Ihrer Probe ausschließen für Ihre nächste Iteration mit pd.Index.difference:

validation = df.sample(validation_size) 
# Get the other part of the dataframe 
train_test = df.loc[df.index.difference(validation.index)] 

test = train_test.sample(test_size) 
train = train_test.loc[train_test.index.difference(test.index)] 

Beachten Sie, dass validation_size und test_size sind die Anzahl der Zeilen, die Sie für Ihre Validierungs- und Testrahmen wollen, respectively.

Sklearn bietet auch eine große Funktionalität für die Durchführung von Splits in einer Schleife für eine einfachere Kreuzvalidierung. Dokumentation hier: http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.ShuffleSplit.html

+0

habe gerade die Antwort von ysearka gesehen und sie ist aufgewertet, es ist besser als meins. – breucopter

Verwandte Themen