Próbuję wytrenować model zwiększania gradientu na 50 000 przykładów ze 100 cechami numerycznymi. XGBClassifier obsługuje 500 drzew w ciągu 43 sekund na moim komputerze, podczas gdy GradientBoostingClassifier obsługuje tylko 10 drzew (!) w 1 minutę i 2 sekundy 🙁 Nie zawracałem sobie głowy próbą wyhodowania 500 drzew, ponieważ zajmie to godzin. Używam tych samych ustawień learning_rate i max_depth, patrz poniżej.

Co sprawia, że XGBoost tak bardzo szybciej? Czy używa jakiejś nowatorskiej implementacji do wzmocnienia gradientu, którego nie znają ludzie od sklearn? A może jest to „ścinanie rogów” i hodowanie płytszych drzew?

ps Wiem o tej dyskusji: https://www.kaggle.com/c/higgs-boson/forums/t/10335/xgboost-post-competition-survey , ale nie można 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) 

Komentarze

  • zgaduję, że ' wkrótce będę musiał przeformułować to na " dlaczego LightGBM jest o wiele szybszy niż XGBoost? " 🙂

Odpowiedź

Ponieważ wspominasz o „numerycznej „cechy, wydaje mi się, że Twoje funkcje nie są kategoryczne i mają wysoką jakość (mogą przyjmować wiele różnych wartości, a zatem istnieje wiele możliwych punktów podziału). W takim przypadku sadzenie drzew jest trudne, ponieważ istnieje [wiele funkcji $ \ razy $ dużo punktów podziału] do oceny.

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żliwych podziałów, XGBoost domyślnie bierze pod uwagę tylko „najlepsze” 300 podziałów (jest to uproszczenie). To zachowanie jest kontrolowane przez parametr sketch_eps, o którym więcej można przeczytać w dokumencie . Możesz spróbować go obniżyć i sprawdzić, jaką różnicę robi. Ponieważ nie ma o tym wzmianki w dokumentacji scikit-learn , przypuszczam, że nie jest ona dostępna. Możesz dowiedzieć się, czym jest metoda XGBoost w ich artykule (arxiv) .

XGBoost używa również przybliżenia do oceny takich punktów podziału . Nie wiem, według którego kryterium scikit learn ocenia podziały, ale mogłoby to wyjaśnić pozostałą różnicę czasu.


Adresowanie komentarzy

Jeśli chodzi o ocenę punktów podziału

Jednak co miałeś na myśli mówiąc „XGBoost wykorzystuje również przybliżenie do oceny takich punktów podziału”? o ile rozumiem, do oceny używają dokładnej redukcji optymalnej funkcji celu, jak widać w równaniu (7) w artykule.

Aby obliczyć punkt podziału, musiałbyś obliczyć $ L (y, H_ {i-1} + h_i) $, gdzie $ L $ to funkcja kosztu, $ y $ cel, $ H_ {i- 1} $ model zbudowany do tej pory i $ h_i $ bieżący dodatek. Zauważ, że to nie jest to, co robi XGBoost; upraszczają funkcję kosztu $ L $ przez rozszerzenie Taylora, co prowadzi do bardzo prostej funkcji do obliczenia. Muszą obliczyć Gradient i Hesjan z $ L $ w odniesieniu do $ H_ {i-1} $ i mogą ponownie użyć tej liczby dla wszystkich potencjalnych podziałów na etapie $ i $, dzięki czemu obliczenia nadralne są szybkie. Możesz sprawdzić Przybliżenie funkcji straty z rozszerzeniem Taylora (CrossValidated Q / A) , aby uzyskać więcej szczegółów lub wyprowadzenie w ich artykule.

Chodzi o to, że znaleźli sposób na efektywne przybliżenie $ L (y, H_ {i-1} + h_i) $. Gdybyś miał ocenić L $ w całości, bez wewnętrznej wiedzy pozwalającej na optymalizację lub unikanie lub nadmiarowe obliczenia, zajęłoby to więcej czasu na podział. W tym względzie jest to przybliżenie. Jednak inne implementacje zwiększania gradientu również używają funkcji kosztu proxy do oceny podziałów i nie wiem, czy aproksymacja XGBoost jest szybsza pod tym względem niż inne.

Komentarze

  • Dzięki @Winks, przeczytałem artykuł i widzę, co masz na myśli, mówiąc o algorytmie przybliżenia do wybierania kandydatów do podziału. Jednak co miałeś na myśli, mówiąc ", XGBoost również używa przybliżenia do oceny takich punktów podziału "? o ile rozumiem, do oceny używają dokładnej redukcji optymalnej funkcji celu, jak to pojawia się w równaniu (7) w artykule.
  • Zredagowałem swoją odpowiedź, aby odnieść się do twojego komentarza. Przeczytaj ten Q / A , aby uzyskać więcej informacji na temat oceny punktów podziału.
  • Wielkie dzięki, @ Winks! byłoby wspaniale, gdybyś mógł również tutaj odpowiedzieć na moje bardziej szczegółowe pytanie: datascience.stackexchange.com/q/10997/16050
  • To jest świetna odpowiedź. Hat-trick!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *