Ich habe einen ziemlich großen Datensatz in Form eines Datenrahmens und habe mich gefragt, wie ich den Datenrahmen für Schulungen und Tests in zwei Zufallsstichproben (80% und 20%) aufteilen kann.
Vielen Dank!
python
python-2.7
pandas
dataframe
tooty44
quelle
quelle
msk
der dtype istbool
,df[msk]
,df.iloc[msk]
unddf.loc[msk]
immer das gleiche Ergebnis zurück.rand
,< 0.8
um Sinn zu machen, weil es gleichmäßig verteilte Zufallszahlen zwischen 0 und 1 zurückgibt.in[12]
,in[13]
,in[14]
? Ich möchte den Python-Code selbst hier verstehennp.random.rand(len(df))
ist ein Größenarraylen(df)
mit zufällig und gleichmäßig verteilten Float-Werten im Bereich [0, 1]. Das< 0.8
wendet den Vergleich elementweise an und speichert das Ergebnis an Ort und Stelle. So werden Werte <0,8True
und Wert> = 0,8False
scikit learn's
train_test_split
ist gut.quelle
kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]
Das vollständige Beispiel finden Sie hier: quantstart.com/articles/…from sklearn.model_selection import train_test_split
stattdessen als .from sklearn.cross_validation import train_test_split
Pandas Zufallsstichprobe wird auch funktionieren
quelle
random_state
Arg?test
Satz gewünscht wird, wie hier gezeigt . stackoverflow.com/questions/29576430/shuffle-dataframe-rows .test=df.drop(train.index).sample(frac=1.0)
Ich würde scikit-learns eigenen training_test_split verwenden und ihn aus dem Index generieren
quelle
cross_validation
Modul ist jetzt veraltet:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
Es gibt viele Möglichkeiten, einen Zug / Test und sogar Validierungsmuster zu erstellen.
Fall 1: klassischer Weg
train_test_split
ohne Optionen:Fall 2: Fall eines sehr kleinen Datensatzes (<500 Zeilen): Um mit dieser Kreuzvalidierung Ergebnisse für alle Ihre Zeilen zu erhalten. Am Ende haben Sie eine Vorhersage für jede Zeile Ihres verfügbaren Trainingssatzes.
Fall 3a: Unausgeglichene Datensätze zu Klassifizierungszwecken. Nach dem Fall 1 ist hier die äquivalente Lösung:
Fall 3b: Unausgeglichene Datensätze zu Klassifizierungszwecken. Nach dem Fall 2 ist hier die äquivalente Lösung:
Fall 4: Sie müssen einen Zug- / Test- / Validierungssatz für Big Data erstellen, um Hyperparameter abzustimmen (60% Zug, 20% Test und 20% Wert).
quelle
Sie können den folgenden Code verwenden, um Test- und Trainingsmuster zu erstellen:
Die Testgröße kann je nach Prozentsatz der Daten variieren, die Sie in Ihren Test- und Zugdatensatz aufnehmen möchten.
quelle
Es gibt viele gültige Antworten. Hinzufügen eines weiteren zum Haufen. aus sklearn.cross_validation import train_test_split
quelle
Sie können auch eine geschichtete Unterteilung in Trainings- und Testgruppen in Betracht ziehen. Die gestartete Aufteilung generiert auch zufällig Trainings- und Testsätze, jedoch so, dass die ursprünglichen Klassenanteile erhalten bleiben. Dadurch spiegeln Trainings- und Testsätze die Eigenschaften des Originaldatensatzes besser wider.
df [train_inds] und df [test_inds] geben Ihnen die Trainings- und Testsätze Ihres ursprünglichen DataFrame df.
quelle
Wenn Sie Ihre Daten in Bezug auf die Spalte "Etiketten" in Ihrem Datensatz aufteilen müssen, können Sie Folgendes verwenden:
und benutze es:
Sie können auch random_state übergeben, wenn Sie die geteilte Zufälligkeit steuern oder einen globalen zufälligen Startwert verwenden möchten.
quelle
quelle
Sie können ~ (Tilde-Operator) verwenden, um die mit df.sample () abgetasteten Zeilen auszuschließen, sodass Pandas allein das Abtasten und Filtern von Indizes durchführen können, um zwei Sätze zu erhalten.
quelle
Dies habe ich geschrieben, als ich einen DataFrame teilen musste. Ich habe überlegt, den obigen Ansatz von Andy zu verwenden, aber es hat mir nicht gefallen, dass ich die Größe der Datensätze nicht genau steuern konnte (dh manchmal 79, manchmal 81 usw.).
quelle
Wählen Sie einfach die Bereichszeile von df wie folgt aus
quelle
df
in Ihrem Code-Snippet gemischt wird (oder werden sollte), wird die Antwort verbessert.Es gibt oben viele gute Antworten, daher möchte ich nur ein weiteres Beispiel hinzufügen, falls Sie die genaue Anzahl der Proben für den Zug und die Testsätze nur mithilfe der
numpy
Bibliothek angeben möchten .quelle
Um sich in mehr als zwei Klassen wie Zug, Test und Validierung aufzuteilen, kann man Folgendes tun:
Dadurch werden ungefähr 70% der Daten in das Training, 15% in den Test und 15% in die Validierung einbezogen.
quelle
Sie müssen den Pandas-Datenrahmen in ein Numpy-Array konvertieren und dann das Numpy-Array wieder in einen Datenrahmen konvertieren
quelle
Wenn Sie einen Datenrahmen ein- und zwei Datenrahmen aus haben möchten (keine numpy Arrays), sollte dies den Trick tun:
quelle
Sie können die Funktion df.as_matrix () verwenden, ein Numpy-Array erstellen und übergeben.
quelle
Ein bisschen eleganter für meinen Geschmack ist es, eine zufällige Spalte zu erstellen und diese dann aufzuteilen. Auf diese Weise können wir eine Aufteilung erhalten, die unseren Bedürfnissen entspricht und zufällig ist.
quelle
Ich denke, Sie müssen auch eine Kopie erhalten, kein Stück Datenrahmen, wenn Sie später Spalten hinzufügen möchten.
quelle
Wie wäre es damit? df ist mein Datenrahmen
quelle
Keine Notwendigkeit, in numpy zu konvertieren. Verwenden Sie einfach einen Pandas df, um den Split durchzuführen, und es wird ein Pandas df zurückgegeben.
quelle