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.