¿Será el rendimiento de validación cruzada una indicación precisa para predecir el verdadero rendimiento en un conjunto de datos independiente?


9

Siento que esta pregunta está relacionada con la teoría detrás de la validación cruzada. Presento mi hallazgo empírico aquí y escribí una pregunta relacionada con la teoría de la validación cruzada allí .

Tengo dos modelos M1 y M2, utilizo el mismo conjunto de datos para entrenarlos y realizar la validación cruzada utilizando ese mismo conjunto de datos para encontrar los parámetros óptimos para cada modelo. Digamos que finalmente encontré que M1 bajo su parámetro óptimo, funciona mejor que M2 bajo su parámetro óptimo en términos de la puntuación de validación cruzada 10 veces. Ahora, si tengo otro conjunto de datos de prueba independiente con predictores y etiquetas y este conjunto de datos de prueba se genera a partir de la misma distribución de mi conjunto de datos de entrenamiento, entonces antes de aplicar estos 2 modelos bien ajustados en ese nuevo conjunto de datos de prueba, ¿puedo reclamo o debería esperar ver que M1 aún funcionará mejor que M2 en ese nuevo conjunto de datos de prueba?

Estaba jugando el ejemplo de Kaggle Titanic. Tengo 2 modelos xgboost, M1 está bien ajustado y M2 está menos bien ajustado en el sentido de que M1 tiene una mejor validación cruzada de 10 veces en el conjunto de datos de entrenamiento. Pero luego, cuando envío ambos, descubrí que el modelo menos ajustado realmente tiene mejores puntajes en el conjunto de datos de la prueba. ¿Cómo es posible? Y si es cierto, ¿qué debemos buscar cuando ajustamos los datos a diferentes modelos y ajustamos los parámetros del modelo?

Aquí están mis resultados de envío específicos: hice una búsqueda aleatoria de cuadrícula

params_fixed = {'silent': 1,'base_score': 0.5,'reg_lambda': 1,
'max_delta_step': 0,'scale_pos_weight':1,'nthread': 4,
'objective': 'binary:logistic'}
params_grid = {'max_depth': list(np.arange(1,10)),
'gamma': [0,0.05,0.1,0.3, 0.5,0.7,0.9],
'n_estimators':[1,2,5,7,10,15,19,25,30,50], 
'learning_rate': [0.01,0.03,0.05,0.1,0.3,0.5,0.7,0.9,1],
'subsample': [0.5,0.7,0.9], 'colsample_bytree': [0.5,0.7,0.9], 
'min_child_weight': [1,2,3,5], 'reg_alpha': [1e-5, 1e-2, 0.1, 0.5,1,10]
}
rs_grid = RandomizedSearchCV(
          estimator=XGBClassifier(**params_fixed, seed=seed),
          param_distributions=params_grid,
          n_iter=5000,   
          cv=10,
          scoring='accuracy',
          random_state=seed
)

Cada vez que cambio la variable n_iter. Primero, configuré n_iter=10, me da un conjunto de valores de esos hiperparámetros, llamemos a este vector y el puntaje cv (tasa de precisión) es 0.83389 , luego uso para entrenar mi modelo y generar predicción en la prueba independiente conjunto de datos, y cuando lo envío a Kaggle, genera una verdadera precisión en el conjunto de datos de prueba 0.79426α1α1

En segundo lugar, establezco n_iter=100, me da y el puntaje cv es 0.83614 , es decir, más alto que el primero, tiene sentido, pero cuando me someto a Kaggle, 0.78469 , más bajo que el primero.α2

En tercer lugar, establezco n_iter = 1000, me da y el puntaje cv es 0.83951 , es decir, más alto que el segundo, tiene sentido, pero cuando me someto a Kaggle, 0.77990 , más bajo que el segundo.α3

Cuarto, configuré n_iter = 5000, me da y el puntaje cv es 0.84512 , es decir, más alto que el tercero, tiene sentido, pero cuando me someto a Kaggle, 0.72249 , más bajo que el tercero.α4 4

