Was ist ein guter Weg, um ein NumPy-Array zufällig in Trainings- und Test- / Validierungsdatensätze aufzuteilen? Ähnliches wie cvpartition
oder crossvalind
funktioniert in Matlab.
quelle
Was ist ein guter Weg, um ein NumPy-Array zufällig in Trainings- und Test- / Validierungsdatensätze aufzuteilen? Ähnliches wie cvpartition
oder crossvalind
funktioniert in Matlab.
Wenn Sie den Datensatz einmal in zwei Hälften teilen möchten, können Sie Folgendes verwenden numpy.random.shuffle
oder numpy.random.permutation
die Indizes im Auge behalten:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
oder
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]
Es gibt viele Möglichkeiten, denselben Datensatz wiederholt für die Kreuzvalidierung zu partitionieren . Eine Strategie besteht darin, mit Wiederholung ein Resample aus dem Datensatz zu erstellen:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
training_idx = numpy.random.randint(x.shape[0], size=80)
test_idx = numpy.random.randint(x.shape[0], size=20)
training, test = x[training_idx,:], x[test_idx,:]
Schließlich enthält sklearn mehrere Kreuzvalidierungsmethoden (k-fach , weglassen , ...). Es enthält auch fortgeschrittenere "geschichtete Stichproben" -Methoden, mit denen eine Partition der Daten erstellt wird, die in Bezug auf einige Merkmale ausgewogen ist, um beispielsweise sicherzustellen, dass der Trainings- und Testsatz den gleichen Anteil an positiven und negativen Beispielen enthält.
Es gibt noch eine andere Option, bei der nur Scikit-Learn verwendet wird. Wie im Wiki von scikit beschrieben , können Sie einfach die folgenden Anweisungen verwenden:
Auf diese Weise können Sie die Beschriftungen für die Daten, die Sie in Training und Test aufteilen möchten, synchron halten.
quelle
Nur eine Notiz. Wenn Sie Trainings-, Test- UND Validierungssätze wünschen, können Sie dies tun:
Diese Parameter geben 70% für das Training und jeweils 15% für Test- und Val-Sets. Hoffe das hilft.
quelle
from sklearn.cross_validation import train_test_split
um klar zu machen, welches Modul Sie verwendena=0.7
,b=0.15
,c=0.15
, undd = dataset
,N=len(dataset)
dannx_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
undx_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Da das
sklearn.cross_validation
Modul veraltet war, können Sie Folgendes verwenden: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.
Dieser Code gibt aus:
quelle
value_inds
sind wirklich Indizes, aber die Ausgabe sind keine Indizes, nur Masken.Ich habe eine Funktion für mein eigenes Projekt geschrieben, um dies zu tun (es wird jedoch kein Numpy verwendet):
Wenn Sie möchten, dass die Chunks zufällig ausgewählt werden, mischen Sie einfach die Liste, bevor Sie sie übergeben.
quelle
Hier ist ein Code zum Aufteilen der Daten in n = 5 Falten in geschichteter Weise
quelle
Danke pberkes für deine Antwort. Ich habe es nur geändert, um zu vermeiden, dass (1) ersetzt wird, während Stichproben (2) doppelte Instanzen sowohl beim Training als auch beim Testen auftraten:
quelle
Nachdem ich etwas gelesen und die (vielen ..) verschiedenen Arten der Aufteilung der Daten zum Trainieren und Testen berücksichtigt hatte, entschied ich mich für timeit!
Ich habe 4 verschiedene Methoden verwendet (keine von ihnen verwendet die Bibliothek sklearn, die mit Sicherheit die besten Ergebnisse liefert, da es sich um gut gestalteten und getesteten Code handelt):
Methode 3 gewann bei weitem mit der kürzesten Zeit nach dieser Methode 1, und Methode 2 und 4 erwiesen sich als wirklich ineffizient.
Der Code für die 4 verschiedenen Methoden, die ich zeitlich festgelegt habe:
Und für die Zeit beträgt die Mindestzeit für die Ausführung von 3 Wiederholungen von 1000 Schleifen:
Ich hoffe das ist hilfreich!
quelle
Wahrscheinlich müssen Sie sich nicht nur in Zug und Test aufteilen, sondern auch gegenseitig validieren, um sicherzustellen, dass Ihr Modell verallgemeinert wird. Hier gehe ich von 70% Trainingsdaten, 20% Validierung und 10% Holdout- / Testdaten aus.
Schauen Sie sich die np.split an :
quelle
In Zugversuche aufgeteilt und gültig
quelle