¿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.
Respuestas:
No estoy seguro de lo que quieres hacer en el paso 7a. Según tengo entendido ahora, no tiene sentido para mí.
Así es como entiendo su descripción: en el paso 7, desea comparar el rendimiento de espera con los resultados de una validación cruzada que abarca los pasos 4 - 6. (entonces sí, eso sería una configuración anidada).
Los puntos principales por los que no creo que esta comparación tenga mucho sentido son:
Esta comparación no puede detectar dos de las principales fuentes de resultados de validación demasiado optimista que encuentro en la práctica:
fugas de datos (dependencia) entre los datos de entrenamiento y prueba que es causada por una estructura de datos jerárquica (también conocida como agrupada) y que no se tiene en cuenta en la división. En mi campo, típicamente tenemos múltiples (a veces miles) de lecturas (= filas en la matriz de datos) del mismo paciente o réplica biológica de un experimento. Estos no son independientes, por lo que la división de validación debe hacerse a nivel del paciente. Sin embargo, se produce una fuga de datos de este tipo, la tendrá tanto en la división para el conjunto de espera como en la división de validación cruzada. Hold-out wold entonces será tan optimistamente sesgado como la validación cruzada.
El preprocesamiento de los datos realizado en toda la matriz de datos, donde los cálculos no son independientes para cada fila, pero muchas / todas las filas se utilizan para calcular los parámetros para el preprocesamiento. Ejemplos típicos serían, por ejemplo, una proyección PCA antes de la clasificación "real".
Una vez más, eso afectaría tanto su resistencia como la validación cruzada externa, por lo que no puede detectarlo.
Para los datos con los que trabajo, ¡ambos errores pueden hacer que la fracción de clasificaciones erróneas se subestime fácilmente en un orden de magnitud!
Si está restringido a esta fracción contada del tipo de rendimiento de los casos de prueba, las comparaciones de modelos necesitan un número extremadamente grande de casos de prueba o diferencias ridículamente grandes en el rendimiento real. Comparar 2 clasificadores con datos de entrenamiento ilimitados puede ser un buen comienzo para leer más.
Sin embargo, la comparación de la calidad del modelo que afirma la validación cruzada interna para el modelo "óptimo" y la validación cruzada externa o la validación prolongada tiene sentido: si la discrepancia es alta, es cuestionable si su optimización de búsqueda en la cuadrícula funcionó (es posible que tenga variación desnatada debido a la alta variación de la medida de rendimiento). Esta comparación es más fácil porque puede detectar problemas si la estimación interna es ridículamente buena en comparación con la otra; si no es así, no necesita preocuparse demasiado por su optimización. Pero, en cualquier caso, si su medición externa (7) del rendimiento es honesta y sólida, al menos tiene una estimación útil del modelo obtenido, ya sea óptimo o no.
En mi humilde opinión, medir la curva de aprendizaje es un problema diferente. Probablemente me ocuparía de eso por separado, y creo que necesita definir más claramente para qué necesita la curva de aprendizaje (¿necesita la curva de aprendizaje para un conjunto de datos del problema, los datos y el método de clasificación dados o la curva de aprendizaje para este conjunto de datos del problema, los datos y el método de clasificación dados, y un montón de decisiones adicionales (por ejemplo, ¿cómo lidiar con la complejidad del modelo en función del tamaño de la muestra de entrenamiento? Optimizar de nuevo, usar hiperparámetros fijos, decidir función para arreglar hiperparámetros dependiendo del tamaño del conjunto de entrenamiento?)
(Mis datos generalmente tienen muy pocos casos independientes para obtener la medida de la curva de aprendizaje lo suficientemente precisa como para usarla en la práctica, pero puede ser mejor si sus 1200 filas son realmente independientes)
actualización: ¿Qué está "mal" con el ejemplo de scikit-learn?
En primer lugar, aquí no hay nada malo con la validación cruzada anidada. La validación anidada es de suma importancia para la optimización basada en datos, y la validación cruzada es un enfoque muy poderoso (particularmente si se repite / repite).
Entonces, si algo está mal depende de su punto de vista: siempre que realice una validación anidada honesta (manteniendo los datos de prueba externos estrictamente independientes), la validación externa es una medida adecuada del rendimiento del modelo "óptimo". Nada de malo con eso.
Pero varias cosas pueden salir mal con la búsqueda en cuadrícula de estas medidas de rendimiento de tipo proporcional para el ajuste de hiperparámetros de SVM. Básicamente significan que usted (¿probablemente?) No puede confiar en la optimización. Sin embargo, siempre y cuando su división externa se haya realizado correctamente, incluso si el modelo no es el mejor posible, tiene una estimación honesta del rendimiento del modelo que obtuvo.
Trataré de dar explicaciones intuitivas de por qué la optimización puede estar en problemas:
Necesita una cantidad ridículamente enorme de casos (al menos en comparación con la cantidad de casos que generalmente puedo tener) para lograr la precisión necesaria (sentido de sesgo / varianza) para estimar el recuerdo, la precisión (sentido del rendimiento del aprendizaje automático). Por supuesto, esto también se aplica a las proporciones que calcula a partir de tales proporciones. Eche un vistazo a los intervalos de confianza para las proporciones binomiales. ¡Son sorprendentemente grandes! A menudo es más grande que la verdadera mejora en el rendimiento sobre la cuadrícula de hiperparámetros. Y estadísticamente hablando, la búsqueda en la cuadrícula es un problema de comparación múltiple masivo: cuantos más puntos de la cuadrícula evalúe, mayor será el riesgo de encontrar alguna combinación de hiperparámetros que accidentalmente se vea muy bien para la división de tren / prueba que está evaluando. Esto es lo que quiero decir con la variación de descremado.
Intuitivamente, considere un cambio hipotético de un hiperparámetro, que lentamente hace que el modelo se deteriore: un caso de prueba se mueve hacia el límite de decisión. Las medidas de rendimiento de la proporción "dura" no detectan esto hasta que el caso cruza la frontera y está en el lado equivocado. Luego, sin embargo, inmediatamente asignan un error completo para un cambio infinitamente pequeño en el hiperparámetro.
Para hacer una optimización numérica, necesita que la medida de rendimiento se comporte bien. Eso significa: ni la parte de salto (no continuamente diferenciable) de la medida de rendimiento de tipo proporcional ni el hecho de que, aparte de ese salto, los cambios que realmente ocurren no se detectan son adecuados para la optimización.
Las reglas de puntuación adecuadas se definen de una manera particularmente adecuada para la optimización. Tienen su máximo global cuando las probabilidades predichas coinciden con las verdaderas probabilidades de que cada caso pertenezca a la clase en cuestión.
Para los SVM tiene el problema adicional de que no solo las medidas de rendimiento sino también el modelo reaccionan de esta manera nerviosa: los pequeños cambios del hiperparámetro no cambiarán nada. El modelo cambia solo cuando los hiperparámetros son cambios suficientes como para que algún caso deje de ser un vector de soporte o se convierta en un vector de soporte. Una vez más, estos modelos son difíciles de optimizar.
Literatura:
Gneiting, T. y Raftery, AE: Reglas de puntuación, predicción y estimación estrictamente adecuadas, Journal of the American Statistical Association, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Quimiometría para el reconocimiento de patrones, Wiley, (2009).
señala el comportamiento nervioso de la SVM como función de los hiperparámetros.
Actualización II: variación de descremado
lo que puede pagar en términos de comparación de modelos obviamente depende del número de casos independientes. Hagamos una simulación rápida y sucia sobre el riesgo de variación de descremado aquí:
scikit.learn
dice que tienen 1797 están en losdigits
datos.es decir, todos los modelos tienen el mismo rendimiento real de, digamos, 97% (rendimiento típico para el
digits
conjunto de datos).digits
Aquí está la distribución para el mejor rendimiento observado:
La línea roja marca el verdadero rendimiento de todos nuestros modelos hipotéticos. En promedio, observamos solo 2/3 de la tasa de error real para el aparentemente mejor de los 100 modelos comparados (para la simulación sabemos que todos funcionan igualmente con 97% de predicciones correctas).
Obviamente, esta simulación está muy simplificada:
Sin embargo, en general, tanto el bajo número de casos de prueba independientes como el alto número de modelos comparados aumentan el sesgo. Además, el artículo de Cawley y Talbot ofrece un comportamiento empírico observado.
fuente