30 votos

¿Cómo obtener hiperparámetros en la validación cruzada anidada?

He leído los siguientes posts para la validación cruzada anidada y todavía no estoy 100% seguro de lo que tengo que hacer con la selección del modelo con la validación cruzada anidada:

Para explicar mi confusión, voy a intentar explicar paso a paso el método de selección de modelos con validación cruzada anidada.

  1. Crear un bucle CV externo con K-Fold. Esto se utilizará para estimar el rendimiento de los hiperparámetros que "ganaron" cada bucle CV interno.
  2. Utilice GridSearchCV para crear un bucle interno de CV en el que, en cada bucle interno, GSCV recorra todas las combinaciones posibles del espacio de parámetros y obtenga el mejor conjunto de parámetros.
  3. Después de que GSCV encuentre los mejores parámetros en el bucle interno, se prueba con el conjunto de pruebas en el bucle externo para obtener una estimación del rendimiento.
  4. A continuación, el bucle externo actualiza el siguiente pliegue como conjunto de prueba y el resto como conjunto de entrenamiento, y se repiten 1-3. El total de posibles parámetros "ganadores" es el número de pliegues designados en el bucle externo. Así, si el bucle exterior tiene 5 pliegues, se obtendrá una estimación del rendimiento de un algoritmo con 5 juegos diferentes de hiperparámetros, NO el rendimiento de un conjunto concreto de hiperparámetros.

Este enfoque se ilustra en la página de ejemplos de SKLearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html

Pregunta: En 4. ¿Cómo se determina qué hiperparámetros funcionan mejor? Entiendo que quiere entrenar su algoritmo (por ejemplo, Regresión Logística, Bosque Aleatorio, etc.) con el conjunto de datos COMPLETO al final. Pero, ¿cómo determinar 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, se obtiene una estimación del rendimiento de GridSearchCV, pero no se obtiene un conjunto concreto de hiperparámetros. Entonces, en la creación del modelo final, ¿cómo sabes qué hiperparámetros utilizar? Esa es la falta de lógica que tengo problemas para entender de otras pisadas.

Gracias de antemano por cualquier consejo, ¡especialmente si @Dikran Marsupial y @cbeleites pueden aportar algo!

Edita: Si puede, utilice en su respuesta términos como "algoritmo" e "hiperparámetros". Creo que una fuente de confusión para mí es cuando la gente utiliza el término "modelo" o "selección de modelo". No sé si se refieren a la selección del algoritmo o de los hiperparámetros.

Edita 2: He creado un cuaderno que muestra dos formas de hacer validación cruzada anidada. La primera forma es la que se muestra en el ejemplo SKLearn, y otra forma más larga es uno que escribí. La forma mostrada en SKLearn no expone los hiperparámetros "ganadores", pero mi forma más larga sí. Pero la cuestión sigue siendo la misma. Después de haber completado la validación cruzada anidada, incluso con los hiperparámetros expuestos, ¿qué hago ahora? Como se puede ver en los hiperparámetros al final del cuaderno, varían bastante.

10voto

cbeleites Puntos 12461

(Estoy seguro de que ya escribí la mayor parte de esto en alguna respuesta, pero ahora mismo no la encuentro. Si alguien encuentra esa respuesta, por favor, que la enlace). Veo 2 enfoques ligeramente diferentes aquí, que creo que son sensatos.

