Wzmacnianie i pakowanie drzew (XGBoost, LightGBM)

17

Istnieje wiele postów na blogach, filmów na YouTube itp. O pomysłach spakowania lub ulepszenia drzew. Z mojego ogólnego zrozumienia wynika, że ​​pseudo kod dla każdego z nich to:

Parcianka:

  1. Weź N losowych próbek x% próbek i y% funkcji
  2. Dopasuj swój model (np. Drzewo decyzyjne) do każdego z N
  3. Przewiduj z każdym N
  4. Uśrednij prognozy, aby uzyskać ostateczną prognozę

Zwiększenie:

  1. Dopasuj swój model (np. Drzewo decyzyjne) do swoich danych
  2. Zdobądź resztki
  3. Dopasuj swój model do resztek
  4. Przejdź do 2 dla N rund podwyższających
  5. Ostateczna prognoza jest ważoną sumą sekwencyjnych predyktorów.

Przedstawię wszelkie wyjaśnienia do mojego zrozumienia powyżej, ale moje zamierzone pytanie jest następujące:

Zarówno XGBoost, jak i LightGBM mają parametry umożliwiające pakowanie. Aplikacja nie jest Bagging OR Boosting (o tym mówi każdy post na blogu), ale Bagging AND Boosting. Jaki jest pseudo kod, gdzie i kiedy ma miejsce łączone pakowanie i wzmacnianie?

Spodziewałem się, że będzie to „Bagged Boosted Trees”, ale wygląda na to, że to „Boosted Bagged Trees”. Różnica wydaje się znaczna.

Drzewa wzmocnione w workach:

  1. Weź N losowych próbek x% próbek i y% funkcji
  2. Dopasuj wzmocnione drzewa do każdej z N próbek
  3. Przewiduj z każdym N
  4. Uśrednij prognozy, aby uzyskać ostateczną prognozę

To wydaje się najlepszym sposobem na zrobienie tego. W końcu ryzyko przyśpieszenia to nadmierne dopasowanie, a podstawową korzyścią z workowania jest ograniczenie nadmiernego dopasowania; spakowanie kilku ulepszonych modeli wydaje się świetnym pomysłem.

Jednak po przejrzeniu, na przykład scikit-learn gradient_boosting.py (który wykonuje spakowanie próbek, ale nie losowy wybór funkcji) i zestawieniu kilku małych samorodków w postach dotyczących LightGBM i XGBoost, wygląda na to, że XGBoost i LightGBM działają w następujący sposób:

Zwiększone spakowane drzewa:

  1. Dopasuj drzewo decyzyjne do swoich danych
  2. Dla rund wzmacniających i in:
    • Zdobądź resztki
    • if i mod bag_frequency == 0 (tzn. torba co 5 rund):
      • Weź pojedynczą losową próbkę x% próbek i y% cech; skorzystaj z tej losowej próbki
    • dopasuj drzewo do resztek
  3. Ostateczna prognoza jest ważoną sumą sekwencyjnych predyktorów.

Popraw moje rozumienie tutaj i podaj szczegółowe informacje. Boosted Bagged Tree (z tylko 1 losowym drzewem na bag_frequency) nie wydaje się tak potężny jak Bagged Boosted Tree.

Jonathan
źródło
2
+1 za interesujące i bardzo dobrze sformułowane pytanie. Witamy na stronie.
mkt - Przywróć Monikę
potrzebujesz „obliczyć błąd” dla swojego wzmocnienia. Zrobione źle, które się rozpada. Wagi są kluczowe dla adaboost. To nie jest surowa pozostałość. ... Nie mówimy o gradiencie stochastycznym, który jest niezbędny do zwiększenia, chociaż przyspiesza to.
EngrStudent - Przywróć Monikę
Oto wzmocniona torba. Zamiast nowego drzewa dla każdego kroku serii otrzymujesz nowy las o średniej wydajności. Eugene Tuv i Kari Torkkola. jmlr.org/papers/volume10/tuv09a/tuv09a.pdf
EngrStudent - Przywróć Monikę
wzmocniony w workach stworzy las z szeregów zespołów i weźmie średnią wydajność. Może angażować się w nadmierne dopasowanie, które może stworzyć szereg (wzmocniony), i dać mocniejszy wynik, ale zysk nie będzie ogromny.
EngrStudent - Przywróć Monikę

