Qual è una strategia appropriata per suddividere il set di dati?
Chiedo feedback sul seguente approccio (non sui singoli parametri come test_size
o n_iter
, ma se usato X
, y
, X_train
, y_train
, X_test
, e y_test
in modo appropriato e se la sequenza senso):
(estendendo questo esempio dalla documentazione di scikit-learn)
1. Caricare il set di dati
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Suddividere in training e set di test (ad es. 80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. Scegli lo stimatore
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Scegli iteratore di convalida incrociata
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. Sintonizzare gli iperparametri
applicare l'iteratore di convalida incrociata sul set di addestramento
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6. Algoritmo di debug con curva di apprendimento
X_train
viene diviso casualmente in un allenamento e un set di test 10 volte ( n_iter=10
). Ogni punto della curva di formazione-score è la media di 10 punteggi in cui il modello è stato addestrato e valutato sui primi i esempi di addestramento. Ogni punto sulla curva del punteggio di convalida incrociata è la media di 10 punteggi in cui il modello è stato addestrato sui primi esempi di allenamento i e valutato su tutti gli esempi del set di test.
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve () può essere trovato nell'attuale versione di sviluppo di scikit-learn (0.15-git).
7. Valutazione finale sul set di test
classifier.score(X_test, y_test)
7a. Test di over-fitting nella selezione del modello con validazione incrociata nidificata (utilizzando l'intero set di dati)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
Domanda aggiuntiva: ha senso sostituire il passaggio 7 con la convalida incrociata nidificata? O dovrebbe essere nidificato cv come complementare al passaggio 7
(il codice sembra funzionare con la convalida incrociata di k-fold in scikit-learn, ma non con shuffle e split. Quindi cv
deve essere modificato sopra per far funzionare il codice)
8. Addestra il modello finale sull'intero set di dati
classifier.fit(X, y)
EDIT: ora sono d'accordo con cbeleites che il passaggio 7a non ha molto senso in questa sequenza. Quindi non lo adotterò.