È possibile peggiorare il modello dopo l'ottimizzazione?

Sep 21 2020

Recentemente sto cercando di ottimizzare i modelli ma per qualche motivo, ogni volta che provo a eseguire l'ottimizzazione, il punteggio del modello alla fine è peggiore di prima, quindi credo di fare qualcosa di sbagliato.

per ottimizzare il mio modello definisco param grid e poi mi adeguo ai dati del treno e poi in base ai risultati eseguo di nuovo con nre parametri, es.

#ROUND 1
param_grid={
    'max_depth': [3,4,5],
    'learning_rate':[0.1,0.01,0.05],
    'gamma': [0,0.25,1.0],
    'reg_lambda':[0,1.0,10.0],
    'scale_pos_weight':[1,3,5]
}

grid_search = GridSearchCV(estimator = clf_xgb, param_grid = param_grid, 
                          cv = 3, n_jobs = -1, verbose = 2)
grid_search.fit(X_train,y_train)
grid_search.best_params_

>>>.....

(e ora in base al risultato cambiando i parametri ...)

dopo questo passaggio scelgo i migliori iperparametri ed eseguo il modello;

clf_xgb=xgb.XGBClassifier(seed=42,
                         objective='binary:logistic',
                         gamma=0,
                         learn_rate=0.7,
                         max_depth=6,
                         reg_lambda=0.8,
                         scale_pos_weight=1,
                         subsample=0.9,
                         cilsample_bytree=0.5)

clf_xgb.fit(X_train,
           y_train,
           verbose=True,
           early_stopping_rounds=10,
           eval_metric='aucpr',
           eval_set=[(X_test,y_test)])

Il problema è che quando controllo il punteggio del modello

clf_xgb.score(X_test,y_test)

Ottengo sempre un punteggio inferiore a quello ottenuto prima dell'ottimizzazione, il che mi fa sospettare che mi manchi qualcosa nel modo in cui lo faccio / principio di base in questo processo.

È possibile che dopo aver eseguito l'ottimizzazione il mio punteggio non migliori (e anche peggiore?)? Dov'è il mio errore? Ci sono altri parametri che potrebbero influenzare o migliorare il mio modello?

Risposte

4 aivanov Sep 29 2020 at 04:34

È possibile che dopo aver eseguito l'ottimizzazione il mio punteggio non migliori (e anche peggiore?)?

Sì, in teoria, per pura fortuna, è possibile che la tua ipotesi iniziale, prima dell'ottimizzazione degli iperparametri, fornisca risultati migliori rispetto alla migliore combinazione di parametri trovata nella griglia dei parametri. Tuttavia, supponendo che si disponga di dati sufficienti e che la griglia dei parametri sia sufficientemente ampia, è piuttosto improbabile che l'ottimizzazione degli iperparametri non sia in grado di trovare risultati migliori. Tale comportamento indica piuttosto che qualcosa non va nel tuo approccio o nei tuoi dati.

Se compreso correttamente, la scelta dei parametri migliori si basa sui risultati del cv sui dati di allenamento, mentre nella tua corsa finale la performance viene valutata sulla base del set di dati di test. Se la distribuzione dei dati di addestramento e di prova differiscono in modo significativo, potrebbe portare alla situazione in cui i parametri che forniscono i migliori risultati sui dati di addestramento hanno prestazioni scadenti sui dati di prova.

Dov'è il mio errore?

Come già accennato da altri, i parametri che stai testando dopo l'ottimizzazione non sono stati inclusi nella griglia dei parametri. In questo caso non è corretto parlare delle prestazioni del modello "dopo aver eseguito l'ottimizzazione".

Suggerisco quanto segue per indagare e risolvere il problema

  • Invece di utilizzare i parametri hardcoded nella XGBClassifier chiamata, utilizzare i parametri ottimali trovati dal processo di ottimizzazione, ad es grid_search.best_params_. Inoltre, se pensi che subsamplee cilsample_bytree(un errore di battitura?) Siano parametri rilevanti, includili nella griglia dei parametri.
  • Aumentare il cvparametro ad es. 5-10, i risultati con cv = 3potrebbero essere molto instabili. Puoi valutare la stabilità dei tuoi risultati attuali utilizzando diversi semi casuali e ripetendo l'intero esercizio.
  • Assicurati di utilizzare i parametri coerenti nel processo di ottimizzazione e nella valutazione finale, o semplicemente includi questi parametri nella griglia dei parametri, se possibile. In particolare, controlla early_stopping_roundse eval_metric.

Ci sono altri parametri che potrebbero influenzare o migliorare il mio modello?

  • Dal tuo codice non è chiaro quanti round usi. Aumentalo n_estimatorso includilo nella griglia dei parametri.
  • Dato che usi AUCPR potresti dover impostare esplicitamente il parametro maximize=True, altrimenti nella tua corsa finale potresti minimizzare l'AUCPR, il che potrebbe spiegare scarsi risultati.
N.Kiefer Sep 24 2020 at 17:24

Questa domanda è un po 'sbagliata. Non puoi peggiorare dopo l'ottimizzazione, altrimenti non sarebbe l'ottimizzazione! (Nel peggiore dei casi hai le stesse prestazioni di prima, ottenendo esattamente gli stessi parametri che avevi già)

Come sottolinea Grzegorz in un commento, prima di tutto il tuo elenco di parametri non è completo e non contiene i valori che utilizzi in seguito. Ad esempio il tasso di apprendimento, ma anche max_depth. In secondo luogo, una ricerca sulla griglia in cui non sai davvero dove cercare dovrebbe contenere una varianza molto maggiore per i parametri. Controlli [0.1, 0.01, 0.05]il tasso di apprendimento, ma l'hai controllato [0.0001, 0.001, 1.]? Il tasso di apprendimento potrebbe essere un cattivo esempio qui, ma spero che ottenga il punto, potresti voler controllare prima grandezza / scala, ad esempio potenze di dieci, prima di controllare piccole variazioni.

A seconda del set di dati, la differenza tra corse con gli stessi valori potrebbe derivare anche da seed diversi! Controlla di aver impostato sempre lo stesso seme o provalo abbastanza volte con semi diversi per ottenere una risposta comparabile (ad esempio con KFold).

Il tuo modello converge anche per ogni allenamento? Dove ti assicuri di allenarti abbastanza a lungo? Puoi tracciare la perdita per l'addestramento e il campione di prova e verificare se sta convergendo o meno. Questo può essere controllato con n_estimatorsxgboost credo.

BrianSpiering Sep 24 2020 at 22:08

Non c'è niente di sbagliato nel tuo codice o processo. Spesso le prestazioni del machine learning sul set di dati di test sono inferiori rispetto alle prestazioni sul set di dati di training. Il tuo modello non si sta generalizzando perfettamente ai dati che non ha visto prima (cioè, il set di dati di prova).