Sto cercando di addestrare un modello di aumento del gradiente con oltre 50.000 esempi con 100 caratteristiche numeriche. XGBClassifier
gestisce 500 alberi in 43 secondi sulla mia macchina, mentre GradientBoostingClassifier
gestisce solo 10 alberi (!) in 1 minuto e 2 secondi 🙁 non mi sono preoccupato di cercare di far crescere 500 alberi perché ci vorranno ore. Sto utilizzando le stesse impostazioni learning_rate
e max_depth
, vedi sotto.
Cosa rende XGBoost così tanto più veloce? Utilizza qualche nuova implementazione per laumento del gradiente che i ragazzi di sklearn non conoscono? O si tratta di “tagliare gli angoli” e far crescere alberi meno profondi?
ps “Sono a conoscenza di questa discussione: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey ma “non ho trovato la risposta lì …
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, gamma=0, learning_rate=0.05, max_delta_step=0, max_depth=10, min_child_weight=1, missing=None, n_estimators=500, nthread=-1, objective="binary:logistic", reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=0, silent=True, subsample=1) GradientBoostingClassifier(init=None, learning_rate=0.05, loss="deviance", max_depth=10, max_features=None, max_leaf_nodes=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, presort="auto", random_state=None, subsample=1.0, verbose=0, warm_start=False)
Commenti
- Credo di ' presto dovrò riformularlo come " perché LightGBM è molto più veloce di XGBoost? " 🙂
Risposta
Dato che hai menzionato “numerico “, immagino che le tue caratteristiche non siano categoriche e abbiano unelevata arità (possono assumere molti valori diversi, e quindi ci sono molti possibili punti di divisione). In tal caso, la crescita degli alberi è difficile poiché ci sono [molte caratteristiche $ \ volte $ molti punti di divisione] da valutare.
La mia ipotesi è che leffetto maggiore derivi dal fatto che XGBoost utilizza unapprossimazione sui punti di divisione. Se hai una funzione continua con 10000 divisioni possibili, XGBoost considera solo “le migliori” 300 divisioni per impostazione predefinita (questa è una semplificazione). Questo comportamento è controllato dal parametro sketch_eps
e puoi leggere ulteriori informazioni al riguardo nel documento . Puoi provare ad abbassarlo e controllare la differenza che fa. Poiché non se ne parla nella documentazione di scikit-learn , immagino che non sia disponibile. Puoi scoprire qual è il metodo XGBoost nel loro articolo (arxiv) .
XGBoost utilizza anche unapprossimazione sulla valutazione di tali punti di divisione . Non so con quale criterio scikit learn stia valutando i tempi intermedi, ma potrebbe spiegare il resto della differenza di tempo.
Adressing Comments
Per quanto riguarda la valutazione dei punti di divisione
Tuttavia, cosa intendevi per “XGBoost utilizza anche unapprossimazione sulla valutazione di tali punti di divisione”? per quanto ho capito, per la valutazione usano la riduzione esatta della funzione obiettivo ottimale, come appare nellequazione (7) dellarticolo.
Per valutare il punto di divisione, dovresti calcolare $ L (y, H_ {i-1} + h_i) $ dove $ L $ è la funzione di costo, $ y $ lobiettivo, $ H_ {i- 1} $ il modello costruito fino ad ora e $ h_i $ laggiunta corrente. Notare che questo non è ciò che sta facendo XGBoost; stanno semplificando la funzione di costo $ L $ con unespansione di Taylor, che porta a una funzione molto semplice da calcolare. Devono calcolare il Gradiente e lAssia di $ L $ rispetto a $ H_ {i-1} $, e possono riutilizzare quel numero per tutte le potenziali divisioni allo stadio $ i $, rendendo veloce il calcolo generale. Puoi controllare Approssimazione della funzione di perdita con Taylor Expansion (CrossValidated Q / A) per maggiori dettagli o la derivazione nel loro articolo.
Il punto è che hanno trovato un modo per approssimare $ L (y, H_ {i-1} + h_i) $ in modo efficiente. Se dovessi valutare completamente $ L $, senza una conoscenza interna che consenta lottimizzazione o lelusione o il calcolo ridondante, ci vorrebbe più tempo per divisione. A questo proposito, è unapprossimazione. Tuttavia, altre implementazioni di boosting del gradiente utilizzano anche funzioni di costo proxy per valutare le suddivisioni e non so se lapprossimazione di XGBoost sia più veloce rispetto alle altre.
Commenti
- Grazie @ Winks, ho letto larticolo e ho visto cosa intendevi per algoritmo di approssimazione per la scelta dei candidati divisi. Tuttavia, che cosa intendevi con " XGBoost utilizza anche unapprossimazione nella valutazione di tali punti di divisione "? per quanto ho capito, per la valutazione stanno usando la riduzione esatta della funzione obiettivo ottimale, come appare nellequazione (7) del documento.
- Ho modificato la mia risposta per indirizzare il tuo commento. Consulta questa domanda / risposta per maggiori dettagli sulla valutazione dei punti di divisione.
- Grazie mille, @Winks! sarebbe fantastico se potessi anche rispondere alla mia domanda più elaborata qui: datascience.stackexchange.com/q/10997/16050
- Questo è unottima risposta. Tripletta!