Încerc să pregătesc un model de creștere a gradientului peste 50.000 de exemple cu 100 de caracteristici numerice. XGBClassifier gestionează 500 copaci în 43 de secunde pe mașina mea, în timp ce GradientBoostingClassifier gestionează doar 10 copaci (!) în 1 minut și 2 secunde 🙁 Nu m-am deranjat încercând să cresc 500 de copaci, deoarece va fi nevoie ore. Folosesc aceleași setări learning_rate și max_depth, a se vedea mai jos.

Ce face XGBoost atât de mult mai repede? Folosește o nouă implementare pentru creșterea gradientului pe care băieții sklearn nu o cunosc? Sau „taie colțurile” și crește copaci mai puțin adânci?

ps Sunt conștient de această discuție: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey dar nu a putut primi răspunsul acolo …

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) 

Comentarii

  • cred că ' va trebui în curând să îl reformulez ca " de ce este LightGBM mult mai rapid decât XGBoost? " 🙂

Răspuns

Deoarece menționați „numeric „caracteristici, cred că caracteristicile dvs. nu sunt categorice și au o ariitate mare (pot lua o mulțime de valori diferite și, prin urmare, există o mulțime de puncte divizate posibile). Într-un astfel de caz, creșterea copacilor este dificilă, deoarece există [o mulțime de caracteristici $ \ times $ o mulțime de puncte divizate] de evaluat.

Cred că cel mai mare efect vine din faptul că XGBoost folosește o aproximare asupra punctelor împărțite. Dacă aveți o caracteristică continuă cu 10000 de divizări posibile, XGBoost ia în considerare doar „cele mai bune” 300 de divizări (aceasta este o simplificare). Acest comportament este controlat de parametrul sketch_eps și puteți citi mai multe despre acesta în document . Puteți încerca să o reduceți și să verificați diferența pe care o face. Deoarece nu există nicio mențiune în documentația scikit-learn , cred că nu este disponibilă. Puteți afla ce este metoda XGBoost în lucrarea lor (arxiv) .

XGBoost folosește, de asemenea, o aproximare pentru evaluarea acestor puncte divizate . Nu știu după ce criteriu scikit learn evaluează împărțirile, dar ar putea explica diferența de timp.


Adresare Comentarii

În ceea ce privește evaluarea punctelor divizate

Cu toate acestea, ce ați vrut să spuneți prin „XGBoost folosește, de asemenea, o aproximare la evaluarea unor astfel de puncte divizate”? Din câte am înțeles, pentru evaluare utilizează reducerea exactă a funcției obiective optime, așa cum apare în ecuația (7) din lucrare.

Pentru a evalua punctul de divizare, va trebui să calculați $ L (y, H_ {i-1} + h_i) $ unde $ L $ este funcția de cost, $ y $ ținta, $ H_ {i- 1} $ modelul construit până acum și $ h_i $ adăugarea curentă. Observați că nu asta face XGBoost; simplifică funcția de cost $ L $ printr-o expansiune Taylor, ceea ce duce la o funcție foarte simplă de calculat. Ei trebuie să calculeze Gradientul și Hessianul de $ L $ în ceea ce privește $ H_ {i-1} $ și pot reutiliza acele cifre pentru toate divizările potențiale în etapa $ i $, făcând calculul overral rapid. Puteți verifica Aproximarea funcției de pierdere cu extinderea Taylor (CrossValidated Q / A) pentru mai multe detalii sau derivarea în lucrarea lor.

Ideea este că au găsit o modalitate de a aproxima în mod eficient $ L (y, H_ {i-1} + h_i) $. Dacă ar fi să evaluați în totalitate $ L $, fără cunoștințe privilegiate care să permită optimizarea sau evitarea sau calculul redundant, ar dura mai mult timp pe împărțire. În acest sens, este o aproximare. Cu toate acestea, alte implementări de creștere a gradientului folosesc, de asemenea, funcții de cost proxy pentru a evalua divizările și nu știu dacă aproximarea XGBoost este mai rapidă în acest sens decât celelalte.

Comentarii

  • Mulțumesc @Winks, am citit lucrarea și văd ce ai vrut să spui prin algoritmul de aproximare pentru alegerea candidaților divizați. Cu toate acestea, ce ați vrut să spuneți prin " XGBoost folosește, de asemenea, o aproximare la evaluarea acestor puncte divizate " Din câte am înțeles, pentru evaluare utilizează reducerea exactă a funcției obiective optime, așa cum apare în ecuația (7) din lucrare.
  • Am editat răspunsul meu pentru a vă adresa comentariul. Verificați acest Q / A pentru mai multe detalii despre evaluarea punctelor împărțite.
  • Mulțumesc mult, @Winks! ar fi minunat dacă ați putea răspunde și la întrebarea mea mai elaborată aici: datascience.stackexchange.com/q/10997/16050
  • Acesta este un mare răspuns. Hat-trick!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *