2016-01-11 15 views
14

Sembra che KFold generi gli stessi valori ogni volta che viene ripetuto l'oggetto, mentre Shuffle Split genera indici diversi ogni volta. È corretto? Se sì, quali sono gli usi per uno rispetto all'altro?Qual è la differenza tra KFold e ShuffleSplit CV?

cv = cross_validation.KFold(10, n_folds=2,shuffle=True,random_state=None) 
cv2 = cross_validation.ShuffleSplit(10,n_iter=2,test_size=0.5) 
print(list(iter(cv))) 
print(list(iter(cv))) 
print(list(iter(cv2))) 
print(list(iter(cv2))) 

produce il seguente output:

[(array([1, 3, 5, 8, 9]), array([0, 2, 4, 6, 7])), (array([0, 2, 4, 6, 7]), array([1, 3, 5, 8, 9]))]          
[(array([1, 3, 5, 8, 9]), array([0, 2, 4, 6, 7])), (array([0, 2, 4, 6, 7]), array([1, 3, 5, 8, 9]))]          
[(array([4, 6, 3, 2, 7]), array([8, 1, 9, 0, 5])), (array([3, 6, 7, 0, 5]), array([9, 1, 8, 4, 2]))]          
[(array([3, 0, 2, 1, 7]), array([5, 6, 9, 4, 8])), (array([0, 7, 1, 3, 8]), array([6, 2, 5, 4, 9]))]  

risposta

16

Differenza di KFold e ShuffleSplit uscita

KFold sarà dividere il set di dati in serie pre-specificato di pieghe, ed ogni campione deve essere in una e una sola piega. Una piega è un sottoinsieme del tuo set di dati.

ShuffleSplit campionerà in modo casuale l'intero set di dati durante ogni iterazione per generare un set di allenamento e un set di test. I parametri test_size e train_size controllano quanto deve essere grande il test e il set di test di allenamento per ogni iterazione. Poiché si campiona dall'intero dataset durante ogni iterazione, i valori selezionati durante una iterazione potrebbero essere nuovamente selezionati durante un'altra iterazione.

Riepilogo: ShuffleSplit funziona in modo iterativo, KFold divide semplicemente il set di dati in k fold.

differenza quando si fa la validazione

In KFold, durante ogni round verrà utilizzato un solo gregge come l'insieme di test e tutti i restanti pieghe come vostro training set. Tuttavia, in ShuffleSplit, durante ogni round n si dovrebbe solo utilizzare la formazione e il set di prova dall'iterazione n. Man mano che il set di dati cresce, aumenta il tempo di convalida incrociata, rendendo le shuffleplits un'alternativa più attraente. Se riesci ad allenare il tuo algoritmo, con una certa percentuale dei tuoi dati invece di usare tutte le pieghe k-1, ShuffleSplit è un'opzione interessante.

+0

Ottima risposta, grazie! Ora sembra che quando crei un nuovo generatore KFold e lo shuffle sia vero, produrrà un output diverso, ma non quando chiami il generatore più volte. Perché è così? – rb612

+1

Hai appena deciso di fare una nuova domanda per il tuo commento per evitare che questo diventi troppo lungo. [È qui] (http://stackoverflow.com/questions/34940465/why-does-calling-the-kfold-generator-with-shuffle-give-the-same-indices/34940524#34940524). Spero che sia d'aiuto! – imp9