Selección de modelo y validación cruzada: la forma correcta

34

Existen numerosos hilos en CrossValidated sobre el tema de selección de modelos y validación cruzada. Aquí hay algunos:

Sin embargo, las respuestas a esos hilos son bastante genéricas y en su mayoría resaltan los problemas con enfoques particulares para la validación cruzada y la selección de modelos.

Para hacer las cosas lo más concretas posible , digamos, por ejemplo, que estamos trabajando con un SVM con un núcleo RBF: , y que Tengo un conjunto de datos de características X y etiquetas y , y quieroK(x,x)=(γ|xx|)2

  1. Encuentra los mejores valores posibles de mi modelo ( yγC )
  2. Entrenar el SVM con mi conjunto de datos (para la implementación final)
  3. Estime el error de generalización y la incertidumbre (varianza) en torno a este error.

Para hacerlo, personalmente haría una búsqueda en la cuadrícula, por ejemplo, intento todas las combinaciones posibles de y . Por simplicidad, podemos asumir los siguientes rangos:Cγ

  • C{10,100,1000}
  • γ{0.1,0.2,0.5,1.0}

Más específicamente, usando mi conjunto de datos completo, hago lo siguiente:

  1. Para cada par ( , γ ), hago iteraciones repetidas (por ejemplo, 100 repeticiones aleatorias) de validación cruzada K- fold (por ejemplo, K = 10 ), en mi conjunto de datos, es decir, entreno mi SVM en K - 1 pliegues y evalúo el error en el pliegue a la izquierda, iterando a través de todos los pliegues K. En general, recopilo 100 x 10 = 1000 errores de prueba.CγKK=10K1K
  2. Para cada uno de tales ( , γ par), I calcular la media y la varianza de esos 1000 errores de prueba mu M , σ M .CγμM,σM

μMσMμMσM

PERO, después de leer las respuestas en los hilos anteriores, tengo la impresión de que este método para elegir el mejor SVM para la implementación y / o para estimar su error (rendimiento de generalización) es defectuoso, y que hay mejores formas de elegir el mejor SVM y reportando su error. Si es así, ¿Que son? Estoy buscando una respuesta concreta por favor.

Manteniéndome en este problema, ¿cómo puedo elegir específicamente el mejor modelo y estimar adecuadamente su error de generalización ?

Amelio Vazquez-Reina
fuente
Para hacer las cosas lo más concretas posible, díganos: ¿Cuántos casos estadísticamente independientes tiene en su conjunto de datos? ¿Cuál es la función objetivo que evalúa para la optimización / qué tipo de medida de error utiliza? ¿Realmente observa un comportamiento coherente de la medida de error elegida sobre su cuadrícula de parámetros? En caso de que esté hablando de clasificación y su medida de error lo permita: ¿cómo se comparan los resultados de validación cruzada iterativa con la varianza que espera (pero no puede medir) debido al tamaño de muestra finito?
cbeleites apoya a Monica el
Un artículo que le puede interesar: óptimaprediction.com
files
2
+1 para preguntas muy claras y detalladas, así como preguntas muy relevantes para la comunidad de ciencia de datos en general.
NickBraunagel

Respuestas:

20

Mi artículo en JMLR aborda esta pregunta exacta y demuestra por qué el procedimiento sugerido en la pregunta (o al menos uno muy similar) da como resultado estimaciones de rendimiento sesgadas de manera optimista:

Gavin C. Cawley, Nicola LC Talbot, "Sobre el ajuste excesivo en la selección del modelo y el sesgo de selección posterior en la evaluación del rendimiento", Journal of Machine Learning Research, 11 (julio): 2079-2107, 2010. ( www )

La clave para recordar es que la validación cruzada es una técnica para estimar el rendimiento de generalización para un método de generación de un modelo, en lugar del modelo en sí. Entonces, si elegir los parámetros del kernel es parte del proceso de generación del modelo, también debe validar el proceso de selección del modelo, de lo contrario, terminará con una estimación de rendimiento sesgada de manera optimista (como sucederá con el procedimiento que propone).

Suponga que tiene una función fit_model, que toma un conjunto de datos que consta de atributos X y respuestas deseadas Y, y que devuelve el modelo ajustado para ese conjunto de datos, incluida la optimización de hiperparámetros (en este caso, kernel y parámetros de regularización). Esta sintonización de hiperparámetros se puede realizar de muchas maneras, por ejemplo, minimizando el error de validación cruzada sobre X y T.