Pero primero algo de terminología:

  • Procedente de un campo aplicado, a modelo (ajustado/entrenado) para mí es un listo para usar. Es decir, el modelo contiene todos información necesaria para generar predicciones de nuevos datos. Así, la El modelo contiene también el hiperparámetros . Como verá, este punto de vista está estrechamente relacionado con el planteamiento 2 que se expone a continuación.
  • POR OTRO LADO, algoritmo de entrenamiento en mi experiencia no está bien definido en el siguiente sentido: para obtener el modelo (ajustado), no sólo hay que realizar el -llamémoslo "ajuste primario"- de los parámetros "normales" del modelo, sino que también hay que fijar los hiperparámetros. Desde el punto de vista de mi aplicación, no hay mucha diferencia entre los parámetros y los hiperparámetros: ambos forman parte del modelo. el modelo y deben estimarse/decidirse durante la formación.
    Supongo que la diferencia entre ellos está relacionada con la diferencia entre alguien que desarrolla nuevos algoritmos de entrenamiento que normalmente describiría una clase de algoritmos de entrenamiento junto con algunos parámetros de dirección (el hiperparámetros ) que son difíciles/imposibles de arreglar (o al menos de arreglar cómo deberían decidirse/estimarse) sin conocimiento de la aplicación/dominio.

Enfoque 1: exigir resultados de optimización estables

Con este enfoque, el "entrenamiento del modelo" es el ajuste de los parámetros "normales" del modelo, y hiperparámetros se dan. Una validación cruzada interna, por ejemplo, se encarga de la optimización de los hiperparámetros.

El paso/suposición crucial aquí para resolver el dilema de qué conjunto de hiperparámetros debe elegirse es requieren que la optimización sea estable . La validación cruzada con fines de validación supone que todos los modelos sustitutos son lo suficientemente similares al final (obtenidos mediante el mismo algoritmo de entrenamiento aplicado a todo el conjunto de datos) para poder tratarlos como iguales (tanto entre sí como al modelo final). Si esta suposición se rompe y

  1. los modelos sustitutivos siguen siendo iguales (o equivalentes) entre sí pero no al modelo final, estamos hablando del conocido sesgo pesimista de la validación cruzada.

  2. Si además los modelos sustitutos no son iguales/equivalentes entre sí, tenemos problemas de inestabilidad .

Para los resultados de optimización del bucle interior esto significa que si la optimización es estable, no hay conflicto en la elección de los hiperparámetros . Y si se observa una variación considerable en los resultados de la validación cruzada interna, la optimización no es estable . Las situaciones de entrenamiento inestables plantean problemas mucho peores que la mera decisión de cuál de los conjuntos de hiperparámetros elegir, y yo realmente recomendaría dar un paso atrás en ese caso y comenzar de nuevo el proceso de modelado. proceso de modelización.

Sin embargo, hay una excepción: puede haber varios mínimos locales en la optimización que ofrezcan el mismo rendimiento a efectos prácticos. Exigir también que la elección entre ellos sea estable puede ser un requisito fuerte 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 utilizar aquí las estimaciones del bucle exterior como error de generalización:

  • Si alega error de generalización para los parámetros $p$ Todos los modelos alternativos que entren en la validación deberán utilizar exactamente estos parámetros.
    (Imagina que alguien te dice que ha hecho una validación cruzada en un modelo con C = 1 y kernel lineal y descubres que algunas divisiones se evaluaron con kernel rbf).
  • Pero a menos que no haya ninguna decisión involucrada ya que todas las divisiones produjeron los mismos parámetros, esto romperá la independencia en el bucle externo: los datos de prueba de cada división ya entraron en la decisión de qué conjunto de parámetros gana ya que fueron datos de entrenamiento en todas las otras divisiones y por lo tanto utilizados para optimizar los parámetros.

Enfoque 2: tratar el ajuste de hiperparámetros como parte del entrenamiento del modelo

Este enfoque tiende un puente entre las perspectivas del "desarrollador del algoritmo de entrenamiento" y del usuario aplicado del algoritmo de entrenamiento.

El desarrollador del algoritmo de entrenamiento proporciona un algoritmo de entrenamiento "desnudo". model = train_naked (trainingdata, hyperparameters) . Según las necesidades del usuario aplicado tunedmodel = train_tuned (trainingdata) que también se encarga de fijar los hiperparámetros.

train_tuned puede implementarse, por ejemplo, envolviendo un optimizador basado en la validación cruzada alrededor del algoritmo de entrenamiento desnudo. train_naked .

