Ist eine Vorverarbeitung vor der Vorhersage mit FinalModel von RandomForest mit Caret-Paket erforderlich?

12

Ich verwende das Caret-Paket zum Trainieren eines randomForest-Objekts mit 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"))

Danach teste ich den randomForest auf einem testSet (neue Daten)

RF.testSet$Prediction <- predict(RFFit, newdata=testSet)

Die Verwirrungsmatrix zeigt mir, dass das Modell nicht so schlecht ist.

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 

Ich möchte jetzt das $ finalModel testen und ich denke, es sollte mir das gleiche Ergebnis liefern, aber irgendwie erhalte ich es

> 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 

Was vermisse ich?

edit @topepo:

Ich habe auch einen anderen randomForest ohne die vorverarbeitete Option gelernt und ein anderes Ergebnis erhalten:

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     
Frank
quelle
In der ersten Instanz haben Sie mit einem Zugobjekt vorhergesagt, das Sie aufgerufen RFFithaben. In der zweiten Instanz haben Sie mit dem Modellobjekt vorausgesagt, denke ich. Der Unterschied könnte also darin bestehen, andere Dinge zusammen mit dem Zugobjekt zu übergeben, das Ihre neuen Testdaten irgendwie anders verarbeitet hat, als ohne das Zugobjekt zu verwenden.
Promotion am
4
Für das 2. trainModell erhalten Sie ein etwas anderes Ergebnis, es sei denn, Sie legen den Zufallszahlen-Startwert fest, bevor Sie ihn ausführen (siehe ?set.seed). Die Genauigkeitswerte sind 0,8135 und 0,8111, die ziemlich nahe beieinander liegen und nur auf die Zufälligkeit des Resamplings und die Modellberechnungen zurückzuführen sind.
Topepo

Antworten:

17

Der Unterschied ist die Vorverarbeitung. predict.trainzentriert und skaliert die neuen Daten automatisch (da Sie danach gefragt haben), während sie predict.randomForestalles nehmen, was ihnen gegeben wurde. Da die Baumaufteilungen auf den verarbeiteten Werten basieren, sind die Vorhersagen deaktiviert.

Max

topepo
quelle
Das RFFitObjekt wird jedoch mit der trainMethode preProcessed erstellt. Daher sollte ein zentriertes und skaliertes Objekt zurückgegeben werden (nicht wahr?). Wenn ja -> $finalModelsollte das auch skaliert und zentriert werden
Frank
2
Ja, aber gemäß dem obigen Code haben Sie die Zentrierung und Skalierung nicht angewendet testSet. predict.traintut das aber predict.randomForestnicht.
Topepo
Es gibt also keinen Unterschied bei der Verwendung predict(RFFit$finalModel, testSet)und predict(RFFit, testSet)auf demselben TestSet?
Frank
6
predict(RFFit$finalModel, testSet)und predict(RFFit, testSet)wird anders sein, wenn Sie die preProcOption in verwenden train. Wenn Sie dies nicht tun, trainieren sie mit demselben Datensatz. Mit anderen Worten, jede Vorverarbeitung, die Sie anfordern, wird vor dem Ausführen mit dem Trainingssatz durchgeführt randomForest. Dieselbe Vorverarbeitung wurde auch auf alle Daten angewendet, die Sie vorhersagen (mit predict(RFFit, testSet)). Wenn Sie das finalModelObjekt verwenden, verwenden Sie predict.randomForeststattdessen predict.trainund keine Vorverarbeitung wird vor der Vorhersage durchgeführt.
Topepo