03 · Nadzorowane · 4 min czytania · Interaktywne · aktualizacja
Czym różnią się XGBoost, LightGBM i CatBoost i który wybrać?
W skrócie
XGBoost, LightGBM i CatBoost to szybkie biblioteki wzmacniania gradientowego. Różnią się sposobem budowy drzew, obsługą kategorii i domyślnymi ustawieniami.
Co to jest
XGBoost, LightGBM i CatBoost to trzy najpopularniejsze biblioteki implementujące wzmacnianie gradientowe drzew decyzyjnych. Wszystkie budują model jako sumę płytkich drzew dodawanych po kolei, ale różnią się sposobem wzrostu drzew, obsługą zmiennych kategorycznych i braków danych, szybkością oraz domyślną regularyzacją. W praktyce dają zbliżone wyniki; różnice ujawniają się w czasie treningu i wygodzie pracy z konkretnymi danymi.
XGBoost (Chen i Guestrin, 2016) spopularyzował boosting w konkursach uczenia maszynowego dzięki regularyzacji wbudowanej w funkcję celu i bardzo wydajnej implementacji. LightGBM (Ke i in., 2017, Microsoft) postawił na szybkość przy dużych zbiorach. CatBoost (Prokhorenkova i in., 2018, Yandex) skupił się na poprawnej obsłudze cech kategorycznych i odporności na ustawienia domyślne.
Wszystkie trzy mają interfejs zgodny ze scikit-learn (XGBClassifier, LGBMClassifier, CatBoostClassifier), więc można je wymieniać w tym samym potoku.
Mechanizm — dlaczego tak działa
Wspólny rdzeń. Wszystkie trzy używają przybliżenia drugiego rzędu: przy budowie drzewa liczą dla każdego przykładu gradient i drugą pochodną straty, co pozwala wprost obliczyć optymalną wartość każdego liścia i zysk z każdego podziału. Funkcja celu zawiera karę za liczbę liści i wielkość wartości w liściach (parametry typu λ i γ), więc regularyzacja jest częścią samego algorytmu budowy drzewa.
Histogramy. Zamiast sprawdzać każdą możliwą wartość progu, cechy ciągłe dzieli się na koszyki (typowo 255). Szukanie podziału sprowadza się do przejścia po histogramie, co skraca czas o rzędy wielkości i zmniejsza zużycie pamięci. Ten trik stosują dziś wszystkie trzy biblioteki, a także HistGradientBoosting w scikit-learn.
Kształt drzew. XGBoost domyślnie rośnie poziomami (wszystkie węzły na danej głębokości). LightGBM rośnie liśćmi: zawsze dzieli ten liść, który daje największy spadek straty, co przy tej samej liczbie liści daje dokładniejsze, ale głębsze i bardziej skłonne do przeuczenia drzewa — dlatego jego głównym parametrem jest num_leaves. CatBoost używa drzew symetrycznych (oblivious): na danej głębokości wszystkie węzły zadają to samo pytanie. Takie drzewa są mniej elastyczne, ale stabilne i bardzo szybkie w przewidywaniu.
Kategorie. LightGBM i XGBoost potrafią dzielić zmienne kategoryczne natywnie, grupując kategorie według statystyk gradientu. CatBoost stosuje uporządkowane kodowanie średnią celu: wartość kategorii dla danego przykładu liczy się tylko z przykładów, które w losowej permutacji były przed nim. To zapobiega przeciekowi informacji o etykiecie, który przy naiwnym kodowaniu średnią prowadzi do przeuczenia. Na podobnej idei opiera się tzw. ordered boosting.
Braki danych. Wszystkie trzy obsługują NaN bez imputacji: przy każdym podziale uczą się, w którą stronę wysyłać przykłady z brakiem, wybierając kierunek, który bardziej zmniejsza stratę.
Przyspieszenia LightGBM. GOSS (próbkowanie przykładów z uwzględnieniem wielkości gradientu — małe gradienty są już „nauczone”) i EFB (łączenie rzadkich, wzajemnie wykluczających się cech w jedną) zmniejszają liczbę danych do przejrzenia.
Na przykładzie
Titanic: 891 pasażerów, 7 cech: płeć i port zaokrętowania jako kategorie, klasa jako liczba, wiek ze 177 brakami i port z 2 brakami pozostawionymi jako NaN, rodzina na pokładzie, cena biletu. Bez imputacji i kodowania, 5-krotna walidacja krzyżowa warstwowa (random_state=0), 300 drzew ze współczynnikiem uczenia 0,05: XGBoost (głębokość 4) — 82,3%, CatBoost (głębokość 4) — 82,2%, HistGradientBoostingClassifier ze scikit-learn — 81,6%, LightGBM (15 liści) — 81,4%. Dla porównania regresja logistyczna (kodowanie zero-jedynkowe, wiek uzupełniony medianą) — 78,9%. Odchylenia między częściami walidacji wynoszą 2–3 punkty procentowe, więc różnice między bibliotekami są tu w granicach szumu.
Różnice widać w czasie. Na syntetycznym zbiorze 100 000 wierszy × 20 cech, 100 drzew głębokości 3, na jednym laptopie: klasyczny GradientBoostingClassifier ze scikit-learn trenował się 84,7 s, wersja histogramowa 1,8 s, XGBoost 0,34 s, LightGBM 0,51 s, CatBoost 1,25 s. Konkretne czasy zależą od sprzętu, ale przepaść między podejściem dokładnym a histogramowym — kilkadziesiąt razy — jest typowa.
Dane: Titanic
W praktyce
- Kategorie natywnie: XGBoost —
enable_categorical=Truez kolumnami typucategory; LightGBM — kolumnycategorylubcategorical_feature; CatBoost —cat_features=[...]. - Zawsze wczesne zatrzymanie na zbiorze walidacyjnym:
early_stopping_rounds(XGBoost, LightGBM) lubearly_stopping_rounds/od_type(CatBoost). - Kluczowe parametry: współczynnik uczenia (0,01–0,1),
max_depth(XGBoost, CatBoostdepth) lubnum_leaves(LightGBM),subsample/colsample_bytree,min_child_weight/min_data_in_leaf. - CatBoost zwykle daje najlepszy wynik bez strojenia, LightGBM jest najszybszy na dużych danych, XGBoost ma najszerszy ekosystem i wsparcie GPU od lat — wszystkie trzy mają tryb GPU.
- Do strojenia hiperparametrów używa się zwykle
OptunalubRandomizedSearchCV; zysk z dobrego strojenia to częściej ułamki punktu procentowego niż całe punkty.
Najczęstsze pytania
- Którą bibliotekę wybrać?
- Na start dowolną — wyniki są zwykle zbliżone. Dużo cech kategorycznych o wielu wartościach i mało czasu na strojenie: CatBoost. Miliony wierszy i potrzeba szybkich eksperymentów: LightGBM. Dojrzały ekosystem i integracje: XGBoost. W konkursach często używa się wszystkich trzech i uśrednia ich przewidywania.
- Czy te biblioteki są lepsze od GradientBoosting ze scikit-learn?
- Klasyczny `GradientBoostingClassifier` jest dużo wolniejszy na większych danych. Natomiast `HistGradientBoostingClassifier` ze scikit-learn korzysta z tych samych pomysłów (histogramy, natywne NaN i kategorie) i bywa wystarczający bez dodatkowych zależności.
- Czy trzeba skalować cechy i kodować kategorie?
- Skalowanie jest zbędne, bo drzewa patrzą tylko na kolejność wartości. Kategorie można podać natywnie, a braki zostawić jako NaN. Warto natomiast uważać na cechy, które przeciekają informację o celu — tego żaden algorytm nie naprawi.
Źródła
- Chen T., Guestrin C. „XGBoost: A Scalable Tree Boosting System”, KDD 2016, arXiv:1603.02754.
- Ke G. i in. „LightGBM: A Highly Efficient Gradient Boosting Decision Tree”, NeurIPS 2017.
- Prokhorenkova L., Gusev G., Vorobev A., Dorogush A. V., Gulin A. „CatBoost: unbiased boosting with categorical features”, NeurIPS 2018, arXiv:1706.09516.
- Dokumentacja: https://xgboost.readthedocs.io, https://lightgbm.readthedocs.io, https://catboost.ai/docs
- Dokumentacja scikit-learn, „Histogram-Based Gradient Boosting”: https://scikit-learn.org/stable/modules/ensemble.html#histogram-based-gradient-boosting