Metoda punktacji OOB RandomForestClassifier

16

Czy przypadkowa implementacja lasu w scikit-learn wykorzystuje średnią dokładność jako metodę punktacji do oszacowania błędu uogólnienia przy próbkach z worka? Nie jest to wspomniane w dokumentacji, ale metoda score () podaje średnią dokładność.

Mam bardzo niezrównoważony zestaw danych i używam AUC ROC jako mojej metryki punktacji w wyszukiwaniu siatki. Czy istnieje sposób, aby powiedzieć klasyfikatorowi, aby używał tej samej metody oceniania również na próbkach OOB?

darXider
źródło
Oob_score parametr RandomForestClassifier klasie nie robić to, co chcesz?
Pierre
AFAIK, oob_scorezgłoś dokładność. Muszę jednak jeszcze raz spojrzeć na kod źródłowy.
darXider
Jaki parametr szacujesz podczas wyszukiwania siatki?
JahKnows,
^ Przepraszam, ale teraz tak naprawdę nie pamiętam! Zadałem to pytanie 1,5 roku temu.
darXider

Odpowiedzi:

14

Ogólnie wydajność klasyfikatorów porównuje się przy użyciu dokładności, jest to miara liczby poprawnie sklasyfikowanych instancji podzielona przez całkowitą liczbę instancji. Jednak na podstawie danych treningowych możemy uzyskać lepsze przybliżenie oczekiwanego błędu od naszego klasyfikatora, gdy stosujemy techniki uczenia się w grupach lub workowania.

Błąd braku worka

xja

Aby zaimplementować OOB w sklearn, musisz określić go podczas tworzenia obiektu Losowe lasy jako

from sklearn.ensemble import RandomForestClassifier 
forest = RandomForestClassifier(n_estimators = 100, oob_score = True)

Następnie możemy wytrenować model

forest.fit(X_train, y_train)
print('Score: ', forest.score(X_train, y_train))

Wynik: 0,979921928817

Zgodnie z oczekiwaniami dokładność modelu podczas oceny zestawu treningowego jest bardzo wysoka. Jest to jednak bez znaczenia, ponieważ bardzo dobrze możesz przepełniać swoje dane, a zatem Twój model jest śmieci. Możemy jednak użyć wyniku poza torbą jako

print(forest.oob_score_)

0,86453272101

Jest to dokładność podczas oceny naszych instancji w zestawie treningowym przy użyciu tylko drzew, dla których zostały pominięte. Teraz obliczmy wynik na zestawie testowym jako

print('Score: ', forest.score(X_test, y_test))

Wynik: 0,86517733935

Widzimy, że dokładność zmierzona przez OOB jest bardzo podobna do tej uzyskanej z zestawem testowym. Wynika stąd teoria, że ​​dokładność OOB jest lepszą miarą, dzięki której można oceniać wydajność modelu, a nie tylko wynik. Jest to konsekwencja modeli workowania i nie można tego zrobić z innymi typami klasyfikatorów.

Obliczanie OOB przy użyciu różnych wskaźników

Tak, możesz to zrobić! Zależy to jednak od tego, jak dokładnie tworzony jest kod. Nie jestem pewien, w jaki sposób można włączyć OOB i AUC wszystkie razem z cross_val_scorefunkcją. Jeśli jednak ręcznie wykonujesz fałdy krzyżowe, możesz wykonać następujące czynności: algorytm losowych lasów w sklearn zapewnia funkcję decyzyjną OOB jako

print(forest.oob_decision_function_)

Klasę można następnie uzyskać za pomocą

from sklearn import metrics
pred_train = np.argmax(forest.oob_decision_function_,axis=1)

Następnie możemy obliczyć AUC za pomocą następującego

metrics.roc_auc_score(y_train, pred_train)

0,86217157846471204

JahKnows
źródło
4
Dzięki! Wiem, jak działa proces OOB w losowych lasach. Pytałem konkretnie, czy RandomForestClassifiermoże zwrócić wynik OOB, który NIE jest dokładnością, a druga część twojej odpowiedzi stanowi bardzo dobrą wskazówkę, jak podejść do tego problemu. Muszę jednak podkreślić, że nie należy używać etykiet klas do obliczania AUC krzywej ROC; raczej prawdopodobieństwa klasowe należy stosować bezpośrednio. Tak więc poprawna definicja byłaby pred_train = forest.oob_decision_function_[:, 1].
darXider
@darXider Czy to nie jest podejrzane, ponieważ forest.oob_decision_function_.shape [0] == X_train.shape [0], podczas gdy spodziewam się, że będzie to == liczba próbek OOB, która powinna być mniejsza niż liczba próbek w X_train? Również osobiście byłem zainteresowany obliczeniem utraty logów, dla innych, którzy też chcą to zrobić, myślę, że pred_train powinien być = forest.oob_decision_function_.
Sander Vanden Hautte