Dyskusja na temat overfit w xgboost

20

Moja konfiguracja jest następująca:

Postępuję zgodnie z wytycznymi w „Applied Predictive Modeling”. W związku z tym odfiltrowałem skorelowane funkcje i kończę na następujących:

  • 4900 punktów danych w zestawie treningowym i 1600 punktów danych w zestawie testowym.
  • Mam 26 cech, a celem jest zmienna ciągła.

Stosuję 5-krotną walidację krzyżową do trenowania modeli korzystających z caretpakietu. Kiedy stosuję model MARS, otrzymuję średni błąd bezwzględny (MAE) wynoszący około 4 na zestawie treningowym, a także na zestawie testowym.

Jednak stosując xgboost (algorytm drzewa lub liniowy) otrzymuję coś takiego jak 0,32 (!) Na zestawie treningowym i 2.4 na zestawie testowym.

Dlatego jeśli błąd testu jest 8 razy większy niż błąd treningu, powiedziałbym: Przekroczyłem dane treningowe. Mimo to nadal pojawia się mniejszy błąd podczas testu.

Używam następujących parametrów na xgboost:

  • nrounds = 1000i eta = 0.01(zwiększenie poziomu i zmniejszenie eta może pomóc, ale brakuje mi pamięci, a czas działania jest zbyt długi)
  • max_depth = 16: jeśli porównuję inne posty i domyślnie 6, to wygląda to na duże, ale problem jest dość złożony - może 16 nie jest w tym przypadku zbyt duże.
  • colsample_bytree = 0.7, subsample = 0.8i min_child_weight = 5: robiąc to, staram się zmniejszyć przeładowanie.

Jeśli zmniejszę max_depth, to pociąg i błąd testu zbliżają się, ale nadal istnieje duża przerwa i błąd testu jest większy (nieco powyżej 3).