Esto está realmente frustrado. El modelo está mejorando cada vez más en la puntuación de validación cruzada, pero cuando se realiza en un conjunto de datos independiente real, su rendimiento es cada vez peor. ¿Interpreté los puntajes de CV exactamente de la manera opuesta? Veo que algunos artículos mencionan que la calificación de CV puede ser demasiado optimista para inferir la verdadera puntuación de la prueba. Sin embargo, incluso si eso es cierto, entonces creo que los puntajes de CV para todos mis 4 modelos deberían ser optimistas sobre su puntaje de prueba verdadero, es decir, el orden debería preservarse. Pero cuando se aplica en el conjunto de datos de prueba real, el orden se invierte.

La única razón que puedo imaginar sería que el conjunto de datos de prueba tiene una distribución diferente que el conjunto de datos de entrenamiento. Sin embargo, si es así, creo que no hay ningún método bajo el sol que pueda curar este problema.

Respuestas:


3

En primer lugar, una respuesta pragmática: no descarte la posibilidad de que el conjunto de pruebas provenga de una distribución algo diferente del conjunto de datos que está utilizando para el entrenamiento y la validación cruzada. Puede pensar que eso no debería suceder, pero en la práctica parece ocurrir.

Dicho esto, vamos con su hipótesis y supongamos que el conjunto de prueba proviene exactamente de la misma distribución que el resto de sus datos. En ese caso, es posible que la validación cruzada lo extravíe sobre qué modelo es mejor, si está usando la validación cruzada para seleccionar hiperparámetros.

Puede usar la validación cruzada para (a) seleccionar hiperparámetros o (b) estimar la precisión de su modelo, pero no ambos al mismo tiempo.

Parece que está utilizando la validación cruzada para seleccionar los hiperparámetros óptimos: prueba muchas opciones diferentes para los hiperparámetros, para cada elección, estimar la precisión de esa elección usando la validación cruzada y seleccionar la mejor opción. Cuando hace eso, no hay garantía de que la precisión resultante (con el mejor parámetro) sea predictiva del rendimiento en el conjunto de prueba; podría ser una sobreestimación (debido al sobreajuste). Si es más una sobreestimación para M1 que para M2, entonces es posible que vea lo que vio.

Si desea seleccionar hiperparámetros y estimar la precisión, le sugiero que tenga un conjunto de validación independiente para estimar la precisión, o use una validación cruzada anidada. Consulte https://stats.stackexchange.com/q/65128/2921 y http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html .


¿Conoces otra referencia más teórica (desde el lado de la teoría de la probabilidad) que explique por qué es necesario un CV anidado que un CV simple para la selección del modelo? Quiero comprender el mecanismo subyacente que conduce al problema que encontré
KevinKim

1
También sugiero usar validación cruzada anidada. si está haciendo un CV externo de 3 veces y un CV interno de 10 veces, podrá probar los 3 modelos que entrena durante los CV internos en tres conjuntos de datos diferentes; eso le dará una mejor comprensión de cómo terminará su proceso de construcción de modelos cuando encuentre diferentes conjuntos de datos.
darXider

@darXider He leído algunos de los CV anidados, parece que se utiliza para comparar 2 clases de modelos, por ejemplo, RF y GBT, de modo que en el CV interno, elige los hiperparámetros "mejores" (error CV más bajo) de RF y GBT respectivamente, luego en el CV externo, calcula el error de generalización de RF y GBT con los hiperparámetros elegidos por el CV interno. En mi caso, solo tengo una clase de modelo, GBT, quiero realizar un ajuste de hiperparámetro. ¿Cómo me ayuda el cv anidado a hacer eso?
KevinKim

@KevinKim AFAIK, el objetivo del CV anidado es dar una idea de cómo se generalizará el proceso de construcción de modelos y no comparar diferentes clases de modelos. Como su objetivo final es usar su modelo entrenado (ya sea RF o XGB) en datos futuros / no vistos, es posible que comprenda mejor su rendimiento si usa un CV anidado. Por supuesto, también realiza ajustes de hiperparámetros en su CV anidado de 3x10; al final, obtendrá, digamos, 3 modelos XGB que son equivalentes entre sí (tenga en cuenta que no debe elegir uno de los tres, pero puede combinarlos, por ejemplo, utilizando varios métodos de ensamblaje).
darXider

1

¿puedo reclamar o debo esperar ver que M1 seguirá funcionando mejor que M2 en ese nuevo conjunto de datos de prueba?

