Czy konieczne jest wstępne przetwarzanie przed prognozowaniem przy użyciu FinalModel z RandomForest z pakietem Caret?

12

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     
Szczery
źródło
po pierwsze, przewidziałeś za pomocą obiektu pociągu, który wywołałeś 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.
doktorat
4
W przypadku drugiego trainmodelu 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.
topepo

Odpowiedzi:

17

Różnica polega na przetwarzaniu wstępnym. predict.trainautomatycznie centruje i skaluje nowe dane (ponieważ o to prosiłeś), jednocześnie biorąc predict.randomForestwszystko, co zostało podane. Ponieważ podziały drzewa są oparte na przetworzonych wartościach, przewidywania będą wyłączone.

Max

topepo
źródło
ale RFFitobiekt jest tworzony za pomocą wstępnie przetworzonej trainmetody ... więc powinien zwrócić wyśrodkowany i przeskalowany obiekt (prawda?). Jeśli tak -> $finalModelnależy również przeskalować i wyśrodkować
Frank
2
Tak, ale zgodnie z powyższym kodem nie zastosowano centrowania i skalowania testSet. predict.trainrobi to, ale predict.randomForestnie robi.
topepo
więc nie ma różnicy w użyciu predict(RFFit$finalModel, testSet)i predict(RFFit, testSet)na tym samym testSet?
Frank
6
predict(RFFit$finalModel, testSet)i predict(RFFit, testSet)będzie inny, jeśli użyjesz preProcopcji w train. 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 uruchomieniem randomForest. Zastosował również to samo wstępne przetwarzanie do wszystkich danych, które przewidujesz (wykorzystujesz predict(RFFit, testSet)). Jeśli używasz finalModelobiektu, używasz go predict.randomForestzamiast predict.traini żadne wstępne przetwarzanie nie jest wykonywane przed prognozowaniem.
topepo