ML Atlas

03 · Nadzorowane · 5 min czytania · aktualizacja

XGBoost, LightGBM czy CatBoost — którą bibliotekę wybrać w praktyce?

W skrócie

Po dostrojeniu XGBoost, LightGBM i CatBoost dają niemal identyczne wyniki. Różnią się ustawieniami domyślnymi, obsługą kategorii, szybkością i ekosystemem.

Co to jest

Jeśli nie masz czasu na strojenie albo masz dużo cech kategorycznych — wybierz CatBoost; jeśli masz miliony wierszy i liczy się czas treningu — LightGBM; jeśli zależy Ci na najszerszym ekosystemie, stabilnym API i wdrożeniach — XGBoost. Po rozsądnym dostrojeniu różnice w dokładności między nimi są zwykle mniejsze niż szum walidacji krzyżowej, więc decyzja jest bardziej inżynierska niż statystyczna.

Wszystkie trzy to implementacje tego samego pomysłu: wzmacniania gradientowego drzew decyzyjnych z przybliżeniem drugiego rzędu, histogramami cech i wbudowaną obsługą braków danych. Mechanizmy wewnętrzne (wzrost drzew, kodowanie kategorii, próbkowanie) opisuje osobne hasło o tych bibliotekach. Tu skupiamy się na pytaniu praktycznym: którą zainstalować i od jakich ustawień zacząć.

Najważniejsza i najczęściej pomijana różnica to ustawienia domyślne. To one decydują, który model „wygrywa” w szybkim porównaniu bez strojenia.

Mechanizm — dlaczego tak działa

Domyślne ustawienia to różne filozofie. XGBoost startuje agresywnie: 100 drzew, współczynnik uczenia 0,3, głębokość 6. Na małych danych łatwo się przeucza. LightGBM: 100 drzew, współczynnik 0,1, do 31 liści na drzewo — umiarkowanie. CatBoost: 1000 drzew symetrycznych głębokości 6 i współczynnik uczenia dobierany automatycznie do rozmiaru danych (zwykle kilka setnych). To najbliżej „rozsądnych ustawień po strojeniu”, kosztem dłuższego treningu.

Drzewa symetryczne jako regularyzacja. CatBoost używa tego samego warunku podziału na całym poziomie drzewa. Takie drzewa są mniej elastyczne, przez co mniej się przeuczają na małych zbiorach, a przewidywanie jest bardzo szybkie. LightGBM rośnie liśćmi, zawsze dzieląc najbardziej obiecujący liść — dokładne przy dużych danych, ryzykowne przy małych, dlatego główną śrubą jest num_leaves i min_child_samples.

Kategorie. CatBoost koduje kategorie uporządkowaną średnią celu, co jest bezpieczne nawet dla cech o tysiącach wartości (kody pocztowe, identyfikatory produktów). LightGBM i XGBoost dzielą kategorie natywnie (typ category w pandas), co działa dobrze przy umiarkowanej liczbie wartości. Przy kilku kategoriach o niskiej liczności różnice są zaniedbywalne.

Szybkość. Na dużych danych LightGBM jest zwykle najszybszy w treningu (histogramy, wzrost liśćmi, próbkowanie GOSS), XGBoost z tree_method="hist" niewiele wolniejszy, CatBoost najwolniejszy na CPU, ale bardzo szybki w predykcji i dobrze skalujący się na GPU. Na małych danych wszystko trwa sekundy i szybkość nie ma znaczenia.

Dlaczego wyniki się zbiegają. Po dostrojeniu liczby drzew (wczesne zatrzymanie), współczynnika uczenia, głębokości i regularyzacji wszystkie trzy przybliżają ten sam model addytywny drzew. Różnice architektoniczne zostają, ale stają się drugorzędne wobec jakości cech i danych.

Na przykładzie

Powtarzana walidacja krzyżowa 5 × 3 (random_state=0), najpierw ustawienia domyślne wszystkich bibliotek oraz HistGradientBoosting ze scikit-learn. Titanic z brakami pozostawionymi jako NaN. Klasyfikacja — trafność, Diabetes — R².

ZbiórXGBoostLightGBMCatBoostHistGB (scikit-learn)
Titanic0,8070,8150,8220,811
Breast Cancer0,9640,9670,9700,967
Wine0,9570,9680,9720,981
Digits 8×80,9640,9730,9800,971
Diabetes (R²)0,3140,4090,416—

