Losowy las - jak radzić sobie z przeuczeniem


41

Mam wykształcenie informatyczne, ale staram się uczyć danych, rozwiązując problemy w Internecie.

Pracowałem nad tym problemem przez ostatnie kilka tygodni (około 900 wierszy i 10 funkcji). Początkowo korzystałem z regresji logistycznej, ale teraz przerzuciłem się na losowe lasy. Kiedy uruchamiam mój przypadkowy model lasu na danych treningowych, otrzymuję naprawdę wysokie wartości dla auc (> 99%). Jednak gdy uruchamiam ten sam model na danych testowych, wyniki nie są tak dobre (dokładność około 77%). To prowadzi mnie do przekonania, że ​​przesadzam z danymi treningowymi.

Jakie są najlepsze praktyki dotyczące zapobiegania nadmiernemu dopasowaniu w losowych lasach?

Używam r i rstudio jako mojego środowiska programistycznego. Korzystam z randomForestpakietu i zaakceptowałem wartości domyślne dla wszystkich parametrów


4
Breiman twierdzi, że RF nie pasuje. stat.berkeley.edu/~breiman/RandomForests/cc_home.htm Zakładając, że ma rację, być może istnieje pewna niespójność między twoim treningiem a zestawem testowym?
Przywróć Monikę

RF czy AVOIDS nie pasuje do DANYCH TESTOWYCH, jeśli zoptymalizujesz parametr strojenia
Brash Equilibrium

Uważam, że sampsize całkowicie pominięty parametr strojenia. stackoverflow.com/questions/34997134/…
Soren Havelund Welling

Odpowiedzi:


30

Aby uniknąć nadmiernego dopasowania w losowym lesie, najważniejszą rzeczą, którą musisz zrobić, jest optymalizacja parametru strojenia, który określa liczbę funkcji losowo wybieranych do wyhodowania każdego drzewa na podstawie danych startowych. Zazwyczaj robi się to poprzez krotną walidację krzyżową, gdzie , i wybiera parametr strojenia, który minimalizuje błąd prognozowania próbki testowej. Ponadto, powiększenie większego lasu poprawi dokładność predykcyjną, chociaż zwykle dochodzi do malejących zysków, gdy zdobędziesz kilkaset drzew.k { 5 , 10 }kk{5,10}


1
Dziękuję Ci. Czy jest jakiś samouczek, który pokazuje, jak zoptymalizować te parametry?
Abhi,

Musisz zarejestrować się na kursy online Stanford, co jest dość proste, ale oto samouczek wideo na ten temat w języku R: class.stanford.edu/courses/HumanitiesScience/StatLearning/...
Brash Equilibrium

Jeśli dobrze to rozumiem, używamy weryfikacji krzyżowej, aby ustalić liczbę funkcji wchodzących w skład losowego modelu lasu, a nie liczbę funkcji, które model będzie próbował na każdym kroku. Poprawne
Abhi

4
Argumentowałbym przeciwko tej odpowiedzi: dwie atrakcyjne cechy RF są takie, że trudno je zastąpić, a domyślne parametry są zwykle dość dobre. Ta odpowiedź wydaje się sugerować, że RF są wrażliwe na wartości domyślne, co rzadko się zdarza
Charles

7
Z empirycznego punktu widzenia nie miałem trudności z przerzuceniem losowego lasu, prowadzonego losowego lasu, regulowanego losowego lasu lub kierowanego regulowanego losowego lasu. Regularnie sprawdzają się bardzo dobrze podczas weryfikacji krzyżowej, ale słabo, gdy są używane z nowymi danymi z powodu nadmiernego dopasowania. Uważam, że ma to związek z typem modelowanych zjawisk. Modelowanie procesu mechanicznego nie stanowi większego problemu, ale przy czymś takim jak model behawioralny uzyskuję znacznie bardziej stabilne wyniki z dobrze określoną regresją.
Hack-R

33

Jak uzyskać 99% AUC na podstawie danych treningowych? Pamiętaj, że istnieje różnica między nimi

predict(model)

i

predict(model, newdata=train)