Odpowiedzi:

13

Pakowanie: Weź N losowych próbek x% próbek i y% Cech

Instancje są wielokrotnie poddawane próbce w Bagging , ale nie Funkcje. ( RandomForests , XGBoost i CatBoost robią oba):

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    Train model on D_i (and then predict)
Combine predictions with equal weight 

Dołącz krok inicjalizacji do swojego pseudo kodu Boosting, aby pozbyć się nadmiarowości:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted data (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Bagged Boosted Trees (jak to nazywasz) jest z pewnością rozsądnym podejściem, ale różni się od XGBoost lub CatBoost :

Given dataset D of size N.
For m in n_models:
    Create new dataset D_i of size N by sampling with replacement from D.
    (Insert Boosting pseudo code here (on D_i))
Combine predictions with equal weight 

XGBoost i CatBoost są zarówno na podstawie Pobudzanie i używać wszystkich danych treningowych. Wprowadzają również tworzenie worków poprzez podpróbkowanie raz w każdej Iteracji podwyższającej:

Init data with equal weights (1/N).
For m in n_model:
    Train model on weighted bootstrap sample (and then predict)
    Update weights according to misclassification rate.
    Renormalize weights
Combine confidence weighted predictions

Jeśli chcesz trzymać się „dopasuj model do reszt”, będzie to równoznaczne z „dopasuj model do reszt danych w próbce bootstrap ”.


Dalsze uwagi :

Nie ma „ najlepszego sposobu na zrobienie tego ”, jak sugerujesz (brak twierdzenia o darmowym obiedzie). „Bagged Boosted Trees” może przewyższyć XGBoost w niektórych zestawach danych.

Weź pojedynczą losową próbkę x% próbek

Ta linia jest myląca. Skąd to masz?

if i mod bag_frequency == 0 (tzn. torba co 5 rund):

Nie powinno to być wspomniane w twoim pseudo-kodzie. Zwłaszcza, gdy pominięto inne, ważniejsze parametry (takie jak tempo uczenia się podczas zwiększania).

Laksan Nathan
źródło
(+1) Dobra odpowiedź! Aby wyjaśnić: czy OP nie jest w stanie stwierdzić, że „ Zarówno XGBoost, jak i LightGBM mają parametry umożliwiające pakowanie ”?
mkt - Przywróć Monikę
Oba pozwalają na workowanie: bagging_fraction w LightGBM i podpróbkę w XGBoost . Nie jestem pewien, dlaczego cały czas korzystałem z CatBoost. Ale wszystkie działają w ten sam sposób w odniesieniu do pytania.
Laksan Nathan
Mój błąd, przegapiłem linię w twojej odpowiedzi, która o tym wspomina. Czy możesz wyjaśnić „ podpróbkowanie raz w każdej Iteracji przypominającej ”? Czy masz na myśli to, że w każdej iteracji przypominającej pobieranych jest wiele podpróbek, drzewa są dopasowane do każdej podpróbki, a następnie wskaźnik błędnej klasyfikacji jest obliczany na podstawie drzew spakowanych, a na koniec aktualizowane wagi? Jeśli tak, czy możesz to wyjaśnić w swoim pseudokodzie?
mkt - Przywróć Monikę
Narysowanych jest niewiele podprób, tylko jedna: Zamiast dopasowywać model do wszystkich ważonych instancji, model jest trenowany na próbce bootstrap.
Laksan Nathan
Odnośnie do „Weź pojedynczą losową próbkę x% próbek”; lepiej byłoby „pobrać pojedynczą próbkę x% wierszy”. Mam to stąd .
Jonathan