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
źródło
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
classwt
parametrem.źródło
classwt
parametr, nie sądzę, aby został on jeszcze zaimplementowany wrandomForest()
funkcjirandomForest
pakietu 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ślnejclasswt=NULL
.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ć
subset
argument 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
classwt
parametr 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ź
strata
argument.źródło