2015-03-16 10 views
8

Ho un problema di classificazione a più classi e il mio set di dati è distorto, ho 100 istanze di una particolare classe e dico 10 di una classe diversa, quindi voglio dividere il mio set di dati mantenendo il rapporto tra classi, se ho 100 istanze di un particolare classe e voglio il 30% dei record per andare nel set di allenamento Voglio avere lì 30 istanze della mia classe rappresentata da 100 record e 3 istanze della mia 10 classe rappresentata da record e così via.come dividere un set di dati in allenamento e rapporto di mantenimento del set di validazione tra le classi?

risposta

8

È possibile utilizzare di sklearn StratifiedKFold, dalla documentazione on-line:

stratificato K-Folds convalida incrociata iteratore

Fornisce treno/test indici di dividere i dati in set di test dei treni.

Questo oggetto di convalida incrociata è una variante di KFold che restituisce pieghe stratificate. Le pieghe sono realizzate mantenendo la percentuale di campioni per ogni classe.

>>> 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] 

Ciò manterrà i vostri rapporti di classe in modo che le spaccature mantengono i rapporti di classe, questo funzionerà bene con panda DFS.

Come suggerito da @Ali_m si potrebbe usare StratifiedShuffledSplit che accetta un rapporto di divisione param:

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

produrrebbe una scissione del 70%.

+0

come faccio diviso 70/30 con la tecnica kFold? – JackNova

+1

potresti usare ['StratifiedShuffleSplit'] (http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.StratifiedShuffleSplit.html#sklearn.cross_validation.StratifiedShuffleSplit) per la divisione senza numero intero –

+0

@EdChum fa questo lavoro anche per il problema di classificazione delle serie temporali multi-classe? – tilaprimera

-1

You can simply use the following:

Ma fare in modo che si reimposta stratificare da Nessuno alle etichette di classe:

"stratificare: array simile o Nessuno (di default è None) caso contrario No, i dati è diviso in un moda stratificata, usando questo come etichette di classe. "

+0

Aggiungere un esempio contestuale minimale (come usarlo) renderebbe questa risposta migliore . Cerca anche di evitare il collegamento esternamente, senza spiegare in modo sufficientemente dettagliato, a cosa stai collegando. –

2

Semplice come:

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) 
Problemi correlati