¿Cuál es la estrategia adecuada para dividir el conjunto de datos?
Pido opiniones sobre el siguiente enfoque (no en los parámetros individuales como test_size
o n_iter
, pero si usara X
, y
, X_train
, y_train
, X_test
y y_test
adecuadamente y si la secuencia tiene sentido):
(ampliando este ejemplo de la documentación de scikit-learn)
1. Cargar el conjunto de datos
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Dividir en conjunto de entrenamiento y prueba (por ejemplo, 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. Elegir el estimador
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Elegir el iterador de validación cruzada
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. Afinar los hiperparámetros
aplicando el iterador de validación cruzada en el conjunto de entrenamiento
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 depuración con curva de aprendizaje
X_train
se divide aleatoriamente en un conjunto de entrenamiento y otro de prueba 10 veces ( n_iter=10
). Cada punto de la curva de puntuaciones de entrenamiento es la media de 10 puntuaciones en las que el modelo fue entrenado y evaluado en la primera i ejemplos de formación. Cada punto de la curva de puntuación de validación cruzada es la media de 10 puntuaciones en las que el modelo fue entrenado en el primer i ejemplos de entrenamiento y evaluados en todos los ejemplos del conjunto de pruebas.
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()
trazar_curva_de_aprendizaje() se puede encontrar en la versión actual de scikit-learn (0.15-git).
7. Evaluación final en el conjunto de pruebas
classifier.score(X_test, y_test)
7a. Prueba de sobreajuste en la selección de modelos con validación cruzada anidada (utilizando todo el conjunto de datos)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
Pregunta adicional: ¿Tiene sentido sustituir el paso 7 por una validación cruzada anidada? ¿O debería considerarse la cv anidada como un complemento del paso 7
(el código parece funcionar con la validación cruzada k-fold en scikit-learn, pero no con shuffle & split. Así que cv
debe cambiarse arriba para que el código funcione)
8. Entrenar el modelo final en todo el conjunto de datos
classifier.fit(X, y)
EDIT: Ahora estoy de acuerdo con cbeleites en que el paso 7a no tiene mucho sentido en esta secuencia. Así que yo no lo adoptaría.