¿Cuál es una estrategia adecuada para dividir el conjunto de datos?
Pido retroalimentación en el enfoque siguiente (no en los parámetros individuales tales como test_size
o n_iter
, pero si utilicé X
, y
, X_train
, y_train
, X_test
, y y_test
de manera adecuada y si la secuencia tiene sentido):
(ampliando este ejemplo de la documentación de scikit-learn)
1. Cargue el conjunto de datos
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Dividir en entrenamiento y conjunto de 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. Elija estimador
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Elija 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. Ajuste 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 al azar en un entrenamiento y un conjunto de pruebas 10 veces ( n_iter=10
). Cada punto de la curva de formación de puntuación es la media de 10 puntuaciones donde el modelo fue entrenado y evaluado en las primeras i ejemplos de entrenamiento. Cada punto de la curva de puntuación de validación cruzada es la media de 10 puntuaciones donde el modelo fue entrenado en los primeros i ejemplos de entrenamiento y se evaluó en todos los ejemplos de la prueba.
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 () se puede encontrar en la versión de desarrollo actual de scikit-learn (0.15-git).
7. Evaluación final del conjunto de prueba.
classifier.score(X_test, y_test)
7a. Pruebe el sobreajuste en la selección del modelo 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 reemplazar el paso 7 por validación cruzada anidada? O se debe ver el cv anidado como complementario del paso 7
(el código parece funcionar con la validación cruzada k-fold en scikit-learn, pero no con shuffle & split. Por lo tanto cv
, debe cambiarse anteriormente para que el código funcione)
8. Entrene el modelo final en todo el conjunto de datos
classifier.fit(X, y)
EDITAR: ahora estoy de acuerdo con cbeleites en que el paso 7a no tiene mucho sentido en esta secuencia. Entonces no adoptaría eso.