eXtreme Gradient Boosting vs Random Forest [i pakiet caret]

Screen Shot 2015-11-25 at 21.20.31
Drzewa decyzyjne są urocze.
Można je wizualizować, łatwo wyjaśnić, łatwo stosować, łatwo nawet się je konstruuje.
Ale niestety są niestabilne i nie nadają się do klasyfikacji danych o bardzo wysokim wymiarze i silnie skorelowanych zmiennych.

Ale i z niestabilnością drzew można walczyć. Jedna z popularniejszych metod stabilizacji poszczególnych drzew to lasy losowe (drzewa budowane na bootstrapowych próbach z podzbiorem zmiennych) inna interesująca metoda to gradient boosting (sekwencja drzew optymalizowanych na klasyfikacje przypadków z którymi nie radziły sobie wcześniejsze drzewa).

[Uwaga, dalsza część wpisu zawiera dużo gwary].

Jak dotąd lasy losowe były moją ulubioną metodą klasyfikacji danych genetycznych (z uwagi na OOB, proximities i ocenę ważności cech). Ale ostatnio to tu i tam słychać było głosy, że palmę lidera przejmie od nich eXtreme Gradient Boosting.
Hmm, postawmy te metody na Ringu.

Przegląd literatury pokazuje, że coś jest na rzeczy.
Nie kto inny, ale sam Trevor Hastie napisał

Boosting    >    Random Forest    >    Bagging    >    Single Tree

I jak, apetyt rośnie?
(Jeżeli zamiast czytać slajdy wolicie słuchać opowiadań, można obejrzeć ten filmik).

Ring łatwo zestawić korzystając z pakietu caret. Lasy losowe mają tag „rf” a gradient boosting „xgbTree„.
Bierzemy dane z projektu The Cancer Genome Atlas (dane z sekwencjonowania RNA, różne nowotwory, 17000+ zmiennych, 300+ obserwacji, 7 klas do których klasyfikujemy) i budujemy klasyfikator (chcemy rozpoznawać typ nowotworu). Dzielimy cały zbiór na uczący i testowy, powtarzamy całość kilkaset razy by uśrednić błąd predykcji. Samo trenowanie modelu jest banalnie proste.
Z rozpędu dorzuciłem jeszcze boostingowaną regresję logistyczna i SVM.

Z pakietem caret wszystkie te metody trenuje się bajecznie prosto (włącznie z prymitywną metodą optymalizacji parametrów metody).

library(caret)
mat <- lapply(c( 'LogitBoost', 'xgbTree', 'rf', 'svmRadial'), 
          function (met) {
  train(subClasTrain~., method=met, data=smallSetTrain)
})

A wiec jakie są wyniki tych badań?

Aby nie było, że wyniki są przypadkowe, tydzień temu na zajęciach z Data Minig grupowo porównywaliśmy lasy losowe, boosting i SVM na problemie z Kaggle identyfikacji rodzaju ,,wyprawy na zakupy” (w sumie ciekawy problem, 34 typy wycieczek zakupowych i problem klasyfkacji w oparciu o koszyk).

Gdy brać pod uwagę ranking meto to wyniki zabawy z kagglem są takie same jak wyniki zabawy z TCGA (performance jest wyższy dla TCGA).

Na poniższym wykresie przedstawiam rozkład performance dla różnych klasyfikatorów liczonych na setce losowo podzielonych danych na uczące i testowe.

Screen Shot 2015-11-25 at 20.55.10

Jak widać, dla tych danych, lasy losowe wciąż górą.

Ale czekamy na kolejne metody. Ring jest gotowy.

10 thoughts on “eXtreme Gradient Boosting vs Random Forest [i pakiet caret]”

  1. A jakie parametry zostały użyte w algorytmie xgboost, a jakie w rf? np. po ile drzew było użytych? jakiej głębokości były trenowane drzewa w xgboost? może warto również dodać porównanie czasu uczenia?

    1. Będą kody na githubie, będzie można sprawdzić,
      Ale super właściwością funkcji train, jest to, że przyjmuje argument tuneGrid i może tuningować parametry na zbiorze różnych opcji (http://topepo.github.io/caret/training.html).
      To oczywiście wpływa na czas im więcej parametrów do tuningu tym dłużej całość trwa.

      Ale szczerze mówiąc, może trwać i miesiąc, może wykorzystywać 100 rdzeni jeżeli tylko wyniki będą lepsze.

  2. Nie chce się czepiać, bo dobrze, że poruszyłeś temat, ale czego niby dowodzi ten wpis? Chodzi tylko o to, że są głosy, że XGBoost jest lepszy od RF, ale Ty zastosowałeś to do jednego zbioru i wyszło co innego?

    1. Tak, dobrze to podsumowałeś.
      Żadna z tych metod nie jest jednostajnie lepsza od drugiej, a akurat na tym zbiorze danych (który mnie bardzo interesuje) okazuje się, że lepsze są lasy.

      Ale czytając między wierszami można dostrzec, że bohaterem tego wpisu jest pakiet caret.

    1. Średni wynik lasów to 98%, więc niewiele można poprawić w samym accuracy,
      ale ICA to dobry pomysł by poradzić sobie z korelacją.
      Zobaczymy co wyjdzie.

  3. mam podobne doświadczenia, randomForest() daje lepsze wyniki niż xgboost() dla zadania klasyfikacji i regresji, w rf zmieniam tylko parametr mtry by uzyskać jego optymalną wielkość (najmniejszą ponad którą nie zwiększa się dopasowanie modelu, tak przy nie dopasować nadmiernie modelu), w xg zmieniam tylko eta i max.depth (wielkość kroku i głędobość modelu) i oczywiście nrounds (liczba iteracji im większa tym mniejsze dopasowanie), za każdym razem gdy stopowałem xg na poziomie rmse z rf, xg dawało gorszą prognozę na zbiorze testowym 🙂

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *