Jak interpretować macierz OOB i zamieszanie dla losowego lasu?

35

Mam od kogoś skrypt R do uruchomienia losowego modelu lasu. Zmodyfikowałem i uruchomiłem go z niektórymi danymi pracowników. Staramy się przewidzieć dobrowolne separacje.

Oto kilka dodatkowych informacji: jest to model klasyfikacji, w którym 0 = pracownik został, 1 = pracownik został zakończony, obecnie obserwujemy tylko tuzin zmiennych predykcyjnych, dane są „niezrównoważone” w tym sensie, że rekordy tworzą około 7 % całkowitego zestawu rekordów.

Korzystam z modelu z różnymi opcjami mtry i ntree, ale zdecydowałem się na poniższe. OOB wynosi 6,8%, co moim zdaniem jest dobre, ale macierz nieporozumień wydaje się opowiadać inną historię przewidywania warunków, ponieważ poziom błędu jest dość wysoki i wynosi 92,79%. Czy mam rację, zakładając, że nie mogę polegać na tym modelu i używać go, ponieważ wysoki poziom błędu w przewidywaniu terminów? lub czy jest coś, co mogę zrobić, aby użyć RF i uzyskać mniejszy poziom błędu w przewidywaniu terminów?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908
daniellopez46
źródło

Odpowiedzi:

20

Macierz nieporozumień jest obliczana w określonym punkcie określonym przez wartość graniczną głosów. W zależności od potrzeb, tj. Lepszej precyzji (redukcja fałszywych alarmów) lub lepszej czułości (redukcja fałszywych negatywów), możesz wybrać inną wartość graniczną.

W tym celu zalecam wykreślenie (i) krzywej ROC , (ii) precyzji przypominania i (iii) krzywej kalibracji, aby wybrać wartość graniczną, która najlepiej pasuje do twoich celów. Wszystkie te można łatwo wykreślić za pomocą 2 następujących funkcji z biblioteki ROCR R (dostępnej również w CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Na przykład:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);
Itamar
źródło
Interesuje mnie twoja odpowiedź, narysowałem z udostępnionym kodem. czy możesz podać mi trochę zasobów, aby znaleźć trochę szczegółów na temat sugerowanej przez ciebie fabuły. lub napisze kilka zdań o tym, jak to interpretować. Z góry bardzo dziękuję.
MKS
Sugeruję, aby zacząć od wpisu dla krzywej ROC, który łączył się z powyższym i innych wpisów tam wymienionych.
Itamar,
Odpowiedź nie dotyczy bezpośrednio ograniczenia drzewa decyzyjnego w mocno wypaczonym zbiorze danych.
SmallChess
19

Twój zestaw jest bardzo niezrównoważony - RF zwykle zawodzi w tym scenariuszu (tzn. Dobrze przewiduje tylko większą klasę).

Powinieneś spróbować zbalansować swój zestaw albo próbkując klasę „0”, aby mieć mniej więcej taki sam rozmiar jak klasa „1” lub grając z classwtparametrem.


źródło
1
Mimo że istnieje classwtparametr, nie sądzę, aby został on jeszcze zaimplementowany w randomForest()funkcji randomForestpakietu w R. Per Link . Używałeś go wcześniej? Próbowałem z różnymi wartościami, ale otrzymałem identyczne wyniki do wartości domyślnej classwt=NULL.
Zhubarb,
9

W oparciu o macierz nieporozumień masz 5908 punktów danych, a ogromna większość z nich jest typu 0 („pracownik pozostał”). Klasyfikator może zatem uciec od bycia „leniwym” i wybierania klasy większości, chyba że jest absolutnie pewne, że przykład należy do innej klasy. Zauważ, że ogólny poziom błędu wynosi ~ 7%, co jest dość zbliżone do procentu przykładów klasy 1!

Masz kilka opcji:

  • Odrzuć przykłady Class0, dopóki nie uzyskasz w przybliżeniu zbalansowanych klas. Nie wiem, czy istnieje literatura na temat wyboru optymalnie reprezentatywnego podzbioru (może ktoś inny może ważyć?), Ale możesz zacząć od losowego podawania przykładów. Możesz przekazać subsetargument do randomForest, co powinno uczynić to trywialnym do przetestowania.

  • Dostosuj swoją funkcję utraty / wagi klas, aby zrekompensować nieproporcjonalną liczbę klas0. Zasadniczo chcesz sprawić, aby klasyfikator błędnie zaklasyfikował przykład klasy 1 niż klasy 0. Na początek warto spróbować Class0 = 1 / 0,07 ~ = 14x Class1, ale możesz to dostosować w zależności od wymagań biznesowych (o ile gorszy jest jeden rodzaj błędu). Myślę, że classwtparametr jest tym, czego tu szukasz.

  • Użyj próbkowania warstwowego, aby upewnić się, że masz dane z obu klas w danych treningowych drzew. Możliwe, że niektóre z twoich drzew były trenowane tylko na danych klasy 0, co oczywiście źle wróży ich wydajności uogólniającej. Sprawdź strataargument.

Matt Krause
źródło
Losowy wybór z klasy dominującej brzmi rozsądnie. Nie muszą być równe: nawet stosunek 1: 5 powinien być poprawą.
Itamar,
@ Itmar, zdecydowanie tego najpierw bym spróbował. Wydaje się jednak, że musi istnieć sposób, aby zapewnić, że zachowane przykłady są reprezentatywne dla większego zestawu danych.
Matt Krause,
1
Jedną z opcji może być uruchomienie PCA (analiza składnika podstawowego) na większym zestawie, grupowanie punktów zgodnie z pierwszym składnikiem podstawowym i wybranie jednej próbki z każdego klastra.
Itamar