(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
-
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.
-
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)