train_tuned puede utilizarse como cualquier otro algoritmo de entrenamiento que no requiera la entrada de hiperparámetros, por ejemplo, su salida tunedmodel puede someterse a validación cruzada. Ahora se comprueba la estabilidad de los hiperparámetros del mismo modo que se comprueba la estabilidad de los parámetros "normales" como parte de la evaluación de la validación cruzada.

Esto es en realidad lo que se hace y evalúa en la validación cruzada anidada si se promedia el rendimiento de todos los modelos ganadores independientemente de sus conjuntos de parámetros individuales.


¿Cuál es la diferencia?

Es posible que acabemos con modelos finales diferentes adoptando esos 2 enfoques:

  • el modelo final en el enfoque 1 será train_naked (all data, hyperparameters from optimization)
  • mientras que el enfoque 2 utilizará train_tuned (all data) y -como eso ejecuta la optimización de hiperparámetros de nuevo 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 descubrimos que el modelo final tiene parámetros sustancialmente diferentes de los modelos sustitutos de validación cruzada, eso es síntoma de que se está violando la hipótesis 1. Así que, en mi opinión, no se trata de un conflicto, sino de comprobar si nuestras hipótesis (implícitas) están justificadas. Y si no lo están, 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 por ver el número de preguntas/confusiones similares aquí en CV) de que mucha gente piensa en la validación cruzada anidada haciendo el enfoque 1. Pero el error de generalización suele estimarse de acuerdo con el enfoque 2, por lo que ese es el camino a seguir también para el modelo final.


Iris ejemplo

Resumen: La optimización es básicamente inútil. El tamaño de la muestra disponible no permite distinguir entre el rendimiento de ninguno de los conjuntos de parámetros.

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 tan mala noticia: ha encontrado una meseta de parámetros comparativamente estable. Aquí viene la ventaja de la validación anidada adecuada del modelo ajustado: aunque no se puede afirmar que sea el modelo óptimo, sí se puede afirmar que el modelo construido sobre la totalidad de los datos utilizando el enfoque 2 tendrá una precisión de aproximadamente el 97 % (intervalo de confianza del 95 % para 145 casos correctos de 150 casos de prueba: 92 - 99 %).

Tenga en cuenta que el enfoque 1 tampoco está tan lejos como parece - véase más abajo: su optimización accidentalmente pasó por alto un "ganador" comparativamente claro debido a los empates (que es en realidad otro síntoma muy revelador del problema del tamaño de la muestra).

Aunque no soy lo suficientemente profundo en SVMs para "ver" que C = 1 debe ser una buena opción aquí, yo iría con el kernel lineal más restrictiva. Además, como usted hizo la optimización, no hay nada malo en elegir el conjunto de parámetros ganador, incluso si eres consciente de que todos los conjuntos de parámetros conducen a un rendimiento prácticamente igual.

