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
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.
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.
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.
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.
fuente
Si deberías. Por supuesto bajo las condiciones que
Puedo pensar en dos razones:
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.
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.
fuente
Es posible. Piense en un escenario simple en el que el modelo
M1
haya aprendido la varianza del conjunto de datos de entrenamientoD
mejor que el modelo,M2
ya que sus parámetros están mejor ajustados. Esto significa queM1
funciona mejorD
queM2
.Pero cuando los probamos en el conjunto de prueba
T
, es posible queM2
funcione mejor, ya queM1
podría estar sobreajustandoD
mientras queM2
no lo fue. Por lo tanto,M1
funciona peorT
queM2
.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
fuente
D
ya 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 datosD
y 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 esteoptimized
modelo 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 datosD
, ¿no?D
, primero corta aleatoriamenteD
en aproximadamente 10 piezas de igual tamaño, luego, en cada iteración, ajusta M1 y M2 en el mismo 9/10 deD
, luego las aplica el mismo 1 / 10D
para obtener sutest 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 sobreajusteLa 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
fuente