ML Atlas

03 · Nadzorowane · 4 min czytania · aktualizacja

Jak działa AdaBoost i dlaczego łączenie słabych klasyfikatorów działa?

W skrócie

AdaBoost uczy proste klasyfikatory po kolei, za każdym razem zwiększając wagę przykładów, na których poprzednie się myliły, i łączy je w ważone głosowanie.

Co to jest

AdaBoost (adaptive boosting) to algorytm, który z wielu słabych klasyfikatorów — ledwie lepszych od rzutu monetą — buduje jeden silny. Uczy je po kolei: każdy kolejny dostaje dane, w których przykłady źle sklasyfikowane przez poprzedników mają większą wagę. Końcowa decyzja to ważone głosowanie, w którym trafniejsze klasyfikatory mają mocniejszy głos. Algorytm opublikowali Yoav Freund i Robert Schapire (1997), za co otrzymali Nagrodę Gödla.

Typowym słabym klasyfikatorem jest pniak decyzyjny: drzewo z jednym pytaniem, np. „czy obwód guza przekracza 106?”. Sam w sobie jest prymitywny, ale setki pniaków patrzących na różne cechy i różne trudne przypadki składają się w złożoną regułę.

Intuicja: uczeń przygotowujący się do egzaminu po każdym teście próbnym wraca do zadań, które mu nie wyszły, zamiast powtarzać te, które już umie. AdaBoost robi to samo: uwaga przesuwa się na trudne przypadki.

Mechanizm — dlaczego tak działa

Na początku wszystkie przykłady mają równe wagi. W rundzie t uczymy słaby klasyfikator na ważonych danych i liczymy jego ważony błąd ε. Jego siła głosu to α = ln((1 − ε) / ε) (w części sformułowań z czynnikiem ½): klasyfikator z błędem 10% dostaje α ≈ 2,2, z błędem 40% — tylko α ≈ 0,4, a zgadujący losowo (50%) — zero. Następnie wagi źle sklasyfikowanych przykładów mnoży się przez e^α, po czym wszystkie wagi normalizuje. Kolejny klasyfikator musi więc skupić się na tym, z czym poprzedni sobie nie radził.

Dlaczego to działa? Boosting zmniejsza przede wszystkim obciążenie: każda runda dokłada kawałek reguły w miejscu, gdzie dotychczasowy zespół się myli. Friedman, Hastie i Tibshirani (2000) pokazali, że AdaBoost to w istocie stopniowe dopasowywanie modelu addytywnego przez minimalizację wykładniczej funkcji straty e^(−y·f(x)). Ta interpretacja otworzyła drogę do wzmacniania gradientowego, które uogólnia pomysł na dowolną różniczkowalną stratę.

Zaskakującą własnością AdaBoost jest to, że błąd testowy często spada dalej, nawet gdy błąd treningowy osiągnął już zero. Wyjaśnienie oparte na marginesach (Schapire i in., 1998): po zerowym błędzie kolejne rundy wciąż zwiększają „pewność” głosowania, czyli odległość przykładów od granicy decyzyjnej, a większe marginesy sprzyjają uogólnianiu. Nie oznacza to, że AdaBoost nigdy się nie przeucza — przy zaszumionych danych może.

Największa słabość wynika z samej idei: wykładnicza strata karze błędy bardzo mocno, więc przykłady z błędną etykietą dostają coraz większe wagi i algorytm uparcie próbuje je „nauczyć się”. Przy etykietach z szumem AdaBoost bywa gorszy od lasu losowego. Wersje odporniejsze zastępują stratę wykładniczą łagodniejszą, np. logistyczną.

Na przykładzie

Breast Cancer Wisconsin, trening na 426 guzach, test na 143 (podział warstwowy, random_state=0). Pierwszy pniak wybiera pytanie „czy największy obwód jądra przekracza 106,1?” i trafia na teście w 88,8% przypadków. Jego ważony błąd na treningu to 7,0%, więc dostaje α = 2,58; drugi pniak, uczony już na przeważonych danych, ma błąd 11,6% i α = 2,03. Po 10 rundach trafność testowa wynosi 94,4%. Z 300 pniaków aż 26 różnych cech zostaje wykorzystanych — algorytm sam sięga po coraz to inne wskaźniki dla trudnych przypadków.

Błąd treningowy spada do zera już po 28 rundach, a mimo to dalsze rundy nie psują modelu: trafność testowa waha się między 93,0% a 96,5% aż do 1000 pniaków. W powtórzonej walidacji krzyżowej (5 części × 10 powtórzeń) pojedynczy pniak ma 89,3%, AdaBoost z 50 pniakami 96,5%, z 300 pniakami 96,9% — więcej niż las losowy pełnych drzew (95,9%) i dużo więcej niż bagging tych samych pniaków (91,7%).

Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)

W praktyce

  • AdaBoostClassifier(estimator=DecisionTreeClassifier(max_depth=1), n_estimators=200, learning_rate=0.5) oraz AdaBoostRegressor.
  • learning_rate mnoży siły głosu α; mniejsze wartości (0,1–0,5) wymagają więcej rund, ale zwykle lepiej uogólniają.
  • Głębokość słabego klasyfikatora: pniaki (max_depth=1) to klasyka; max_depth=2–3 pozwala wychwycić interakcje cech.
  • Postęp po rundach śledź przez staged_score lub staged_predict na danych walidacyjnych.
  • Przy zaszumionych etykietach albo wielu odstających punktach rozważ las losowy lub wzmacnianie gradientowe ze stratą logistyczną.

Najczęstsze pytania

Czym różni się AdaBoost od wzmacniania gradientowego?
AdaBoost przeważa przykłady i minimalizuje stratę wykładniczą. Wzmacnianie gradientowe dopasowuje każdy kolejny model do gradientu dowolnej funkcji straty (dla błędu kwadratowego — do reszt). AdaBoost okazał się szczególnym przypadkiem tego ogólniejszego schematu.
Dlaczego AdaBoost tak rzadko się przeucza?
Bo po osiągnięciu zerowego błędu treningowego kolejne rundy zwiększają marginesy, czyli pewność poprawnych decyzji, zamiast zapamiętywać pojedyncze przypadki. Słabe klasyfikatory, jak pniaki, same mają małą zdolność dopasowania. Przy zaszumionych etykietach ta odporność jednak znika.
Jaki słaby klasyfikator wybrać?
Najczęściej pniak albo płytkie drzewo. Słaby klasyfikator musi być choć trochę lepszy od losowego na ważonych danych i nie może być zbyt silny — pełne drzewo od razu osiągnęłoby zerowy błąd i nie zostawiło nic do poprawiania.

Źródła

  • Freund Y., Schapire R. E. „A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting”, Journal of Computer and System Sciences 55(1), 1997.
  • Friedman J., Hastie T., Tibshirani R. „Additive Logistic Regression: A Statistical View of Boosting”, Annals of Statistics 28(2), 2000.
  • Schapire R. E., Freund Y., Bartlett P., Lee W. S. „Boosting the Margin: A New Explanation for the Effectiveness of Voting Methods”, Annals of Statistics 26(5), 1998.
  • Hastie T., Tibshirani R., Friedman J. „The Elements of Statistical Learning”, 2nd ed., 2009, rozdz. 10.
  • Dokumentacja scikit-learn, „AdaBoost”: https://scikit-learn.org/stable/modules/ensemble.html#adaboost

Zobacz też