Paso 1: ajuste el modelo a todos los datos disponibles, utilizando la función fit_model. Esto le proporciona el modelo que utilizará en la operación.

Paso 2 - Evaluación del desempeño. Realice una validación cruzada repetida utilizando todos los datos disponibles. En cada pliegue, los datos se dividen en un conjunto de entrenamiento y un conjunto de prueba. Ajuste el modelo utilizando el conjunto de entrenamiento (registre valores de hiperparámetros para el modelo ajustado) y evalúe el rendimiento en el conjunto de prueba. Use la media sobre todos los conjuntos de prueba como una estimación de rendimiento (y quizás también observe la distribución de valores).

Paso 3 - Variabilidad de la configuración de hiperparámetros: realice un análisis de los valores de hiperparámetros recopilados en el paso 3. Sin embargo, debo señalar que no hay nada especial en los hiperparámetros, son solo parámetros del modelo que se han estimado (indirectamente ) de los datos. Se tratan como hiperparámetros en lugar de parámetros por conveniencia computacional / matemática, pero este no tiene que ser el caso.

El problema con el uso de la validación cruzada aquí es que los datos de entrenamiento y prueba no son muestras independientes (ya que comparten datos), lo que significa que la estimación de la varianza de la estimación de rendimiento y de los hiperparámetros es probable que esté sesgada (es decir, más pequeño de lo que sería para muestras de datos genuinamente independientes en cada pliegue). En lugar de la validación cruzada repetida, probablemente usaría bootstrapping en su lugar y empaquetaría los modelos resultantes si esto fuera computacionalmente factible.

El punto clave es que para obtener una estimación imparcial del rendimiento, cualquier procedimiento que utilice para generar el modelo final (fit_model) debe repetirse en su totalidad de forma independiente en cada pliegue del procedimiento de validación cruzada.

Dikran Marsupial
fuente
Esta es una respuesta genial. Cuando dices rather than repeated cross-validation you would go for bootstrapping: ¿Cuál es exactamente la diferencia? Ambos implican múltiples repeticiones de dividir los datos en trainy testa continuación, la formación en trainy evaluar en test, ¿verdad?
Josh
44
Bootstrapping (muestreo con reemplazo) parece una forma más natural de realizar una gran cantidad de remuestreos, ya que es más aleatorio que la validación cruzada repetida. Para el arranque, el uso de elementos embolsados ​​es una buena característica, con el error fuera de la bolsa como una estimación del rendimiento. No hay una gran cantidad para elegir entre los dos.
Dikran Marsupial
Gracias @Dikran: esto me hizo preguntarme, suponiendo que uno usa, por ejemplo, bootstrapping, ¿cómo elegiría un buen modelo teniendo en cuenta la media y la varianza entre repeticiones? (es decir, ¿qué protocolo de selección de modelo seguirías?). Esta pregunta plantea exactamente esta pregunta. ¡Obtener su opinión sobre ese hilo sería extremadamente valioso!
Josh
@DikranMarsupial ¿Podría publicar código (por ejemplo, Python o R) para sus pasos 1-3? Me resulta mucho más fácil entender tales procedimientos cuando veo un código concreto.
tobip
1
Mensaje clave: "El punto clave es que para obtener una estimación de rendimiento imparcial, cualquier procedimiento que utilice para generar el modelo final (fit_model) debe repetirse en su totalidad de forma independiente en cada pliegue del procedimiento de validación cruzada". Este mensaje exacto también se transmite en Los elementos del aprendizaje estadístico (ver sección 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
NickBraunagel
0

γdo

Un procedimiento que optimiza estos hiperparámetros y entrena un SVM con estos también es solo un algoritmo de aprendizaje automático . En lugar de solo optimizar los parámetros internos de la SVM (los vectores de soporte), también optimiza los hiperparámetros.

Ahora tiene dos problemas [que se pueden resolver de forma independiente]:

Lea el mal uso de la validación cruzada (informe de rendimiento para el mejor valor de hiperparámetro) para asegurarse de no mezclarlos.


Una solución específica (probablemente no óptima) al problema concreto de su pregunta:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Aquí, modelsería su "mejor modelo" y loss_CVuna "estimación adecuada de su error de generalización" (aunque sesgado hacia arriba, pero no puede tener el pastel y comerlo también).

jan-glx
fuente