Discussione su overfit in xgboost


20

La mia configurazione è la seguente:

Sto seguendo le linee guida in "Modellazione predittiva applicata". Quindi ho filtrato le funzioni correlate e finisco con il seguente:

  • 4900 punti dati nel set di addestramento e 1600 punti dati nel set di test.
  • Ho 26 funzionalità e l'obiettivo è una variabile continua.

Applico 5 volte la crossvalidation per addestrare i modelli usando il caretpacchetto. Quando applico un modello MARS, ottengo un errore assoluto medio (MAE) di circa 4 sul set di allenamento e sul set di test.

Comunque applicando xgboost (l'algoritmo dell'albero o quello lineare) ottengo qualcosa come 0,32 (!) Sul set di allenamento e 2.4 sul set di test.

Pertanto, se l'errore del test è 8 volte l'errore dell'allenamento, direi: Ho adattato troppo i dati di allenamento. Comunque ho ancora un errore minore nel test.

Uso i seguenti parametri su xgboost:

  • nrounds = 1000e eta = 0.01(aumentare i nrounds e diminuire l'eta potrebbe aiutare ma esaurisco la memoria e il tempo di esecuzione è troppo lungo)
  • max_depth = 16: se metto a confronto altri post e il valore predefinito 6, questo sembra grande ma il problema è piuttosto complesso - forse 16 non è troppo grande in questo caso.
  • colsample_bytree = 0.7, subsample = 0.8e min_child_weight = 5: facendo questo, provo a ridurre l'eccesso di vestibilità.

Se riduco max_depth, l'allenamento e l'errore di test si avvicinano, ma c'è ancora un grande divario e l'errore di test è maggiore (un po 'sopra 3).

Usando il booster lineare ottengo all'incirca lo stesso treno ed errore di test su paremeters ottimali:

  • lambda = 90 e `alpha = 0: trovato per convalida incrociata, lambda dovrebbe prevenire un eccesso di vestibilità.
  • colsample_bytree = 0.8, subsample = 0.8e min_child_weight = 5: facendo questo, provo a ridurre l'eccesso di vestibilità.

La mia sensazione è che xgboost si vesti ancora, ma l'errore di allenamento e per quanto posso vedere nel test in tempo reale (ho usato i modelli xgboost e un loro insieme in realtà per 4 giorni) sembra ok-ish (l'errore è più grande dell'errore del test ma ci sono più incertezze nella vita reale riguardo alla previsione di funzionalità e altre variabili).

Cosa ne pensi: posso accettare un eccesso di vestibilità se (se possibile) le prestazioni della vita reale sono superiori? Xgboost nella mia impostazione tende a sovrautilizzare?

Risposte:


34

L'adattamento eccessivo è così grave che non dovresti scegliere un modello che si adatta troppo, anche se il suo errore di prova è più piccolo? No. Ma dovresti avere una giustificazione per sceglierlo.

Questo comportamento non è limitato a XGBoost. È un filo conduttore tra tutte le tecniche di apprendimento automatico; trovare il giusto compromesso tra underfitting e overfitting. La definizione formale è il compromesso di bias-varianza (Wikipedia) .

Il compromesso della varianza

Quella che segue è una semplificazione del compromesso di bias-varianza, per aiutare a giustificare la scelta del modello.

  • Diciamo che un modello ha un bias elevato se non è in grado di utilizzare completamente le informazioni nei dati. Fa troppo affidamento su informazioni generali, come il caso più frequente, la media della risposta o poche potenti funzionalità. La distorsione può derivare da ipotesi errate, ad esempio supponendo che le variabili siano normalmente distribuite o che il modello sia lineare.

  • Diciamo che un modello ha una varianza elevata se utilizza troppe informazioni dai dati. Si basa su informazioni che sono rivelate solo nel set di formazione che gli è stato presentato, che non si generalizza abbastanza bene. In genere, il modello cambia molto se si modifica il set di allenamento, da cui il nome "varianza elevata".

Tali definizioni sono molto simili alle definizioni di underfitting e overfitting. Tuttavia, tali definizioni sono spesso troppo semplificate per essere opposte, come in

  • Il modello è inadeguato se sia l'addestramento che l'errore di test sono elevati. Ciò significa che il modello è troppo semplice.
  • Il modello è troppo adatto se l'errore del test è superiore all'errore di addestramento. Ciò significa che il modello è troppo complesso.

Tali semplificazioni sono ovviamente utili, in quanto aiutano a scegliere la giusta complessità del modello. Ma trascurano un punto importante, il fatto che (quasi) ogni modello ha sia una componente di bias che una varianza. La descrizione di underfitting / overfitting ti dice che hai troppa distorsione / troppa varianza, ma (quasi) hai sempre entrambe .

Se vuoi maggiori informazioni sul compromesso di bias varianza, sono un sacco di visualizzazione utile e buona risorsa disponibile tramite Google. Ogni libro di testo di apprendimento automatico avrà una sezione sul compromesso della variazione di bias, eccone alcuni

  • Un'introduzione all'apprendimento statistico e agli elementi dell'apprendimento statistico (disponibile qui) .
  • Pattern Recognition and Machine Learning, di Christopher Bishop.
  • Machine Learning: A Probabilistic Perspective, di Kevin Murphy.

Inoltre, un bel post sul blog che mi ha aiutato ad afferrare è Comprensione del pregiudizio di pregiudizio di Scott Fortmann-Roe .

Applicazione al tuo problema

Quindi hai due modelli,

Train MAETest MAEMARTE~4.0~4.0Bassa varianza, maggiore inclinazione,XGBoost~0.3~2.4Varianza più alta, distorsione inferiore,

e devi sceglierne uno. Per fare ciò, è necessario definire cos'è un modello migliore. I parametri che dovrebbero essere inclusi nelle tue decisioni sono la complessità e le prestazioni del modello.

  • Quante "unità" di complessità sei disposto a scambiare con una "unità" di prestazione?
    • Una maggiore complessità è associata a una maggiore varianza. Se vuoi che il tuo modello si generalizzi bene su un set di dati un po 'diverso da quello su cui ti sei allenato, dovresti mirare a una minore complessità.
    • Se si desidera un modello facilmente comprensibile, è possibile farlo a scapito delle prestazioni riducendo la complessità del modello.
    • Se stai cercando le migliori prestazioni su un set di dati che conosci proviene dallo stesso processo generativo del tuo set di addestramento, puoi manipolare la complessità al fine di ottimizzare il tuo errore di test e utilizzarlo come metrica. Questo accade quando il tuo set di allenamento viene campionato casualmente da un set più grande e il tuo modello verrà applicato su questo set. Questo è il caso della maggior parte delle competizioni di Kaggle, per esempio.

L'obiettivo qui non è quello di trovare un modello che "non si adatta troppo". Serve per trovare il modello che presenta il miglior compromesso di bias-varianza. In questo caso, direi che la riduzione della distorsione realizzata dal modello XGBoost è abbastanza buona da giustificare l'aumento della varianza.

Cosa sai fare

Tuttavia, probabilmente puoi fare di meglio sintonizzando gli iperparametri.

  • Aumentare il numero di round e ridurre il tasso di apprendimento è una possibilità. Qualcosa di "strano" nell'aumento del gradiente è che eseguirlo ben oltre il punto in cui l'errore di allenamento ha raggiunto lo zero sembra migliorare ancora l'errore del test (come discusso qui: è più profondo solo quando il fondale è buono? ). Puoi provare ad allenare il tuo modello un po 'più a lungo nel tuo set di dati dopo aver impostato gli altri parametri,

  • La profondità degli alberi che coltivi è un ottimo punto di partenza. Devi notare che per ogni unità di profondità, raddoppi il numero di foglie da costruire. Se dovessi coltivare alberi di taglia due invece di taglia 16, ci vorrebbe1/214del tempo! Dovresti provare a far crescere alberi più piccoli. Il motivo è che la profondità dell'albero dovrebbe rappresentare il grado di interazione delle caratteristiche . Questo può essere un gergo, ma se le tue caratteristiche hanno un grado di interazione di 3 (approssimativamente: una combinazione di 4 caratteristiche non è più potente di una combinazione di 3 di queste caratteristiche + la quarta), allora crescendo alberi di dimensioni maggiori di 3 è dannoso. Due alberi di profondità tre avranno un potere di generalizzazione maggiore di un albero di profondità quattro. Questo è un concetto piuttosto complicato e non ci entrerò in questo momento, ma puoi controllare questa raccolta di documenti per iniziare. Inoltre, nota che gli alberi profondi portano a una varianza elevata!

  • L'uso del sottocampionamento, noto come insaccamento , è ottimo per ridurre la varianza. Se i tuoi singoli alberi hanno una varianza elevata, l'insaccamento farà la media degli alberi e la media avrà una varianza inferiore rispetto ai singoli alberi. Se, dopo aver ottimizzato la profondità dei tuoi alberi, riscontri ancora una varianza elevata, prova ad aumentare il sottocampionamento (ovvero riduci la frazione dei dati utilizzati). Anche il sottocampionamento dello spazio delle caratteristiche raggiunge questo obiettivo.


1
Non si dovrebbe commentare dicendo "grazie" ma per questa risposta lunga e interessante vorrei dire "grazie". Avevo già qualche conoscenza di alcune delle cose che scrivi ma questo è stato davvero ben messo insieme. Esaminerò alcuni dei tuoi riferimenti e farò crescere nuovi alberi e forse tornerò con un commento. Per ora: grazie! Grande!
Ric

Il link alla pagina delle interazioni stat.columbia.edu/~jakulin/Int è davvero fantastico!
Ric

Ho seguito il tuo consiglio e ho limitato la profondità degli alberi a 3, ma ho impiegato circa 1200 e i risultati sono fantastici: calcoli molto rapidi, differenza tra treno e prova ridotta e ancora di buon livello. Il resto della storia è qui: stats.stackexchange.com/questions/205858/…
Ric
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.