Dlaczego xgboost jest o wiele szybszy niż sklearn GradientBoostingClassifier?


29

Próbuję wytrenować model zwiększania gradientu na ponad 50 tysiącach przykładów ze 100 funkcjami numerycznymi. XGBClassifierobsługuje 500 drzew w ciągu 43 sekund na mojej maszynie, a GradientBoostingClassifierobsługuje tylko 10 drzew (!) w 1 minutę i 2 sekundy :( Nie zawracałem sobie głowy próbą wyhodowania 500 drzew, ponieważ zajmie to godziny. Używam tego samego learning_ratei max_depthustawień patrz poniżej.

Co sprawia, że ​​XGBoost jest o wiele szybszy? Czy wykorzystuje jakąś nowatorską implementację do zwiększania gradientu, której faceci nie wiedzą? A może jest to „ścinanie zakrętów” i wzrost płytszych drzew?

ps Jestem świadomy tej dyskusji: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey, ale nie mogłem tam znaleźć odpowiedzi ...

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)

2
Chyba niedługo będę musiał to sformułować jako „dlaczego LightGBM jest o wiele szybszy niż XGBoost?” :)
ihadanny

Odpowiedzi:


25

×

Domyślam się, że największy efekt wynika z faktu, że XGBoost używa przybliżenia punktów podziału. Jeśli masz funkcję ciągłą z 10000 możliwymi podziałami, XGBoost domyślnie bierze pod uwagę tylko „najlepsze” 300 podziałów (jest to uproszczenie). To zachowanie jest kontrolowane przez sketch_epsparametr i możesz przeczytać więcej na ten temat w dokumencie . Możesz spróbować go obniżyć i sprawdzić różnicę. Ponieważ nie ma wzmianki o tym w dokumentacji scikit-learn , myślę, że nie jest ona dostępna. Możesz dowiedzieć się, jaka jest metoda XGBoost w ich pracy (arxiv) .

XGBoost stosuje również przybliżenie oceny takich punktów podziału. Nie wiem, według którego kryterium scikit uczy się ocenia podziały, ale mogłoby to wyjaśnić resztę różnicy czasu.


Adresowanie komentarzy

Odnośnie oceny punktów podziału

Co jednak miałeś na myśli przez „XGBoost używa również przybliżenia przy ocenie takich punktów podziału”? o ile rozumiem, do oceny używają dokładnej redukcji optymalnej funkcji celu, jak pokazano w równaniu (7) w pracy.

L.(y,H.ja-1+hja)L.yH.ja-1hjaL.L.H.ja-1ja

L.(y,H.ja-1+hja)L.


Dzięki @Winks, czytam gazetę i widzę, co masz na myśli przez algorytm aproksymacyjny dla wybierania podzielonych kandydatów. Co jednak miałeś na myśli przez „XGBoost używa również przybliżenia przy ocenie takich punktów podziału”? o ile rozumiem, do oceny używają dokładnej redukcji optymalnej funkcji celu, jak pokazano w równaniu (7) w pracy.
ihadanny,

Zredagowałem swoją odpowiedź, aby zaadresować twój komentarz. Sprawdź to Q / A, aby uzyskać więcej informacji na temat oceny punktów podziału.
Mruga

Wielkie dzięki, @Winks! byłoby wspaniale, gdybyś mógł również odpowiedzieć na moje bardziej szczegółowe pytanie tutaj: datascience.stackexchange.com/q/10997/16050
ihadanny

To świetna odpowiedź. Hat trik !
eliasah
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.