Qual é a estratégia apropriada para dividir o conjunto de dados?
I pedir feedback sobre a abordagem seguinte (não sobre os parâmetros individuais como test_size
ou n_iter
, mas se eu usasse X
, y
, X_train
, y_train
, X_test
, e y_test
de forma adequada e se a sequência faz sentido):
(estendendo este exemplo da documentação do scikit-learn)
1. Carregue o conjunto de dados
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Divida o conjunto de treinamento e teste (por exemplo, 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. Escolha um estimador
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Escolha o iterador de validação cruzada
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. Ajuste os hiperparâmetros
aplicando o iterador de validação cruzada no conjunto de treinamento
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 de depuração com curva de aprendizado
X_train
é dividido aleatoriamente em um treinamento e um conjunto de testes 10 vezes ( n_iter=10
). Cada ponto na curva de treinamento de pontuação é a média de 10 pontos, onde o modelo foi treinados e avaliados no primeiro i exemplos de treinamento. Cada ponto na curva pontuação validação cruzada é a média de 10 pontos, onde o modelo foi treinado nos primeiros i exemplos de treinamento e avaliados em todos os exemplos do conjunto de teste.
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 () pode ser encontrado na versão atual do desenvolvedor do scikit-learn (0.15-git).
7. Avaliação final no conjunto de testes
classifier.score(X_test, y_test)
7a Teste de ajuste excessivo na seleção de modelos com validação cruzada aninhada (usando todo o conjunto de dados)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
Pergunta adicional: faz sentido substituir a etapa 7 pela validação cruzada aninhada? Ou a cv aninhada deve ser vista como complementar à etapa 7
(o código parece funcionar com a validação cruzada k-fold no scikit-learn, mas não com o shuffle & split. Portanto, cv
precisa ser alterado acima para que o código funcione)
8. Treine o modelo final em todo o conjunto de dados
classifier.fit(X, y)
Edição: Agora eu concordo com cbeleites que o passo 7a não faz muito sentido nesta sequência. Então eu não adotaria isso.