Boosting AND Bagging Trees (XGBoost, LightGBM)


17

Ci sono molti post sul blog, video di YouTube, ecc. Sulle idee di insaccamento o potenziamento degli alberi. La mia comprensione generale è che lo pseudo codice per ciascuno è:

insacco:

  1. Prendi N campioni casuali di x% dei campioni e y% delle caratteristiche
  2. Adatta il tuo modello (ad es. Albero decisionale) su ciascuno di N
  3. Prevedi con ogni N
  4. Media delle previsioni per ottenere la previsione finale

Aumentare:

  1. Adatta il tuo modello (ad es. Albero decisionale) ai tuoi dati
  2. Ottieni i residui
  3. Adatta il tuo modello ai residui
  4. Vai a 2 per N round di potenziamento
  5. La previsione finale è una somma ponderata dei predittori sequenziali.

Prenderò qualsiasi chiarimento per la mia comprensione di cui sopra, ma la mia domanda prevista è la seguente:

Sia XGBoost che LightGBM hanno parametri che consentono l'insaccamento. L'applicazione non è Bagging OR Boosting (che è ciò di cui parla ogni post del blog), ma Bagging AND Boosting. Qual è lo pseudo codice per dove e quando avvengono il raggruppamento e il potenziamento combinati?

Mi aspettavo che fosse "Bost Boosted Trees", ma sembra che sia "Boosted Bagged Trees". La differenza sembra sostanziale.

Alberi potenziati in sacchi:

  1. Prendi N campioni casuali di x% dei campioni e y% delle caratteristiche
  2. Montare alberi potenziati su ciascuno dei N campioni
  3. Prevedi con ogni N
  4. Media delle previsioni per ottenere la previsione finale

Questo sembra il modo migliore per farlo. Dopotutto, il rischio nell'incremento è l'eccessivo adattamento e il principale vantaggio del insaccamento è la riduzione dell'eccessivo adattamento; insaccare un sacco di modelli potenziati sembra un'ottima idea.

Tuttavia, guardando attraverso, ad esempio, scikit-learn gradient_boosting.py (che esegue il bagging di esempio, ma non la selezione casuale delle funzioni) e raggruppando alcune piccole pepite tra post su LightGBM e XGBoost, sembra che XGBoost e LightGBM funzionino come segue:

Alberi insaccati potenziati:

  1. Adatta un albero decisionale ai tuoi dati
  2. Per i turni di potenziamento in N:
    • Ottieni i residui
    • se mod mod bag_frequency == 0 (ovvero borsa ogni 5 round):
      • Prelevare un singolo campione casuale di x% dei campioni e y% delle caratteristiche; usa questo campione casuale andando avanti
    • adatta l'albero ai residui
  3. La previsione finale è una somma ponderata dei predittori sequenziali.

Correggi la mia comprensione qui e inserisci i dettagli. Boosted Bagged Tree (con solo 1 albero casuale per bag_frequency) non sembra potente come Bagged Boosted Tree.


2
+1 per una domanda interessante e molto ben formulata. E benvenuti nel sito.
mkt - Ripristina Monica il

è necessario un "calcolo dell'errore" per il potenziamento. Fatto male che cade a pezzi. I pesi sono fondamentali per adaboost. Non è un residuo grezzo. ... Non stiamo parlando del gradiente stocastico necessario per aumentare, anche se accelera le cose.
EngrStudent - Ripristina Monica il

Ecco il potenziato-insaccato. Invece di un nuovo albero per ogni passaggio della serie, si ottiene una nuova foresta con output medio. Eugene Tuv e Kari Torkkola. jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
Reinstate Monica

il potenziamento insacchettato farà una foresta di insiemi di serie e otterrà la produzione media. Potrebbe coinvolgere l'eccessivo adattamento che un insieme di serie (potenziato) può realizzare e dare un output più robusto, ma il guadagno non sarà enorme.
EngrStudent - Ripristina Monica il

Risposte:


13

Insaccamento: prelevare N campioni casuali di x% dei campioni e y% delle caratteristiche

Le istanze vengono ripetutamente sottocampionate in Bagging , ma non in Caratteristiche. ( RandomForests , XGBoost e CatBoost fanno entrambe le cose):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Includi un passaggio di inizializzazione nel tuo pseudo codice Boosting per eliminare la ridondanza:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Bost Boosted Trees (come lo chiami tu) è sicuramente un approccio ragionevole, ma diverso da XGBoost o CatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoost e CatBoost sono entrambi basati su Boosting e utilizzano tutti i dati di allenamento. Implementano anche il bagging sottocampionando una volta in ogni Iterazione potenziante:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Se si desidera attenersi a "adattare il modello ai residui", ciò equivarrebbe a "adattare il modello ai residui di dati nell'esempio bootstrap ".


Ulteriori osservazioni :

Non esiste un " modo migliore per farlo " come suggerisci (nessun teorema del pranzo gratuito). "Alberi potenziati in sacchi" potrebbe superare XGBoost su determinati set di dati.

Prelevare un singolo campione casuale di x% dei campioni

Questa linea è confusa. Da dove l'hai preso?

se mod bag_frequency == 0 (ovvero, borsa ogni 5 round):

Questo non dovrebbe essere menzionato nel tuo pseudo codice. Soprattutto quando vi sono altri parametri più importanti esclusi (come il tasso di apprendimento nel potenziamento).


(+1) Bella risposta! Per chiarire: l'OP non è corretto nel dichiarare " Sia XGBoost che LightGBM hanno parametri che consentono l'insaccamento "?
mkt - Ripristina Monica il

Entrambi consentono il bagging: bagging_fraction in LightGBM e sottocampionano in XGBoost . Non sono sicuro, perché mi sono riferito a CatBoost per tutto il tempo. Ma funzionano tutti allo stesso modo per quanto riguarda la domanda.
Laksan Nathan,

Errore mio, ho perso la linea nella tua risposta che lo menziona. Potresti spiegare "il sottocampionamento una volta in ogni Iterazione potenziante "? Vuoi dire che in ogni iterazione potenziante vengono presi molti sottocampioni, gli alberi sono adatti a ciascun sottocampione e quindi il tasso di classificazione errata viene calcolato sulla base degli alberi insaccati e infine i pesi aggiornati? In tal caso, potresti chiarire questo nel tuo pseudocodice?
mkt - Ripristina Monica il

Non vengono disegnati molti sottocampioni, solo uno: invece di adattare il modello a tutte le istanze ponderate, il modello viene addestrato su un campione bootstrap.
Laksan Nathan,

Riguardo a "Prelevare un singolo campione casuale di x% dei campioni"; meglio sarebbe "prendere un singolo campione di x% delle righe". L'ho preso da qui .
Jonathan,
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.