Używam pakietu karetki do trenowania obiektu randomForest z 10x10CV.
library(caret)
tc <- trainControl("repeatedcv", number=10, repeats=10, classProbs=TRUE, savePred=T)
RFFit <- train(Defect ~., data=trainingSet, method="rf", trControl=tc, preProc=c("center", "scale"))
Następnie testuję randomForest na testSet (nowe dane)
RF.testSet$Prediction <- predict(RFFit, newdata=testSet)
Macierz pomieszania pokazuje mi, że model nie jest taki zły.
confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
Reference
Prediction 0 1
0 886 179
1 53 126
Accuracy : 0.8135
95% CI : (0.7907, 0.8348)
No Information Rate : 0.7548
P-Value [Acc > NIR] : 4.369e-07
Kappa : 0.4145
Chcę teraz przetestować $ finalModel i myślę, że powinien dać mi ten sam wynik, ale jakoś to otrzymuję
> RF.testSet$Prediction <- predict(RFFit$finalModel, newdata=RF.testSet)
> confusionMatrix(data=RF.testSet$Prediction, RF.testSet$Defect)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 323 66
1 616 239
Accuracy : 0.4518
95% CI : (0.4239, 0.4799)
No Information Rate : 0.7548
P-Value [Acc > NIR] : 1
Kappa : 0.0793
czego mi brakuje?
edytuj @topepo:
Nauczyłem się również innego randomForest bez opcji wstępnie przetworzonego i uzyskałem inny wynik:
RFFit2 <- train(Defect ~., data=trainingSet, method="rf", trControl=tc)
testSet$Prediction2 <- predict(RFFit2, newdata=testSet)
confusionMatrix(data=testSet$Prediction2, testSet$Defect)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 878 174
1 61 131
Accuracy : 0.8111
95% CI : (0.7882, 0.8325)
No Information Rate : 0.7548
P-Value [Acc > NIR] : 1.252e-06
Kappa : 0.4167
r
random-forest
prediction
caret
Szczery
źródło
źródło
RFFit
, a po raz drugi przewidziałeś za pomocą obiektu modelowego, tak myślę. Różnica może więc polegać na przekazywaniu innych rzeczy wraz z obiektem pociągu, który przetwarzał nowe dane testowe w inny sposób niż bez użycia obiektu pociągu.train
modelu otrzymasz nieco inny wynik, chyba że ustawisz ziarno liczb losowych przed uruchomieniem go (patrz?set.seed
). Wartości dokładności wynoszą 0,8135 i 0,8111, które są dość bliskie i tylko z powodu losowości ponownego próbkowania i obliczeń modelu.Odpowiedzi:
Różnica polega na przetwarzaniu wstępnym.
predict.train
automatycznie centruje i skaluje nowe dane (ponieważ o to prosiłeś), jednocześnie biorącpredict.randomForest
wszystko, co zostało podane. Ponieważ podziały drzewa są oparte na przetworzonych wartościach, przewidywania będą wyłączone.Max
źródło
RFFit
obiekt jest tworzony za pomocą wstępnie przetworzonejtrain
metody ... więc powinien zwrócić wyśrodkowany i przeskalowany obiekt (prawda?). Jeśli tak ->$finalModel
należy również przeskalować i wyśrodkowaćtestSet
.predict.train
robi to, alepredict.randomForest
nie robi.predict(RFFit$finalModel, testSet)
ipredict(RFFit, testSet)
na tym samym testSet?predict(RFFit$finalModel, testSet)
ipredict(RFFit, testSet)
będzie inny, jeśli użyjeszpreProc
opcji wtrain
. Jeśli tego nie zrobisz, uczą się na tym samym zestawie danych. Innymi słowy, każde wstępne przetwarzanie, o które prosisz, odbywa się w zestawie treningowym przed uruchomieniemrandomForest
. Zastosował również to samo wstępne przetwarzanie do wszystkich danych, które przewidujesz (wykorzystujeszpredict(RFFit, testSet)
). Jeśli używaszfinalModel
obiektu, używasz gopredict.randomForest
zamiastpredict.train
i żadne wstępne przetwarzanie nie jest wykonywane przed prognozowaniem.