En el futuro, sin embargo, considere si su experiencia le ofrece estimaciones aproximadas del rendimiento que puede esperar y, aproximadamente, qué modelo sería una buena elección. A continuación, construya ese modelo (con hiperparámetros fijados manualmente) y calcule un intervalo de confianza para su rendimiento. Utilízalo para decidir si intentar optimizarlo es sensato. (Puedo añadir que estoy trabajando principalmente con datos en los que conseguir 10 casos más independientes no es fácil - si usted 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 iris conjunto de datos. iris tiene 150 casos, SVM con una rejilla de 2 x 2 parámetros (2 núcleos, 2 órdenes de magnitud para la penalización C ).

El bucle interior tiene divisiones de 129 (2x) y 132 (6x) casos. El "mejor" conjunto de parámetros está indeciso entre kernel lineal o rbf, ambos con C = 1. Sin embargo, las precisiones de la prueba interna son todos (incluida la siempre perdedora C = 10) dentro del 94 - 98,5 % de precisión observada. La mayor diferencia que tenemos en una de las divisiones es de 3 frente a 8 errores para rbf con C = 1 frente a 10.

Es imposible que sea una diferencia significativa. No sé cómo extraer las predicciones para los casos individuales en el CV, pero incluso suponiendo que los 3 errores fueron compartidos, y el modelo C = 10 cometió 5 errores adicionales:

> table (rbf1, rbf10)
         rbf10
rbf1      correct wrong
  correct     124     5
  wrong         0     3

> mcnemar.exact(rbf1, rbf10)

    Exact McNemar test (with central confidence intervals)

data:  rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1

Recuerde que hay 6 comparaciones por pares en la cuadrícula de 2 x 2, por lo que también tendríamos que corregir las comparaciones múltiples.


Enfoque 1

En 3 de las 4 divisiones externas en las que rbf "ganó" al kernel lineal, en realidad tenían la misma precisión estimada (supongo que min en caso de empate devuelve el primer índice adecuado).

Cambiar la cuadrícula a params = {'kernel':['linear', 'rbf'],'C':[1,10]} produce

({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)

Enfoque 2:

Toma, clf es su modelo final. Con random_state = 2 rbf con C = 1 gana:

In [310]: clf.grid_scores_
[...snip warning...]
Out[310]: 
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
 mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
 mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
 mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]

(ocurre aproximadamente 1 de cada 5 veces, 1 de cada 6 veces linear y rbf con C = 1 están empatados en el rango 1)

0voto

Cla Puntos 333

He leído su pregunta y la respuesta anterior 2 veces (1ª vez hace 3 meses). Estoy interesado y también quiero encontrar la manera absolutamente adecuada para hacer la validación cruzada para mis datos. Después de mucho pensar y leer, parece que he encontrado los agujeros y aquí está mi solución:

Para explicar mi confusión, voy a intentar explicar paso a paso el método de selección de modelos con validación cruzada anidada.

  1. Crear un bucle CV externo con K-Fold. Esto se utilizará para estimar el rendimiento de los hiperparámetros que "ganaron" cada bucle CV interno.
  2. Utilice GridSearchCV para crear un bucle interno de CV en el que, en cada bucle interno, GSCV recorra todas las combinaciones posibles del espacio de parámetros y obtenga el mejor conjunto de parámetros. (Nota: aquí asumo: datos para el bucle interno = datos de entrenamiento para el bucle externo. Usted se preguntará: ¿por qué? Respuesta: https://stackoverflow.com/questions/42228735/scikit-learn-gridsearchcv-with-multiple-repetitions/42230764#42230764 lea la sección de respuestas de Vivek Kumar paso 4)
  3. Después de que GSCV haya encontrado los "mejores parámetros" en el bucle interno (llamémoslo inner winner), se prueba con el conjunto de pruebas en el bucle externo para obtener una estimación del rendimiento (llamémoslo outer_fold_score1).
  4. A continuación, el bucle externo actualiza el siguiente pliegue como conjunto de prueba y el resto como conjunto de entrenamiento (para evaluar el "ganador interno" en el bucle externo), el "ganador interno" se prueba de nuevo con el nuevo conjunto de prueba (puntuación_del_pliegue_externo2). A continuación, el bucle externo se actualiza al siguiente pliegue hasta completar el bucle. Las puntuaciones de cada pliegue (outer_fold_score 1,2..) se promediarán para obtener la puntuación del "ganador interno" del bucle externo (outer_score)
  5. A continuación, el bucle externo actualiza el siguiente pliegue como conjunto de prueba y el resto como conjunto de entrenamiento (para encontrar el siguiente "ganador interno" , y 1- 4 repite (nótese que cuando repetimos 1 no creamos el nuevo pliegue K sino que usamos el mismo pliegue K exterior cada vez) . Con cada ciclo de 1-4, obtenemos un "mejor parámetro" (o "ganador interno") con una puntuación externa. El que tenga la mejor puntuación externa será el ganador de los ganadores.

Razonamiento:

  • Básicamente tu pregunta se refiere a que hay muchos "parámetros ganadores" para el bucle exterior. La cuestión es que no has completado el bucle externo para evaluar y encontrar el "ganador externo". Su 4 º paso sólo evaluar el "ganador interno" en 1 pliegue en el bucle exterior, pero u no "bucle". Por lo tanto, tengo que reemplazarlo con mi 4 º paso - "bucle" el paso de evaluación en el bucle exterior y obtener la puntuación exterior (promediando)
  • Tu 5º paso hizo el trabajo de "looping" en el bucle externo, pero es sólo para construir otro "inner winner". No hizo la "evaluación" de este "ganador interno" en el bucle externo.

0voto

ThomasR Puntos 28

Usted lo hace no utilizar la validación cruzada anidada para seleccionar los hiperparámetros del algoritmo, este método se utiliza para estimar el error de generalización de su procedimiento de construcción de modelos . Por procedimiento de construcción de modelos entiendo todos los pasos que se aplican para llegar al modelo final que se va a utilizar en el campo.
Un procedimiento de construcción de modelos podría estar compuesto por las normas que ha aplicado para decidir qué preprocesamiento aplicar a los datos, qué característica utilizar y, por último, qué hiperparámetros utilizar. Piense en esto como una especie de "metaalgoritmo" que recibe como entrada un conjunto de datos concreto $D$ y produce como salida un "algoritmo", compuesto por un fijo conjunto de transformaciones de preprocesamiento, características y, por último, valores de hiperparámetros.

Por ejemplo, supongamos que tiene $X , y$ como matriz de diseño y objetivo y se desea entrenar un clasificador:
1. que utiliza sólo la primera $x$ características en $X$ que tienen mayor correlación con $y$ .
2. se eligen los valores de los hiperparámetros mediante la minimización de una estimación de error de validación cruzada de 10 veces.

Si se aplican estos dos pasos a un par de $X', y'$ obtendrá un algoritmo específico con un conjunto definido de características e hiperparámetros fijos que no será necesariamente el mismo que el que obtendría para $X, y$ aunque el procedimiento de construcción del modelo sería idéntico, es decir, las etapas 1 + 2, que no están vinculadas a ningún conjunto de datos concreto.
Supongamos que has hecho todo lo anterior sin haber dividido tus datos en entrenamiento-prueba porque tienes un conjunto de datos pequeño, ¿cómo estimas el error de generalización del clasificador que acabas de crear? ¿Puede utilizar el mejor error encontrado en la validación cruzada del paso 2?
No el primer gran problema está en el paso 1, donde se utiliza todos los datos para seleccionar las funciones que desea utilizar. Por lo tanto, incluso cuando realice la validación cruzada en el paso 2, las características ya habrán visto y recordado alguna información presente en el pliegue de prueba en cada ejecución de validación cruzada. El resultado será un demasiado optimista estimación del error de la prueba y esto se denomina sesgo en la selección de características . Para tener esto en cuenta en su estimación, tendría que poner el paso de selección de características dentro del bucle de validación cruzada del paso 2.
Ok, ¿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 han sido elegidos para minimizar el error de validación cruzada en la variable 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 sobreajustarlos , y esto se llama sesgo de selección del modelo . Pero, ¿es esto preocupante en la práctica? Depende de la aplicación específica: es probable que sea más grave, como el sobreajuste en el entrenamiento, cuando el conjunto de datos es pequeño y el número de hiperparámetros a sintonizar es relativamente grande. Para tenerlo en cuenta al estimar el error de generalización, se aplicaría una validación cruzada anidada como la que ha descrito, que le proporcionaría una estimación correcta del error de generalización.
Finalmente, para responder a su última pregunta, después de tener una estimación justa del error de generalización de su "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 valores de características e 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 .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X