¿Cómo dividir el conjunto de datos para la validación cruzada, la curva de aprendizaje y la evaluación final?

70

¿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_sizeo n_iter, pero si utilicé X, y, X_train, y_train, X_test, y y_testde 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_trainse 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()

Curva de aprendizaje

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.

tobip
fuente
¿Qué regla de puntuación de precisión estás usando? Si se trata de la precisión de la clasificación, una regla de puntaje inadecuada deshacerá gran parte del trabajo al que se ha ido.
Frank Harrell
Usé el valor predeterminado, que de hecho es la precisión de clasificación. Sé que, por ejemplo, F1 sería más apropiado. Pero aquí solo estoy interesado si las divisiones se usan bien.
tobip
3
Estoy casi seguro de que F1 es un nuevo nombre para un concepto antiguo. Creo que es contraproducente inventar nuevos nombres para cosas viejas. Más importante aún, es una regla de puntuación inadecuada que dará como resultado la selección de las características incorrectas, además de agregar una gran cantidad de ruido en todo el proceso.
Frank Harrell
3
... en cualquier caso, F1 comparte los problemas de precisión a los que @FrankHarrell alude: estos se derivan de contar fracciones de casos de prueba de clasificaciones difíciles. Para obtener una de las reglas de puntuación adecuadas de Frank, deberá cambiar a la salida probabilística de la SVM y, por ejemplo, usar la puntuación de Brier (error cuadrático medio) en lugar de la precisión. Supongo que también podría derivar una versión de F1 de tipo MSE. Tales medidas deberían ser mejores para el paso de ajuste. Para comunicar el rendimiento final, también puede necesitar las formas típicas (por ejemplo, precisión, F1) de expresar el rendimiento para su comunidad.
Cbeleites 01 de
1
@ ta.ft: si el enfoque es incorrecto o no, depende de lo que usted considere incorrecto: la búsqueda de la cuadrícula en proporciones tiene un grave riesgo de descremar la variación a menos que tenga un número ridículamente grande de casos independientes. Entonces, para muchas situaciones, la afirmación de que la búsqueda en la cuadrícula produce el modelo óptimo es incorrecta. Sin embargo, si realiza una validación anidada adecuada, la validación externa proporciona una medida honesta del rendimiento del modelo "óptimo" elegido. Entonces eso no está mal. Simplemente no tiene garantía de que la búsqueda de cuadrícula haya obtenido el modelo óptimo. En cuanto a la literatura, actualizaré mi respuesta.
Cbeleites 05 de

Respuestas:

41

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:

  • p^np
    Var(p^)=p(1p)n

    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:


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.learndice que tienen 1797 están en los digitsdatos.

  • 10×10
  • suponga que ambos parámetros (rangos) no afectan a los modelos en absoluto,
  • es decir, todos los modelos tienen el mismo rendimiento real de, digamos, 97% (rendimiento típico para el digitsconjunto de datos).

  • 104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")

Aquí está la distribución para el mejor rendimiento observado:

simulación de varianza de descremado

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:

  • Además de la variación del tamaño de la muestra de prueba, existe al menos la variación debida a la inestabilidad del modelo, por lo que aquí estamos subestimando la variación.
  • Los parámetros de ajuste que afectan la complejidad del modelo generalmente cubrirán conjuntos de parámetros donde los modelos son inestables y, por lo tanto, tienen una gran variación.
  • Para los dígitos UCI del ejemplo, la base de datos original tiene ca. 11000 dígitos escritos por 44 personas. ¿Qué pasa si los datos se agrupan de acuerdo con la persona que escribió? (Es decir, ¿es más fácil reconocer un 8 escrito por alguien si sabe cómo esa persona escribe, digamos, un 3?) El tamaño efectivo de la muestra puede ser tan bajo como 44.
  • El ajuste de los hiperparámetros del modelo puede conducir a una correlación entre los modelos (de hecho, se consideraría que se comporta bien desde una perspectiva de optimización numérica). Es difícil predecir la influencia de eso (y sospecho que esto es imposible sin tener en cuenta el tipo real de clasificador).

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.

Cbeleites
fuente
@cbleites: Si la búsqueda de cuadrícula podría no ser un método apropiado para encontrar el modelo óptimo, ¿qué método debo elegir?
tobip
1
@ ta.ft: dos enfoques son a) incorporar la mayor cantidad de conocimiento externo sobre su aplicación y datos en el modelado para reducir drásticamente la cantidad de modelos que deben compararse (= decidir hiperparámetros en lugar de optimizar). En general, puede ser mejor cambiar a un clasificador que tenga hiperparámetros intrínsecamente significativos, es decir, donde puede saber por aplicación y tipo de datos cuál debería ser el hiperparámetro (aproximadamente). b) compare los pocos modelos restantes por la regla de puntuación adecuada. Por ejemplo, la puntuación de Briers tiene propiedades de varianza mucho mejores para muchos clasificadores.
cbeleites
1
También puede negarse a optimizar en absoluto (a través de las decisiones (a)). Si obtiene un clasificador lo suficientemente bueno y puede argumentar que no tiene oportunidad de demostrar la superioridad de otro clasificador dado el tamaño de muestra disponible (por ejemplo, haga algunos cálculos de demostración de McNemar, busque el tamaño de muestra necesario para comparar las proporciones de un clasificador hipotético mejor; hay una buena posibilidad de que estos sean ridículamente grandes incluso para mejoras hipotéticas ridículamente grandes), puede argumentar que la optimización no tiene ningún sentido y solo crea un riesgo de sobreajuste.
cbeleites
No estoy de acuerdo con usted en la "variación de descremado". Si tiene muchos puntos en la cuadrícula para la optimización de hiperparámetros, un punto puede tener suerte en un pliegue del CV; pero si tiene, digamos un CV de 10 veces, todavía es poco probable que un conjunto de parámetros tenga suerte accidentalmente en los 10 pliegues del CV.
ARN
1
@RNA: La probabilidad de ser "afortunado" en todos los pliegues está directamente relacionada con el número total de casos (en los 10 pliegues), y generalmente solo se considera el promedio de todos esos pliegues. Actualicé la respuesta con una simulación de una selección hipotética del mejor de 100 modelos (por ejemplo, 2 hiperparámetros con 10 pasos cada uno), que ya está asociado con un sesgo considerable para el escenario de ejemplo (tasa de error demasiado baja en 1/3) . Muchas personas aquí rara vez tienen unos pocos miles de casos independientes a mano, por ejemplo, rara vez tengo incluso las 44 personas que escribieron dígitos para el conjunto completo de datos de dígitos UCI.
cbeleites