Si deberías. Por supuesto bajo las condiciones que

  1. los datos de prueba provienen del mismo proceso generador que los datos de capacitación y validación, y
  2. tiene suficientes datos en cada conjunto para hacer improbables las fluctuaciones estadísticas.

El modelo está mejorando cada vez más en la puntuación de validación cruzada, pero cuando se realiza en un conjunto de datos independiente real, su rendimiento es cada vez peor.

Puedo pensar en dos razones:

  1. El conjunto de datos de prueba no se genera de la misma manera. Por lo tanto, es mejor no confiar en el conjunto de pruebas de Kaggle al que no tiene acceso. Usa los datos que tienes.

  2. Está sobreajustando, lo que significa que no está ejecutando la validación cruzada correctamente. Asegúrese realmente de que el entrenamiento de los parámetros ocurra en los datos del entrenamiento y, al mismo tiempo, que la validación ocurra en los datos que no utilizó para el entrenamiento. Compare los histogramas de las pérdidas de entrenamiento y las pérdidas de validación. Las pérdidas de entrenamiento deben ser consistentemente más pequeñas que las pérdidas de validación. Haga lo mismo para las pérdidas en los datos de prueba para obtener una imagen coherente.

Como nota final: es de esperar que el rendimiento en el conjunto de prueba sea inferior al del conjunto de validación. Esto se debe a que el modelo se elige en función del conjunto de validación. Por lo tanto, está sesgado a ese conjunto de datos.


Tengo el código en mi publicación, no creo que haya usado mal el procedimiento de CV (¿Encontraste algún problema con mi código?). Y, de hecho, vi que el error de entrenamiento es mucho menos estable y (con un estándar pequeño) que el error de validación. Entiendo que el verdadero error de prueba será mayor que el error de validación, pero espero que esto también le suceda a todo mi modelo (me refiero a XBGT con un valor diferente de los hiperparámetros). Por lo que vi, parece que algunos modelos esto sucede menos que otros modelos, lo que crea este "fenómeno inverso". Así que no sé en qué dirección estoy buscando sintonizar
Hyperpara

He visto a muchas personas sugerir romper el reen 3 partes, entrenar, validación y prueba, y después de ajustar hyperP en el conjunto de validación, luego aplique el modelo en el conjunto de prueba para ver cómo funcionará este modelo en una prueba real (ya que el paso de validación también tiene algún sesgo). Luego, después de la prueba, deje de ajustar el hyperP, como si lo hiciera, también comenzará a tener sesgo (como en el conjunto de validación). Lo entiendo. Pero si después del conjunto de prueba, todavía no estoy satisfecho con el rendimiento de mi modelo, ¿qué debo hacer?
KevinKim

Creo que en la práctica, aunque vivimos en un mundo de "big data", la cantidad de características también está aumentando. Como tenemos la maldición de las dimensiones, es muy probable que incluso tengamos una gran cantidad de filas, aún para cada parte del espacio de características, todavía no tenemos suficientes puntos de datos. Entonces la fluctuación estadística siempre está ahí. Entonces, me pregunto si este procedimiento de ajuste de hyperP sigue siendo correcto o útil para obtener un modelo con buen rendimiento en un conjunto de datos de prueba real. Si CV no es útil para hacer esta tarea, ¿cuál es el procedimiento correcto?
KevinKim

Verifique si las pérdidas de capacitación en su procedimiento de validación son comparables entre sí, es decir, consistentes. Si no, pruebe con otra selección de modelo / función. No continúe hasta que tenga este derecho. Luego haga lo mismo para sus pérdidas de validación. Si no son comparables, pruebe con otro modelo / método de selección / método de validación. Cuando lo estén, proceda al conjunto de prueba. Si la pérdida no lo satisface allí, rechace el procedimiento completo e intente otra cosa. Si comienza a optimizar el uso del conjunto de prueba, no puede confiar en el rendimiento en vivo, ya que estará sesgado al conjunto de prueba.
Ytsen de Boer

0

Es posible. Piense en un escenario simple en el que el modelo M1haya aprendido la varianza del conjunto de datos de entrenamiento Dmejor que el modelo, M2ya que sus parámetros están mejor ajustados. Esto significa que M1funciona mejor Dque M2.