podczas uzyskiwania prognoz dla zestawu danych szkoleniowych. Pierwsza opcja dostaje out-of-torby przewidywań losowego lasu. Jest to generalnie to, czego chcesz, porównując przewidywane wartości z wartościami rzeczywistymi w danych treningowych.

Drugi traktuje twoje dane treningowe, jakby to był nowy zestaw danych, i prowadzi obserwacje w dół każdego drzewa. Spowoduje to sztucznie ścisłą korelację między prognozami a rzeczywistymi, ponieważ algorytm RF na ogół nie przycina poszczególnych drzew, zamiast tego polegając na zestawie drzew w celu kontrolowania nadmiernego dopasowania. Nie rób tego, jeśli chcesz uzyskać prognozy dotyczące danych treningowych.


3
Użyłem przewidywania (model, dane = pociąg). Teraz przełączyłem się na przewidywanie (model), a mój AUC spadł do 87%. Czy to dobrze, czy źle?
Abhi

2
Dziękuję Ci! Przekonałem się, że to też był problem dla mnie. Tutaj zadałem
Berk U.

Wielkie dzięki!! Ja też popełniłem ten błąd! Dla @Ahihi: to dobrze, ponieważ poprzedni AUC był bezsensownie wysoki. Ten jest bardziej realistyczny. Spróbuj przeprowadzić walidację krzyżową i zmierzyć AUC, a prawdopodobnie zobaczysz podobną wartość.
Ciekawy

7

W przypadku drzew decyzyjnych istnieją dwa sposoby radzenia sobie z nadmiernym dopasowaniem: (a) nie hoduj drzew do całości (b) śliwki

To samo dotyczy lasu drzew - nie uprawiaj ich zbyt wiele i przycinaj.

Nie używam randomForestdużo, ale według mojej wiedzy istnieje kilka parametrów, które można wykorzystać do dostrojenia lasów:

  • nodesize - minimalny rozmiar węzłów końcowych
  • maxnodes - maksymalna liczba węzłów końcowych
  • mtry - liczba zmiennych użytych do zbudowania każdego drzewa (dzięki @ user777)

1
I mtryliczba zmiennych, które algorytm rysuje, aby zbudować każde drzewo, domyślnie pierwiastek kwadratowy z całkowitej liczby funkcji.
Przywróć Monikę

Zamiast tego zostawiłbym maxnodes i mniejszy rozmiar sampsize. Zarówno zmniejszające się maksymalne węzły, jak i sampsize dają drzewa o mniejszej głębokości i bardziej odpornym lesie, sampsize, jednak mniejsza korelacja drzew, a las prawdopodobnie zbiegnie się do niższego błędu prognozowania, patrz stackoverflow.com/questions/34997134/...
Soren Havelund Welling

2

Możesz użyć metod walidacji krzyżowej, takich jak walidacja krzyżowa K fold.


musisz znormalizować / skalować funkcje?
Charles

4
@charles moje przeprosiny. Rzeczywiście nie jest konieczne skalowanie funkcji przy użyciu losowych lasów. Zobacz: stackoverflow.com/questions/8961586/...
FRE

Myślę, że przydatna byłaby cross-validation. Jest to stosunkowo niewielki zestaw danych z weryfikacją podzielonej próbki, która może powodować niestabilne oszacowanie błędu (choć mam wrażenie, że nie jest to kwestia tutaj)
Charles

1

możesz dostroić parametry za pomocą gridsearch

from sklearn.ensemble import RandomForestClassifier

from sklearn.grid_search import GridSearchCV

random_classifier = RandomForestClassifier()

parameters = { 'max_features':np.arange(5,10),'n_estimators':[500],'min_samples_leaf': [10,50,100,200,500]}

random_grid = GridSearchCV(random_classifier, parameters, cv = 5)

Próba edytora sugeruje, że moduł GridSearchCVjest włączony model_selection, a zatem powinna to być druga linia kodu from sklearn.model_selection import GridSearchCV.
gung - Przywróć Monikę

0

Spróbuj dostroić parametr max_depth w zakresach [5, 15], ale nie więcej niż to, ponieważ jeśli weźmiesz dużą głębokość, istnieje duża szansa na przeregulowanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.