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 ...
Odpowiedzi:
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=True
podczas 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, czyscikit-learn
wdroż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ę.
źródło
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)
źródło