Ritengo che questa domanda sia collegata alla teoria alla base della convalida incrociata. Vi presento il mio empirica qui e ho scritto una domanda relativa alla teoria della convalida incrociata in là .
Ho due modelli M1 e M2, utilizzo lo stesso set di dati per addestrarli ed eseguire la convalida incrociata utilizzando lo stesso set di dati per trovare i parametri ottimali per ciascun modello. Diciamo che alla fine ho scoperto che M1 con il suo parametro ottimale, funziona meglio di M2 con il suo parametro ottimale in termini di punteggio di convalida incrociata di 10 volte. Ora, se ho un altro set di dati di test indipendenti con predittori ed etichette e questo set di dati di test viene generato dalla stessa distribuzione del mio set di dati di allenamento, quindi prima di applicare questi 2 modelli ben calibrati su quel nuovo set di dati di test, posso rivendicazione o dovrei aspettarmi di vedere che M1 continuerà a funzionare meglio di M2 rispetto a quel nuovo set di dati di test?
Stavo giocando l'esempio di Kaggle Titanic. Ho 2 modelli xgboost, M1 è ottimizzato e M2 è meno ottimizzato, nel senso che M1 ha una migliore validazione incrociata di 10 volte sul set di dati di allenamento. Ma poi quando ho presentato entrambi, ho scoperto che il modello meno ottimizzato in realtà ha un punteggio migliore nel set di dati di test. Come potrebbe essere? E se è vero, allora cosa dovremmo cercare quando adattiamo i dati a modelli diversi e ottimizziamo i parametri del modello?
Ecco i miei risultati di presentazione specifici: ho fatto una ricerca casuale della griglia
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
)
Ogni volta che cambio la variabile n_iter
. Innanzitutto, ho impostato n_iter=10
, mi dà un insieme di valori di quegli iperparametri, chiamiamo questo vettore e il punteggio cv (tasso di precisione) è 0,83389 , quindi uso per addestrare il mio modello e generare previsione sul test indipendente set di dati, e quando invio a Kaggle genera una vera precisione sul set di dati di test 0.79426
In secondo luogo, ho impostato n_iter=100
, mi dà e il punteggio CV è 0,83614 , vale a dire, più alto del primo, ha senso, ma quando mi sottometto a Kaggle, 0,78469 , inferiore al primo.
Terzo, ho impostato n_iter = 1000
, mi dà e il punteggio cv è 0,83951 , vale a dire, più alto del secondo, ha senso, ma quando mi sottometto a Kaggle, 0,77990 , inferiore al secondo.
In quarto luogo, ho impostato n_iter = 5000
, mi dà e il punteggio cv è 0,84512 , vale a dire, più alto del terzo, ha senso, ma quando mi sottometto a Kaggle, 0,72249 , inferiore al terzo.
Questo è davvero frustrato. Il modello sta migliorando sempre di più nel punteggio di convalida incrociata ma, se eseguito su un set di dati indipendente reale, le sue prestazioni stanno peggiorando. Ho interpretato i punteggi del CV in modo esattamente opposto? Vedo alcuni articoli menzionati che il punteggio CV può essere troppo ottimista per dedurre il punteggio del test vero. Tuttavia, anche se questo è vero, penso che i punteggi CV per tutti i miei 4 modelli dovrebbero essere tutti ottimisti riguardo al proprio punteggio di test vero, cioè l'ordine dovrebbe preservare. Ma quando si applica sul set di dati di test reali, l'ordine si inverte.
L'unica ragione che posso immaginare sarebbe che quel set di dati di test ha una distribuzione diversa rispetto al set di dati di training. Tuttavia, se è davvero il caso, credo che non esista un metodo sotto il sole per curare questo problema.