Na ustawieniach domyślnych CatBoost wygrywa na czterech zbiorach z pięciu, a XGBoost jest ostatni na wszystkich. Najbardziej widać to na Diabetes (442 pacjentów): agresywne domyślne ustawienia XGBoost dają R² 0,314, o 0,10 mniej niż CatBoost. Najlepszy log loss na Titanicu też ma CatBoost (0,418 wobec 0,525 dla XGBoost). Na Wine (178 win) wygrywa skromny HistGradientBoosting.

Teraz minimalne strojenie — te same, rozsądne ustawienia dla wszystkich: 300 drzew, współczynnik uczenia 0,05, głębokość 4 (w LightGBM 15 liści), kategorie natywnie. Titanic: XGBoost 0,822, LightGBM 0,821, CatBoost 0,824 — różnice 0,003 przy odchyleniu między częściami walidacji ok. 0,03. Diabetes (współczynnik 0,03, drzewa głębokości 2): 0,458, 0,463 i 0,479. XGBoost zyskał 0,14 R² samą zmianą trzech parametrów, a przewaga CatBoost skurczyła się do 0,02.

Czasy (orientacyjnie, laptop pod obciążeniem): na Digits jedno dopasowanie trwało ok. 0,5 s dla XGBoost, 1,7 s dla LightGBM i 3,7 s dla CatBoost z domyślnymi 1000 drzewami.

Dane: Titanic Breast Cancer Wisconsin (diagnostyka raka piersi) Wine (wina z Piemontu) Digits (ręcznie pisane cyfry 8×8) Diabetes (progresja cukrzycy)

W praktyce

Reguła wyboru:

  • Szybki, mocny wynik bez strojenia lub dużo kategorii → CatBoostClassifier(cat_features=cat_cols, verbose=0).
  • Miliony wierszy, liczy się czas → LGBMClassifier(n_estimators=5000, learning_rate=0.05, num_leaves=31) z callbacks=[lightgbm.early_stopping(100)] i zbiorem walidacyjnym w eval_set.
  • Wdrożenie, GPU, wiele języków, stabilne API → XGBClassifier(tree_method="hist", n_estimators=5000, learning_rate=0.05, max_depth=4, early_stopping_rounds=100); zmniejsz domyślny współczynnik 0,3.
  • Nie chcesz kolejnej zależności → HistGradientBoostingClassifier(early_stopping=True) ze scikit-learn jest blisko wszystkich trzech.
  • Porównując biblioteki, strój każdą tak samo starannie (np. optuna z tym samym budżetem prób) — porównanie „domyślne kontra domyślne” mierzy filozofię ustawień, nie jakość algorytmu.
  • W konkursach uśrednij wszystkie trzy: ich błędy są skorelowane, ale nie identyczne.

Najczęstsze pytania

Która biblioteka jest najdokładniejsza?
Żadna systematycznie. W dużych porównaniach (McElfresh i in., 2023: 19 algorytmów na 176 zbiorach) wszystkie trzy biblioteki są w czołówce, a ich kolejność zmienia się w zależności od zbioru; różnice po strojeniu są małe. CatBoost częściej wygrywa bez strojenia, bo ma najostrożniejsze ustawienia domyślne.
Czy CatBoost zawsze jest lepszy przy cechach kategorycznych?
Przy kategoriach o wielu wartościach i małej liczbie przykładów na wartość — często tak, bo jego kodowanie nie przecieka informacji o celu. Przy kilku kategoriach o niskiej liczności (płeć, port) natywne kategorie LightGBM czy XGBoost dają praktycznie ten sam wynik.
Czy warto używać GPU?
Dla danych do kilkuset tysięcy wierszy zwykle nie — narzut przesyłania danych zjada zysk. Przy milionach wierszy i setkach cech wszystkie trzy biblioteki przyspieszają na GPU wielokrotnie; CatBoost i XGBoost mają tu szczególnie dopracowane implementacje.

Źródła

  • Chen T., Guestrin C. „XGBoost: A Scalable Tree Boosting System”, KDD 2016.
  • 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.
  • McElfresh D. i in. „When Do Neural Nets Outperform Boosted Trees on Tabular Data?”, NeurIPS 2023 (Datasets and Benchmarks Track).
  • Grinsztajn L., Oyallon E., Varoquaux G. „Why do tree-based models still outperform deep learning on typical tabular data?”, NeurIPS 2022 (Datasets and Benchmarks Track).

Zobacz też