Pero cuando los probamos en el conjunto de prueba T, es posible que M2funcione mejor, ya que M1podría estar sobreajustando Dmientras que M2no lo fue. Por lo tanto, M1funciona peor Tque M2.

Esto podría deberse al hecho de que realizó su validación cruzada en el mismo conjunto de datos en lugar de un conjunto de validación. Si entrena y valida en el mismo conjunto, es probable que se pierda el hecho de que podría ser demasiado adecuado. Por lo tanto, siempre es mejor entrenar, validar y probar en diferentes conjuntos de datos. Entonces el flujo debería ser

  1. Entrena diferentes modelos en el mismo conjunto de entrenamiento
  2. Validado en el conjunto de validación
  3. Elija el mejor rendimiento base del modelo en el conjunto de validación
  4. Úselo para calificar su conjunto de pruebas.

Pensé que la validación cruzada en el conjunto de datos Dya ha tenido en cuenta los problemas de sobreajuste. Entiendo que si no realiza validación cruzada en absoluto, es decir, simplemente ajusta el modelo en el conjunto de datos Dy resuelve ese problema de optimización y obtiene los parámetros óptimos, entonces este modelo tendrá el menor error de tren y es muy probable un sobreajuste En este caso, estoy de acuerdo en que este optimizedmodelo tenderá a funcionar mal en un conjunto de datos de prueba independiente. Pero creo que este problema se ha solucionado mediante la validación cruzada en el conjunto de datos D, ¿no?
KevinKim

1
Específicamente, cuando realiza un CV de 10 veces D, primero corta aleatoriamente Den aproximadamente 10 piezas de igual tamaño, luego, en cada iteración, ajusta M1 y M2 en el mismo 9/10 de D, luego las aplica el mismo 1 / 10 Dpara obtener su test error, luego repite este proceso 10 veces y cada vez, el conjunto de trenes y el conjunto de prueba es diferente de la iteración anterior. Luego, después de 10 iteraciones, promedia el error de prueba para M1 y M2, luego encuentra que M1 tiene menos error de prueba, entonces no es suficiente para concluir que M1 es mejor que M2 y este procedimiento parece haber solucionado el sobreajuste
KevinKim

Sí, es suficiente para concluir que "M1 es mejor que M2". Pero, si su procedimiento de selección de modelo se reduce a seleccionar M1 en función del rendimiento de validación , entonces su elección del mejor modelo (M1 en este caso) está sesgada al conjunto de validación. De ahí la necesidad de una verificación final del conjunto de prueba, para obtener una indicación de qué tan bien funcionará en los datos en vivo.
Ytsen de Boer

@YtsendeBoer Finalmente me convencí de lo que dijiste. Estoy de acuerdo. Pero luego, si en otro conjunto de pruebas independiente, descubrí que M1 es peor que M2 (recordar que M1 es mejor que M2 en el conjunto de validación), entonces, en este caso, debería elegir M1 o M2 como mi modelo final para hacer una predicción real en el ¿futuro? Si elijo M1, entonces claramente el resultado de la prueba contra M1. Pero si elijo M2, ¿no sería solo M2 también sobreajustado en este conjunto de datos de prueba específico? es decir, de la misma manera que M1 sobreajusta en el conjunto de validación específico?
KevinKim

Sí, eso es exactamente por qué usted debe no hacer la selección del modelo en el equipo de prueba. Ha elegido M1 en su procedimiento de selección de modelo utilizando el conjunto de validación. Luego ejecuta M1 en el conjunto de prueba y decide si el resultado es lo suficientemente bueno. Olvídate de M2 ​​en este punto, incluso si funciona mejor en otro conjunto de pruebas. Sin embargo, si tiene dudas sobre sus resultados, entonces debe agregar su "otro conjunto de pruebas independiente" al resto de sus datos (más datos es mejor), comience el procedimiento nuevamente y manténgalo .
Ytsen de Boer

0

La teoría detrás de la validación cruzada (validación cruzada en V) ha sido abordada en muchos artículos. Hay una prueba de ello en un conjunto de documentos publicados entre 2003 y 2007. Consulte: - selector de oráculo. 2006 - súper alumno 2007 - súper alumno en predicción 2010 - validación cruzada unificada 2003

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.