He leído las siguientes publicaciones para la validación cruzada anidada y todavía no estoy 100% seguro de lo que debo hacer con la selección del modelo con validación cruzada anidada:
- Validación cruzada anidada para la selección del modelo
- Selección de modelo y validación cruzada: la forma correcta
Para explicar mi confusión, permítame tratar de recorrer paso a paso la selección del modelo con el método de validación cruzada anidado.
- Cree un bucle CV externo con K-Fold. Esto se usará para estimar el rendimiento de los hiperparámetros que "ganaron" cada bucle CV interno.
- Use GridSearchCV para crear un bucle CV interno donde, en cada bucle interno, GSCV revise todas las combinaciones posibles del espacio de parámetros y obtenga el mejor conjunto de parámetros.
- Después de que GSCV encontró los mejores parámetros en el bucle interno, se prueba con el conjunto de prueba en el bucle externo para obtener una estimación del rendimiento.
- El bucle externo luego se actualiza al siguiente pliegue como conjunto de prueba y el resto como conjunto de entrenamiento, y 1-3 repeticiones. Los parámetros "ganadores" totales posibles son el número de pliegues designados en el bucle externo. Entonces, si el bucle externo es de 5 pliegues, tendrá una estimación del rendimiento de un algoritmo con 5 conjuntos diferentes de hiperparámetros, NO el rendimiento de un conjunto particular de hiperparámetros.
Este enfoque se ilustra en la página de ejemplo de SKLearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
Pregunta: Después de 4. , ¿cómo determina qué hiperparámetros funcionaron mejor? Entiendo que desea entrenar su algoritmo (por ejemplo, Regresión logística, Bosque aleatorio, etc.) con el conjunto de datos COMPLETO al final. Pero, ¿cómo determina qué hiperparámetros funcionaron mejor en su validación cruzada anidada? Entiendo que para cada bucle interno, ganará un conjunto diferente de hiperparámetros. Y para el bucle externo, está obteniendo una estimación de su rendimiento de GridSearchCV, pero no está obteniendo ningún conjunto particular de hiperparámetros. Entonces, en la creación del modelo final, ¿cómo sabes qué hiperparámetros usar? Esa es la lógica faltante que tengo problemas para entender de otras bandas.
Gracias de antemano por cualquier consejo, especialmente si @Dikran Marsupial y @cbeleites pueden intervenir.
Editar: si puede, en su respuesta utilice términos como "algoritmo" e "hiperparámetros". Creo que una fuente de confusión para mí es cuando las personas usan el término "modelo" o "selección de modelo". Me confundo si están hablando de seleccionar qué algoritmo usar o qué hiperparámetros usar.
Edición 2: he creado un cuaderno que muestra dos formas de hacer una validación cruzada anidada. La primera forma es la que se muestra en el ejemplo SKLearn, y otra forma más larga es la que escribí. La forma que se muestra en SKLearn no expone los hiperparámetros "ganadores", pero mi forma más larga sí. Pero la pregunta sigue siendo la misma. Después de completar la validación cruzada anidada, incluso con los hiperparámetros expuestos, ¿qué hago ahora? Como puede ver en los hiperparámetros al final del cuaderno, varían bastante.
fuente
Respuestas:
(Estoy seguro de que ya escribí la mayor parte de esto en alguna respuesta, pero no puedo encontrarlo en este momento. Si alguien se topa con esa respuesta, por favor enlácela). Veo 2 enfoques ligeramente diferentes aquí, que creo que son sensatos.
Pero primero algo de terminología:
Supongo que la diferencia entre ellos está relacionada con la diferencia entre alguien que desarrolla nuevos algoritmos de entrenamiento que generalmente describen una clase de algoritmos de entrenamiento junto con algunos parámetros de dirección (los hiperparámetros) que son difíciles / imposibles de corregir (o al menos corregir cómo deberían decidirse / estimarse) sin el conocimiento de la aplicación / dominio.
Enfoque 1: requieren resultados de optimización estables
Con este enfoque, el "entrenamiento del modelo" es la adaptación de los parámetros del modelo "normal", y se proporcionan hiperparámetros . Una validación cruzada interna, por ejemplo, se encarga de la optimización del hiperparámetro.
El paso / supuesto crucial aquí para resolver el dilema de qué conjunto de hiperparámetros debe elegirse es requerir que la optimización sea estable . La validación cruzada para fines de validación supone que todos los modelos sustitutos son lo suficientemente similares al modelo final (obtenido por el mismo algoritmo de entrenamiento aplicado a todo el conjunto de datos) para permitir tratarlos como iguales (entre ellos, así como al modelo final). Si esta suposición se rompe y
los modelos sustitutos siguen siendo iguales (o equivalentes) entre sí, pero no con el modelo final, estamos hablando del conocido sesgo pesimista de la validación cruzada.
Si también el modelo sustituto no es igual / equivalente entre sí, tenemos problemas de inestabilidad .
Para los resultados de optimización del bucle interno, esto significa que si la optimización es estable, no hay conflicto al elegir hiperparámetros . Y si se observa una variación considerable en los resultados de validación cruzada interna, la optimización no es estable . Las situaciones de entrenamiento inestables tienen problemas mucho peores que la decisión de cuál de los parámetros de hiperparámetros elegir, y realmente recomendaría retroceder en ese caso y comenzar el proceso de modelado nuevamente.
Sin embargo, aquí hay una excepción: puede haber varios mínimos locales en la optimización que produzcan el mismo rendimiento para fines prácticos. Exigir también la opción entre ellos de ser estable puede ser un requisito innecesario, pero no sé cómo salir de este dilema.
Tenga en cuenta que si no todos los modelos producen el mismo conjunto de parámetros ganadores, no debe usar estimaciones de bucle externo como error de generalización aquí:
Enfoque 2: tratar el ajuste de hiperparámetros como parte del entrenamiento modelo
Este enfoque une las perspectivas del "desarrollador del algoritmo de entrenamiento" y el usuario aplicado del algoritmo de entrenamiento.
El desarrollador del algoritmo de entrenamiento proporciona un algoritmo de entrenamiento "desnudo"
model = train_naked (trainingdata, hyperparameters)
. Como el usuario aplicado necesitatunedmodel = train_tuned (trainingdata)
que también se encarga de arreglar los hiperparámetros.train_tuned
se puede implementar, por ejemplo, envolviendo un optimizador basado en validación cruzada alrededor del algoritmo de entrenamiento simpletrain_naked
.train_tuned
entonces puede usarse como cualquier otro algoritmo de entrenamiento que no requiera la entrada de hiperparámetros, por ejemplo, su salidatunedmodel
puede estar sujeta a validación cruzada. Ahora se verifica la estabilidad de los hiperparámetros al igual que se debe verificar la estabilidad de los parámetros "normales" como parte de la evaluación de la validación cruzada.Esto es realmente lo que hace y evalúa en la validación cruzada anidada si promedia el rendimiento de todos los modelos ganadores, independientemente de sus conjuntos de parámetros individuales.
¿Cual es la diferencia?
Posiblemente terminemos con diferentes modelos finales que adopten esos 2 enfoques:
train_naked (all data, hyperparameters from optimization)
train_tuned (all data)
y, ya que eso ejecuta la optimización de hiperparámetros nuevamente en el conjunto de datos más grande, esto puede terminar con un conjunto diferente de hiperparámetros.Pero de nuevo se aplica la misma lógica: si encontramos que el modelo final tiene parámetros sustancialmente diferentes de los modelos sustitutos de validación cruzada, ese es un síntoma de la suposición 1 violada. Entonces, en mi humilde opinión, nuevamente no tenemos un conflicto, sino más bien una verificación de si nuestras suposiciones (implícitas) están justificadas. Y si no lo son, de todos modos no deberíamos apostar demasiado por tener una buena estimación del rendimiento de ese modelo final.
Tengo la impresión (también de ver la cantidad de preguntas / confusiones similares aquí en CV) que muchas personas piensan en la validación cruzada anidada haciendo el enfoque 1. Pero el error de generalización generalmente se estima de acuerdo con el enfoque 2, por lo que ese es el camino a seguir para el modelo final también.
Ejemplo de Iris
Resumen: La optimización es básicamente inútil. El tamaño de muestra disponible no permite distinciones entre el rendimiento de ninguno de los conjuntos de parámetros aquí.
Sin embargo, desde el punto de vista de la aplicación, la conclusión es que no importa cuál de los 4 conjuntos de parámetros elija, lo cual no es una mala noticia: encontró una meseta de parámetros relativamente estable. Aquí viene la ventaja de la validación anidada adecuada del modelo ajustado: si bien no puede afirmar que es el modelo óptimo, todavía puede afirmar que el modelo construido sobre todos los datos utilizando el enfoque 2 tendrá aproximadamente 97% de precisión (intervalo de confianza del 95% para 145 correctos de 150 casos de prueba: 92 - 99%)
Tenga en cuenta que también el enfoque 1 no está tan lejos como parece: vea a continuación: su optimización accidentalmente perdió un "ganador" comparativamente claro debido a los lazos (ese es otro síntoma muy revelador del problema del tamaño de la muestra).
Si bien no soy lo suficientemente profundo en SVM como para "ver" que C = 1 debería ser una buena opción aquí, optaría por el núcleo lineal más restrictivo. Además, como hizo la optimización, no hay nada de malo en elegir el conjunto de parámetros ganador, incluso si es consciente de que todos los conjuntos de parámetros conducen a un rendimiento prácticamente igual.
Sin embargo, en el futuro, considere si su experiencia arroja estimaciones aproximadas de qué rendimiento puede esperar y aproximadamente qué modelo sería una buena opción. Luego, cree ese modelo (con hiperparámetros fijados manualmente) y calcule un intervalo de confianza para su rendimiento. Use esto para decidir si intentar optimizar es razonable. (Debo agregar que estoy trabajando principalmente con datos en los que obtener 10 casos independientes más no es fácil; si está en un campo con grandes tamaños de muestra independientes, las cosas se ven mucho mejor para usted)
Versión larga:
En cuanto a los resultados del ejemplo en el
iris
conjunto de datos.iris
tiene 150 casos, se considera SVM con una cuadrícula de 2 x 2 parámetros (2 núcleos, 2 órdenes de magnitud para la penalizaciónC
).El bucle interno tiene divisiones de 129 (2x) y 132 (6x) casos. El "mejor" conjunto de parámetros está indeciso entre el núcleo lineal o rbf, ambos con C = 1. Sin embargo, las precisiones internas de la prueba son todas (incluida la pérdida constante de C = 10) dentro del 94 - 98.5% de precisión observada. La mayor diferencia que tenemos en una de las divisiones es 3 vs. 8 errores para rbf con C = 1 vs. 10.
No hay forma de que esto sea una diferencia significativa. No sé cómo extraer las predicciones para los casos individuales en el CV, pero incluso suponiendo que se compartieron los 3 errores, y el modelo C = 10 cometió 5 errores adicionales:
Recuerde que hay 6 comparaciones por pares en la cuadrícula de 2 x 2, por lo que también tendremos que corregir las comparaciones múltiples.
Enfoque 1
En 3 de las 4 divisiones externas donde rbf "ganó" sobre el núcleo lineal, en realidad tenían la misma precisión estimada (supongo que min en caso de empate devuelve el primer índice adecuado).
Cambiar la grilla a
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
rendimientosEnfoque 2:
Aquí
clf
está tu modelo final. Conrandom_state = 2
, rbf con C = 1 gana:(sucede aproximadamente 1 de cada 5 veces, 1 de cada 6 veces
linear
yrbf
conC = 1
empate en el rango 1)fuente
He leído su pregunta y la respuesta anterior 2 veces (primera vez hace 3 meses). Estoy interesado y también quiero encontrar la manera absolutamente apropiada de hacer una validación cruzada de mis datos. Después de mucho pensar y leer, parece que encuentro los agujeros y aquí está mi solución:
Razonamiento:
fuente
Digamos que hizo todo lo anterior sin haber dividido sus datos en la prueba de tren porque tiene un pequeño conjunto de datos, ¿cómo estima el error de generalización del clasificador que acaba de crear? ¿Puedes usar el mejor error que encontraste en la validación cruzada en el paso 2?
No , el primer gran problema está en el paso 1, donde utiliza todos los datos para seleccionar las funciones que se utilizarán. Por lo tanto, incluso cuando realice la validación cruzada en el paso 2, las características ya habrán visto y recordarán cierta información presente en el pliegue de prueba en cada ejecución de validación cruzada. El resultado será una estimación demasiado optimista del error de prueba y esto se llamasesgo de selección de características . Para tener esto en cuenta en su estimación, necesitaría colocar el paso de selección de características dentro del ciclo de validación cruzada del paso 2.
Bien, ¿ahora estamos bien? ¿Es el mejor error encontrado en la validación cruzada con el paso de selección de características dentro del bucle una estimación justa del error de generalización?
En teoría, la respuesta sigue siendo no , el problema es que sus hiperparámetros se han elegido para minimizar el error de validación cruzada en el conjunto de datos específico a su disposición, por lo que, en cierto sentido, está ajustando los hiperparámetros a sus datos con el riesgo de sobre-ajustarlos, y esto se llama sesgo de selección de modelo. Pero, ¿es esto una preocupación en la práctica? Depende de la aplicación específica: es probable que se vuelva más severo, como un ajuste excesivo en el entrenamiento, cuando el conjunto de datos es pequeño y el número de hiperparámetros a ajustar es relativamente grande. Para tener esto en cuenta al estimar el error de generalización, aplicaría una validación cruzada anidada como la describió, que luego le daría una estimación correcta de su error de generalización.
Finalmente, para responder a su última pregunta, después de tener una estimación justa de su error de generalización de "procedimiento de construcción de modelos" con una validación cruzada anidada, simplemente aplicaría el procedimiento (paso 1 + 2) a todo su conjunto de datos obteniendo un modelo con un conjunto fijo de características y establecer valores de hiperparámetros, pero teniendo en cuenta que el error que esperamos que tenga este modelo en datos no vistos es la estimación de validación cruzada anidada .
fuente