Jak zmienić próg klasyfikacji w R randomForests?

10

Cała literatura na temat modelowania rozmieszczenia gatunków sugeruje, że przy przewidywaniu obecności / nieobecności gatunku przy użyciu modelu, który generuje prawdopodobieństwa (np. RandomForests), ważny jest wybór progowej prawdopodobieństwa, według której można faktycznie sklasyfikować gatunek jako obecność lub nieobecność i należy nie zawsze polegają na domyślnej wartości 0,5. Potrzebuję w tym pomocy! Oto mój kod:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

Na tej podstawie ustaliłem, że próg, który chciałbym zastosować do klasyfikacji obecności na podstawie przewidywanych prawdopodobieństw, wynosi 0,7, a nie wartość domyślna 0,5. Nie do końca rozumiem, co zrobić z tymi informacjami. Czy po prostu używam tego progu podczas tworzenia mapy wyników? Mógłbym łatwo stworzyć odwzorowane wyjście z ciągłym prawdopodobieństwem, a następnie po prostu przeklasyfikować te z wartościami większymi niż 0,7 jako obecne, a te <0,7 jako nieobecne.

Czy też chcę wziąć te informacje i ponownie uruchomić modelowanie randomForests, używając parametru odcięcia? Co dokładnie robi parametr odcięcia? Czy to zmienia wynikowy głos? (obecnie mówi, że jest to „większość”). Jak korzystać z tego parametru odcięcia? Nie rozumiem dokumentacji! Dzięki!

coś
źródło
2
Powiedziałbym, że to może należeć tutaj: kwestia (1) szacunków prawdopodobieństwa z RF, (2) czy można narzucić funkcję modelu na model, czy trzeba go wbudować w model, oraz (3) jak zaimplementować funkcje kosztów w RF występują powtarzające się problemy, które nie są po prostu związane z programowaniem.
Charles

Odpowiedzi:

7

# ustawić wartość progową lub wartość odcięcia na 0,7

cutoff=0.7

# wszystkie wartości niższe niż wartość odcięcia 0,7 zostaną sklasyfikowane jako 0 (obecne w tym przypadku)

RFpred[RFpred<cutoff]=0

# wszystkie wartości większe niż wartość odcięcia 0,7 zostaną sklasyfikowane jako 1 (w tym przypadku nieobecne)

 RFpred[RFpred>=cutoff]=1
zalanie
źródło
1
Czy mógłbyś trochę rozwinąć swoją odpowiedź? Przydatne byłoby przynajmniej opatrzenie adnotacjami kodu.
Patrick Coulombe,
2
FWIW, myślę, że to jest całkowicie wystarczające.
Sycorax mówi Przywróć Monikę
Ta odpowiedź jest całkowicie trafna. Zgadzam się.
Seanosapien,
7

Przepraszam, że nie dostałeś i próbuje odpowiedzi. Poleciłbym książkę Maxa Kuhna do omówienia tego wydania. To dość szeroki problem. Po prostu dodaj trochę bitów:

  1. Krzywe ROC są popularne, ale mają sens tylko wtedy, gdy próbujesz zrozumieć kompromis między kosztami wyników fałszywie ujemnych i fałszywie pozytywnych. Jeśli CostFN = CostFP, to nie jestem pewien, czy ma to sens. Statystyka c i inne pochodne miary nadal mają zastosowanie. Jeśli chcesz zmaksymalizować dokładność - po prostu dostosuj swój model do tego (pakiet narzędzi ułatwia to), nie rób krzywej ROC.
  2. Każdy korzysta z prawdopodobieństw wyprowadzonych z modeli RF. Uważam, że należy się nad tym zastanowić - nie są to modele probabilistyczne, nie są do tego stworzone. To często działa. Przynajmniej bym opracował wykres walidacji prawdopodobieństw RF na nowych danych, jeśli naprawdę byłbym zainteresowany prawdopodobieństwami
  3. Najprostszym sposobem byłoby użycie opcji „po prostu przeklasyfikuj wartości o wartości większej niż 0,7, jeśli są obecne, a wartości <0,7, jeśli nieobecne”.
  4. Jeśli koszt (FN) nie jest równy kosztowi (FP), musisz uczynić RF wrażliwym na koszty. R nie ułatwia tego. Funkcja ważenia w pakiecie RandomForest nie działa. Najlepszą opcją jest zabawa z próbkowaniem, przypadkowa większość przypadków, aby uzyskać żądaną funkcję kosztów. Ale związek między współczynnikiem próby a kosztem nie jest bezpośredni. Więc możesz chcieć trzymać się (3)

Aktualizacja dotycząca wag klas Andy Liaw:
„Obecna opcja„ classwt ”w pakiecie randomForest istnieje od samego początku i różni się od sposobu, w jaki oficjalny kod Fortran (wersja 4 i nowsze) implementuje wagi klas. Po prostu uwzględnia klasę wagi w obliczeniach indeksu Gini podczas dzielenia węzłów, dokładnie tak, jak robi się pojedyncze drzewo CART, gdy podane są wagi klas. Prof. Breiman wymyślił nowy schemat ważenia klas zaimplementowany w nowszej wersji swojego kodu Fortran po tym, jak stwierdziliśmy, że po prostu używa wagi w indeksie Gini nie wydają się zbytnio pomagać w skrajnie niezrównoważonych danych (powiedzmy 1: 100 lub gorzej). Jeśli użycie ważonego Gini pomaga w twojej sytuacji, z pewnością to zrób. Mogę tylko powiedzieć, że w przeszłości nie dało nam oczekiwanego rezultatu ”.

Charles
źródło
Czy możesz wyjaśnić na temat podpunktu (4), dlaczego argument ważenia nie działa?
Sycorax mówi Przywróć Monikę
2
Zrozumiałem, że jest on odpowiednio zaimplementowany w kodzie Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ), ale nie w pakiecie R. Jest to omówione: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) i koncentruje się wokół konieczności używania ciężarów na wszystkich etapach budowy drzewa - nie tylko podziału Gini. Tak więc obecna implementacja R - która wykorzystuje tylko ważenie przy podziale, nie działa zbyt dobrze
Charles