2016-05-09 2 views
2

Ich habe einen großen Datensatz und möchte den Datensatz nach dem Zufallsprinzip in 70% Zug, 25% Test und 5% Dev aufteilen. Wie kann ich das in Python mit scikit-learn tun?Wie wird ein Datensatz nach dem Zufallsprinzip in Trainingssatz, Testsatz und Entwicklersatz in Python aufgeteilt?

Ich frage mich, ob wir dies mit der Funktion sklearn.cross_validation.train_test_split (* Arrays, ** Optionen) wie im Beispiel im folgenden Link tun?

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

+0

Ich glaube nicht, dass wir einen direkten Weg oder API haben, das gleiche zu tun. Sie können jedoch eine doppelte Aufteilung vornehmen. Verwenden Sie zuerst train_test_split mit 30% als Test. Jetzt auf diese neuen Testdaten, machen Sie einen weiteren Split mit Testgröße als 5%, um die Dev-Aufteilung zu erhalten. – pmaniyan

+1

Vielleicht hilft eine Funktion random.shuffle? Als nächstes können Sie einfach Ihren Satz in 0,7, 0,95 etc. schneiden. – fafnir1990

Antwort

2

könnten Sie verwenden:

from numpy.random import multinomial 

n_total_samples = 1000 # or whatever it is 

indices = np.arange(n_total_samples) 
inds_split = multinomial(n=1, 
         pvals=[0.7, 0.25, 0.05], 
         size=n_total_samples).argmax(axis=1) 

train_inds = indices[inds_split==0] 
test_inds = indices[inds_split==1] 
dev_inds = indices[inds_split==2] 

print len(train_inds)/float(n_total_samples) # => 0.713 
print len(test_inds)/float(n_total_samples) # => 0.24 
print len(dev_inds)/float(n_total_samples) # => 0.047 

Es ist nicht so schön wie eine eingebaute Funktion, aber ich glaube, dass es das tut, was Sie brauchen.

+0

Welche Zeile in Ihrem Code zeigt an, dass dies eine zufällige Aufteilung ist? Vielen Dank. –

+0

'multinomial' erzeugt einen zufälligen Indikatorvektor für jedes Datensample. Im Wesentlichen verwenden wir das Ergebnis jedes zufälligen Indikatorvektors für jede Stichprobe, um ihren Index so zuzuweisen, dass sie mit den vorgeschriebenen Wahrscheinlichkeiten in der Trainings-, Test- oder Entwicklungsgruppe ist. –

1

Warum nicht einfach eine zufällige. Dann schneiden Sie es nach Ihren Bedürfnissen auf.

sollte folgendermaßen aussehen:

import random 
random.shuffle(yourTestSet) 

Will, wie der Name schon andeutet, zufällig Ihre Proben neu anordnen.

train_set, test_set, dev_set = yourTestSet[:70], yourTestSet[70:95], yourTestSet[95:] 

Dieser Code oben für 100 Proben arbeitet, stellen Zahlen auf Ihre Bedürfnisse oder len verwenden() * x, wenn Sie nicht die genaue Größe kennen.

Bearbeiten: Vorgeschlagen von fafnir1990 in Kommentar.

2

Gute Frage - es kann mit sklearn mit zwei aufeinander folgenden Aufteilungen erfolgen:

import numpy as np 
from sklearn.cross_validation import train_test_split 

X = np.random.random((10000, 10)) 
y = np.random.random(10000) 

test_size = 0.25 
holdout_size = 0.05 

X_train, X_temp, y_train, y_temp = train_test_split(X, y, 
            test_size = test_size + holdout_size) 

X_test, X_holdout, y_test, y_holdout = train_test_split(X_temp, y_temp, 
         test_size = holdout_size/(test_size + holdout_size)) 

print len(X_train) # => 7000 
print len(X_test) # => 2499 
print len(X_holdout) # => 501 
Verwandte Themen