Korzystając z liniowego wzmacniacza, otrzymuję mniej więcej ten sam pociąg i błąd testowy na optymalnych parametrach:

  • lambda = 90 oraz `alpha = 0: znalezione w drodze krzyżowej weryfikacji, lambda powinna zapobiegać przeładowaniu.
  • colsample_bytree = 0.8, subsample = 0.8i min_child_weight = 5: robiąc to, staram się zmniejszyć przeładowanie.

Wydaje mi się, że xgboost nadal jest zbyt dobry - ale błąd szkolenia i, o ile widzę w teście w czasie rzeczywistym (korzystałem z modeli xgboost i ich zestawu w rzeczywistości przez 4 dni) wygląda ok-ish (błąd jest większy niż błąd testu, ale w rzeczywistości istnieje większa niepewność co do prognozy cech i innych zmiennych).

Co sądzisz: czy mogę zaakceptować overfit, jeśli (jeśli to możliwe) rzeczywiste wyniki są lepsze? Czy xgboost w moim otoczeniu ma tendencję do przebijania się?

Ric
źródło

Odpowiedzi:

34

Czy nadmierne dopasowanie jest tak złe, że nie powinieneś wybierać modelu, który pasuje, nawet jeśli jego błąd testowy jest mniejszy? Nie. Ale powinieneś mieć uzasadnienie wyboru.

To zachowanie nie jest ograniczone do XGBoost. Jest to wspólny wątek wszystkich technik uczenia maszynowego; znalezienie właściwego kompromisu między niedostatecznym a nadmiernym dopasowaniem. Formalna definicja to kompromis wariancji odchylenia (Wikipedia) .

Kompromis wariancji odchylenia

Poniżej przedstawiono uproszczenie kompromisu wariancji odchylenia, aby usprawiedliwić wybór modelu.

  • Mówimy, że model ma duże odchylenie, jeśli nie jest w stanie w pełni wykorzystać informacji zawartych w danych. Jest zbyt zależny od ogólnych informacji, takich jak najczęstszy przypadek, sposób odpowiedzi lub kilka zaawansowanych funkcji. Odchylenie może wynikać z niewłaściwych założeń, na przykład przy założeniu, że zmienne są normalnie rozmieszczone lub że model jest liniowy.

  • Mówimy, że model ma dużą wariancję, jeśli wykorzystuje zbyt dużo informacji z danych. Opiera się na informacjach, które są ważne tylko w przedstawionym mu zestawie szkoleniowym, który nie uogólnia wystarczająco dobrze. Zazwyczaj model bardzo się zmieni, jeśli zmienisz zestaw treningowy, stąd nazwa „duża wariancja”.

Definicje te są bardzo podobne do definicji niedopasowania i przeszacowania. Jednak definicje te są często zbyt uproszczone, by stanowić przeciwieństwa, jak w

  • Model jest niedopasowany, jeśli zarówno błąd szkolenia, jak i błąd testu są wysokie. Oznacza to, że model jest zbyt prosty.
  • Model jest przeregulowany, jeśli błąd testu jest wyższy niż błąd szkolenia. Oznacza to, że model jest zbyt złożony.

Uproszczenia te są oczywiście pomocne, ponieważ pomagają wybrać odpowiednią złożoność modelu. Ale przeoczają ważny punkt, fakt, że (prawie) każdy model ma zarówno odchylenie, jak i składnik wariancji. Opis niedopasowania / przeszacowania mówi ci, że masz zbyt dużo uprzedzeń / zbyt dużej wariancji, ale (prawie) zawsze masz oba .

Jeśli chcesz uzyskać więcej informacji na temat kompromisu odchylenia uprzedzenia, są one bardzo pomocne w wizualizacji i dobrym zasobie dostępnym za pośrednictwem Google. Każdy podręcznik do nauki maszyn będzie zawierał sekcję dotyczącą kompromisu wariancji odchylenia, oto kilka

  • Wprowadzenie do uczenia statystycznego i Elementy uczenia statystycznego (dostępne tutaj) .
  • Rozpoznawanie wzorów i uczenie maszynowe, autor: Christopher Bishop.
  • Uczenie maszynowe: perspektywa probabilistyczna, autor: Kevin Murphy.

Miłym postem na blogu, który pomógł mi zrozumieć, jest Scott Undermann's Understanding the Bias-Variance Tradeoff .

Zastosowanie do twojego problemu

Więc masz dwa modele,

Pociąg MAEPrzetestuj MAEMARS4.04.0Niska wariancja, większe odchylenie,XGBoost0,32.4Wyższa wariancja, niższe odchylenie,

i musisz wybrać jeden. Aby to zrobić, musisz zdefiniować lepszy model. Parametry, które należy uwzględnić przy podejmowaniu decyzji, to złożoność i wydajność modelu.

  • Ile „jednostek” złożoności chcesz wymienić na „jednostkę” wydajności?
    • Większa złożoność wiąże się z większą wariancją. Jeśli chcesz, aby Twój model dobrze uogólniał na zbiorze danych nieco innym niż ten, w którym trenowałeś, powinieneś dążyć do mniejszej złożoności.
    • Jeśli potrzebujesz modelu, który możesz łatwo zrozumieć, możesz to zrobić kosztem wydajności, zmniejszając złożoność modelu.
    • Jeśli dążysz do jak najlepszej wydajności zestawu danych, o którym wiesz , że pochodzi z tego samego procesu generatywnego, co zestaw treningowy, możesz manipulować złożonością, aby zoptymalizować błąd testowy i użyć go jako miernika. Dzieje się tak, gdy Twój zestaw treningowy jest losowo próbkowany z większego zestawu, a Twój model zostanie zastosowany na tym zestawie. Tak jest na przykład w większości zawodów Kaggle.

Celem nie jest znalezienie modelu, który „nie pasuje”. To jest znalezienie modelu, który ma najlepszy kompromis wariancji odchylenia. W tym przypadku argumentowałbym, że redukcja odchylenia osiągnięta przez model XGBoost jest wystarczająco dobra, aby uzasadnić wzrost wariancji.

Co możesz zrobić

Jednak prawdopodobnie można to zrobić lepiej, dostrajając hiperparametry.

  • Możliwe jest zwiększenie liczby rund i zmniejszenie wskaźnika uczenia się. Coś, co jest „dziwne” w zwiększaniu gradientu, to fakt, że przekroczenie go powyżej punktu, w którym błąd treningu osiągnął zero, wydaje się nadal poprawiać błąd testu (jak omówiono tutaj: Czy głębsze jest lepsze tylko wtedy, gdy płytka jest dobra? ). Możesz spróbować ćwiczyć swój model nieco dłużej w zestawie danych po ustawieniu innych parametrów,

  • 1/2)14. Może to być żargon, ale jeśli twoje cechy mają stopień interakcji 3 (z grubsza: kombinacja 4 cech nie jest potężniejsza niż kombinacja 3 tych cech + czwarta), to rosnące drzewa o rozmiarze większym niż 3 to szkodliwy. Dwa drzewa o głębokości trzy będą miały większą moc uogólniającą niż jedno drzewo o głębokości cztery. Jest to dość skomplikowana koncepcja i nie będę się teraz nią zajmował, ale możesz sprawdzićten zbiór dokumentów na początek. Pamiętaj również, że głębokie drzewa prowadzą do dużej wariancji!

  • Używanie podpróbkowania, zwanego workowaniem , jest świetne w celu zmniejszenia wariancji. Jeśli twoje pojedyncze drzewa mają dużą wariancję, spakowanie uśredni drzewa, a średnia ma mniejszą wariancję niż pojedyncze drzewa. Jeśli po dostrajaniu głębokości drzew nadal napotykasz dużą wariancję, spróbuj zwiększyć podpróbkowanie (czyli zmniejszyć ułamek wykorzystywanych danych). Podpróbkowanie przestrzeni cech również osiąga ten cel.

Mruga
źródło
1
Nie należy komentować mówiąc „dziękuję”, ale za tę długą i interesującą odpowiedź chciałbym powiedzieć „dziękuję”. Aleady miałem trochę wiedzy na temat niektórych rzeczy, które piszesz, ale to było naprawdę ładnie połączone. Przejrzę niektóre z twoich referencji i wyhoduję nowe drzewa i może wrócę z komentarzem. Na razie: dzięki! Świetny!
Ric
Link do strony interakcji stat.columbia.edu/~jakulin/Int jest naprawdę świetny!
Ric
Wziąłem twoją radę i ograniczyłem głębokość drzew do 3, ale wziąłem dookoła 1200, a wyniki są świetne: bardzo szybkie obliczenia, różnica między pociągiem a testem zmniejszona i wciąż na dobrym poziomie. Reszta historii znajduje się tutaj: stats.stackexchange.com/questions/205858/...
Ric