Losowy las jest zbyt dobry?

19

Eksperymentuję z losowymi lasami za pomocą scikit-learn i uzyskuję świetne wyniki mojego zestawu treningowego, ale stosunkowo słabe wyniki na moim zestawie testowym ...

Oto problem (inspirowany pokerem), który próbuję rozwiązać: biorąc pod uwagę karty własne gracza A, karty własne gracza B i flop (3 karty), który gracz ma najlepszą rękę? Matematycznie jest to 14 wejść (7 kart - jedna ranga i jeden kolor dla każdego) i jedno wyjście (0 lub 1).

Oto niektóre z moich dotychczasowych wyników:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

Oto odpowiedni zastosowany kod:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

Wygląda na to, że niezależnie od liczby użytych drzew, wydajność na zestawie treningowym jest znacznie lepsza niż na zestawie testowym, pomimo stosunkowo dużego zestawu treningowego i stosunkowo niewielkiej liczby funkcji ...

Uwat
źródło
2
Nie widzę tu tuzina „tarcz” losowych lasów. Cross Validation? Bayesian Priors? Charakter ponownego próbkowania? Zestaw treningowy dla każdego drzewa? Jaki procent podzbioru dla każdego drzewa? ... jest o wiele więcej, które można wymienić, ale mam na myśli, że masz inne dane do rozważenia.
EngrStudent - Przywróć Monikę
1
Czy możesz wyjaśnić problem tym, którzy nie znają pokera. Czy istnieje łatwa kalkulacja wyniku pokera? wtedy łatwiej jest zrozumieć, czy korzystanie z RF jest czymś zasadniczo złym ... Nie znam pokera, ale podejrzewam, że RF jest prawdopodobnie niewłaściwym podejściem - a mianowicie pierwszym krokiem w RF jest użycie tylko części wejściowych, podczas gdy wydaje mi się, że nie ma możliwości zbudowania dobrego klasyfikatora przy użyciu tylko podzbioru danych wejściowych - wszystkie dane wejściowe są wymagane.
seanv507

Odpowiedzi:

45

Jest to częsty błąd debiutanta podczas korzystania z modeli RF (podniosę rękę jako poprzedni sprawca). Las, który budujesz za pomocą zestawu treningowego, w wielu przypadkach będzie pasował do danych treningowych prawie idealnie (jak się znajduje), jeśli rozpatrywać je łącznie. Jednak, gdy algorytm buduje las, pamięta błąd prognozowania OOB, który najlepiej zgaduje błąd uogólnienia.

Jeśli wyślesz dane treningowe z powrotem do metody przewidywania (tak jak robisz), otrzymasz prawie idealną prognozę (która jest szalenie optymistyczna) zamiast prawidłowego błędu OOB. Nie rób tego Zamiast tego przeszkolony obiekt leśny powinien zapamiętać w nim błąd OOB. Nie jestem zaznajomiony z implementacją scikit-learn, ale patrząc na dokumentację tutaj , wygląda na to, że musisz określić oob_score=Truepodczas wywoływania metody dopasowania, a następnie błąd uogólnienia zostanie zapisany jakooob_score_w zwróconym obiekcie. W pakiecie R „randomForest” wywołanie metody przewidywanej bez argumentów na zwróconym obiekcie zwróci prognozę OOB na zestawie szkoleniowym. To pozwala zdefiniować błąd za pomocą innej miary. Przesłanie zestawu treningowego z powrotem do metody przewidywania da inny wynik, ponieważ wykorzysta wszystkie drzewa. Nie wiem, czy scikit-learnwdrożenie to zrobi, czy nie.

Błędem jest wysyłanie danych treningowych z powrotem do metody prognozowania w celu przetestowania dokładności. Jest to jednak bardzo częsty błąd, więc nie martw się.

Bogdanovist
źródło
1
Dzięki! Nadal jednak mam obawy: przy 400 tys. Przykładów treningowych i 50 drzewach uzyskałem 89,6% poprawności, podczas gdy przy tak dużej ilości danych i dwa razy większej liczbie drzew mam 89,7% poprawności ... Czy to sugeruje, że RF nie jest dobre metoda do tego? W przeszłości korzystałem z sieci neuronowej MLP i osiągnąłem ~ 98,5% dokładność na zestawie testowym ...
Uwat
5
Jest to możliwe, chociaż wygląda na to, że nie używasz prawie wystarczającej liczby drzew. Zazwyczaj potrzebujesz tysięcy. Zauważ, że liczba drzew nie jest parametrem do dostrojenia w algorytmie RF, więcej jest zawsze lepsze, ale gdy masz już „dość” (do ustalenia empirycznego) błąd OOB nie poprawia się wraz z większą liczbą drzew. Nawet w przypadku małych prostych zestawów danych, mniej niż 500 drzew nie wystarczy.
Bogdanovist,
1
Istnieje kilka drobnych zastrzeżeń, aby „więcej zawsze było lepsze” w odniesieniu do liczby drzew, ale rozumiem, że potrzebujesz gazjillionów drzew, zanim zaczniesz grać hit. Z mojego doświadczenia wynika, że ​​tyle drzew, ile masz zasobów procesora i cierpliwości, aby generować lepsze, aczkolwiek ze zmniejszającymi się zwrotami po płaskowyżach krzywej OBB (ntrees).
Bogdanovist,
12

Myślę, że odpowiedzią jest parametr max_features: int, string lub None, opcjonalny (default = „auto”) parametr. w zasadzie dla tego problemu powinieneś ustawić na Brak, aby każde drzewo było zbudowane ze wszystkich danych wejściowych, ponieważ oczywiście nie możesz zbudować odpowiedniego klasyfikatora przy użyciu tylko ułamka kart (domyślnie „auto” wybiera sqrt (nfeatures) dane wejściowe dla każdego drzewa)

seanv507
źródło
1
To było to! 95% dokładności z 50 drzewami i 600 000 przykładów treningu.
Uwat
2
Zauważ, że w tym momencie prawie nie używasz przypadkowego lasu, ale jak stwierdzono w innych odpowiedziach, nie jest to idealny klasyfikator dla tego konkretnego problemu.
Richard Rast