Ik “probeer een model voor het verhogen van het verloop te trainen met meer dan 50.000 voorbeelden met 100 numerieke kenmerken. XGBClassifier
verwerkt 500 bomen binnen 43 seconden op mijn computer, terwijl GradientBoostingClassifier
slechts 10 bomen (!) in 1 minuut en 2 seconden verwerkt 🙁 Ik heb niet de moeite genomen om 500 bomen te laten groeien, omdat het uur. Ik gebruik dezelfde learning_rate
en max_depth
instellingen, zie hieronder.
Wat maakt XGBoost zo veel sneller? Gebruikt het een of andere nieuwe implementatie voor het verhogen van de gradiënt die sklearn-jongens niet kennen? Of is het “hoeken afsnijden” en ondiepere bomen laten groeien?
ps Ik ben me bewust van deze discussie: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey maar kon het antwoord daar niet vinden …
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)
Reacties
- denk dat ik ' zal het binnenkort anders moeten formuleren als " waarom is LightGBM zo veel sneller dan XGBoost? " 🙂
Antwoord
Aangezien u “numeriek “features, ik denk dat je features niet categorisch zijn en een hoge ariteit hebben (ze kunnen veel verschillende waarden aannemen, en dus zijn er veel mogelijke splitpunten). In dat geval is het kweken van bomen moeilijk omdat er [veel features $ \ maal $ veel splitpoints] zijn om te evalueren.
Ik vermoed dat het grootste effect komt van het feit dat XGBoost gebruikt een benadering van de splitpunten. Als je een continue feature hebt met 10.000 mogelijke splitsingen, beschouwt XGBoost standaard alleen “de beste” 300 splitsingen (dit is een vereenvoudiging). Dit gedrag wordt bepaald door de parameter sketch_eps
, en u kunt er meer over lezen in het document . U kunt proberen het te verlagen en het verschil te zien dat het maakt. Aangezien er geen melding van wordt gemaakt in de scikit-learn-documentatie , denk ik dat het niet beschikbaar is. U kunt leren wat de XGBoost-methode is in de hun paper (arxiv) .
XGBoost gebruikt ook een benadering voor de evaluatie van dergelijke splitsingspunten . Ik weet niet volgens welk criterium Scikit Learn de splitsingen evalueert, maar het zou de rest van het tijdsverschil kunnen verklaren.
Adressing Comments
Met betrekking tot de evaluatie van splitsingspunten
Wat bedoelde u echter met “XGBoost gebruikt ook een benadering voor de evaluatie van dergelijke splitsingspunten”? voor zover ik begrijp, gebruiken ze voor de evaluatie de exacte reductie in de optimale objectieve functie, zoals deze voorkomt in vergelijking (7) in de paper.
Om het splitsingspunt te evalueren, zou je $ L (y, H_ {i-1} + h_i) $ moeten berekenen waarbij $ L $ de kostenfunctie is, $ y $ het doel, $ H_ {i- 1} $ het model dat tot nu toe is gebouwd, en $ h_i $ de huidige toevoeging. Merk op dat dit niet is wat XGBoost doet; ze vereenvoudigen de kostenfunctie $ L $ door een Taylor Expansion, wat leidt tot een zeer eenvoudige functie om te berekenen. Ze moeten het verloop en de Hessiaan van $ L $ berekenen ten opzichte van $ H_ {i-1} $, en ze kunnen dat aantal hergebruiken voor alle mogelijke splitsingen in fase $ i $, waardoor de overrale berekening snel verloopt. Je kunt Verlies functie benadering met Taylor Expansion (CrossValidated Q / A) bekijken voor meer details, of de afleiding in hun paper.
De punt is dat ze een manier hebben gevonden om $ L (y, H_ {i-1} + h_i) $ efficiënt te benaderen. Als u $ L $ volledig zou evalueren, zonder voorkennis die optimalisatie of vermijding of overtollige berekening mogelijk maakt, zou het meer tijd kosten per splitsing. In dit opzicht is het een benadering. Andere implementaties die het verloop stimuleren, gebruiken echter ook proxy-kostenfuncties om de splitsingen te evalueren, en ik weet niet of de XGBoost-benadering in dit opzicht sneller is dan de andere.
Opmerkingen
- Bedankt @Winks, ik heb de paper gelezen en zie wat je bedoelde met het benaderingsalgoritme voor het kiezen van gesplitste kandidaten. Wat bedoelde u echter met " XGBoost gebruikt ook een benadering voor de evaluatie van dergelijke splitsingspunten "? voor zover ik begrijp, gebruiken ze voor de evaluatie de exacte reductie in de optimale objectieve functie, zoals die wordt weergegeven in vergelijking (7) in de paper.
- Ik heb mijn antwoord aangepast om je opmerking te adresseren. Bekijk de deze Q / A voor meer details over de evaluatie van splitpunten.
- Heel erg bedankt, @Winks! zou geweldig zijn als je ook mijn uitgebreidere vraag hier zou kunnen beantwoorden: datascience.stackexchange.com/q/10997/16050
- Dit is een geweldig antwoord. Hattrick!