2015-03-16 2 views
8

Ich habe ein mehrklassiges Klassifizierungsproblem und mein Dataset ist verzerrt, ich habe 100 Instanzen einer bestimmten Klasse und sage 10 einer anderen Klasse, also möchte ich mein Dataset zwischen den Klassen teilen, wenn ich 100 Instanzen von a habe bestimmte Klasse und ich möchte 30% der Datensätze in den Trainingssatz gehen möchte ich dort 30 Instanzen meiner 100 Rekord vertretene Klasse und 3 Instanzen meiner 10 Rekord vertreten Klasse und so weiter haben.Wie teilt man einen Datensatz in Trainings- und Validierungsmengen auf, um das Verhältnis zwischen den Klassen zu halten?

Antwort

8

Sie sklearn die verwenden können StratifiedKFold, aus den Online-Dokumentation:

Stratifizierte K-Folds Kreuzvalidierung Iterator

Bietet Zug/Test Indizes Daten in Zug Test-Sets aufgeteilt.

Dieses Kreuzvalidierungsobjekt ist eine Variante von KFold, die geschichtete Falten zurückgibt. Die Falten sind gemacht, indem der Prozentsatz der Proben für jede Klasse beibehalten wird.

>>> from sklearn import cross_validation 
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]]) 
>>> y = np.array([0, 0, 1, 1]) 
>>> skf = cross_validation.StratifiedKFold(y, n_folds=2) 
>>> len(skf) 
2 
>>> print(skf) 
sklearn.cross_validation.StratifiedKFold(labels=[0 0 1 1], n_folds=2, 
             shuffle=False, random_state=None) 
>>> for train_index, test_index in skf: 
... print("TRAIN:", train_index, "TEST:", test_index) 
... X_train, X_test = X[train_index], X[test_index] 
... y_train, y_test = y[train_index], y[test_index] 
TRAIN: [1 3] TEST: [0 2] 
TRAIN: [0 2] TEST: [1 3] 

Dies wird Ihre Klasse-Verhältnisse erhalten, so dass die Spaltungen, die Klassenverhältnisse behalten, wird dies mit Pandas dfs gut funktionieren.

Wie @Ali_m vorgeschlagen könnten Sie StratifiedShuffledSplit verwenden, die eine param Splitverhältnis akzeptiert:

sss = StratifiedShuffleSplit(y, 3, test_size=0.7, random_state=0)

würde eine 70% ige Spaltung erzeugen.

+0

Wie teile ich 70/30 mit kFold Technik? – JackNova

+1

können Sie ['StratifiedShuffleSplit'] (http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.StratifiedShuffleSplit.html#sklearn.cross_validation.StratifiedShuffleSplit) für nicht-ganzzahliges Teilen verwenden –

+0

@EdChum tut dies Arbeit auch für Multi-Class-Zeitreihen-Klassifizierung Problem? – tilaprimera

-1

You can simply use the following:

Aber stellen Sie sicher, dass Sie stratify der Klasse Etiketten von None zurück:

„stratify: Array-artiges oder None (Standard None ist) Wenn nicht None, werden die Daten in einem Split geschichtete Mode, mit diesem als die Klassenetiketten. "

+0

Das Hinzufügen eines minimalen kontextuellen Beispiels (wie man dieses verwendet) würde diese Antwort besser machen . Versuchen Sie auch zu vermeiden, extern zu verlinken, ohne ausführlich zu erklären, zu was Sie verlinken. –

2

So einfach wie:

from sklearn.model_selection import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X, y, 
               stratify=y, 
               test_size=0.25) 
Verwandte Themen