Un prétraitement est-il nécessaire avant la prédiction à l'aide de FinalModel de RandomForest avec package caret?

12

J'utilise le package caret pour entraîner un objet randomForest avec 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"))

Après cela, je teste randomForest sur un testSet (nouvelles données)

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

La matrice de confusion me montre que le modèle n'est pas si mauvais.

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 

Je veux maintenant tester le $ finalModel et je pense qu'il devrait me donner le même résultat, mais je reçois en quelque sorte

> 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 

Qu'est-ce que je rate?

modifier @topepo:

J'ai également appris un autre randomForest sans l'option pré-traitée et j'ai obtenu un autre résultat:

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     
Franc
la source
dans un premier temps, vous avez prédit avec un objet train que vous avez appelé RFFit, dans un second temps vous avez prédit en utilisant l'objet modèle, je suppose. Ainsi, la différence pourrait être de passer d'autres choses avec l'objet train qui a traité vos nouvelles données de test différemment que sans utiliser l'objet train.
doctorat du
4
Pour le 2ème trainmodèle, vous obtiendrez un résultat légèrement différent, sauf si vous définissez la valeur de départ aléatoire avant de l'exécuter (voir ?set.seed). Les valeurs de précision sont 0,8135 et 0,8111, qui sont assez proches et uniquement en raison du caractère aléatoire du rééchantillonnage et des calculs du modèle.
topepo

Réponses:

17

La différence est le prétraitement. predict.traincentre et met automatiquement à l'échelle les nouvelles données (puisque vous l'avez demandé) tout en predict.randomForestprenant tout ce qui est donné. Étant donné que les divisions d'arbre sont basées sur les valeurs traitées, les prédictions seront désactivées.

Max

topepo
la source
mais l' RFFitobjet est créé avec la trainméthode preProcessed ... il doit donc renvoyer un objet centré et mis à l'échelle (n'est-ce pas?). Si c'est le cas -> le $finalModeldevrait également être mis à l'échelle et centré
Frank
2
Oui mais, selon le code ci-dessus, vous n'avez pas appliqué le centrage et la mise à l'échelle à testSet. predict.trainfait cela mais predict.randomForestne le fait pas.
topepo
donc il n'y a pas de différence dans l'utilisation predict(RFFit$finalModel, testSet)et predict(RFFit, testSet)sur le même testSet?
Frank
6
predict(RFFit$finalModel, testSet)et predict(RFFit, testSet)sera différent si vous utilisez l' preProcoption dans train. Si vous ne le faites pas, ils s'entraînent sur le même ensemble de données. En d'autres termes, tout prétraitement que vous demandez est effectué sur l'ensemble d'entraînement avant l'exécution randomForest. Il a également appliqué le même prétraitement à toutes les données que vous prévoyez (en utilisant predict(RFFit, testSet)). Si vous utilisez l' finalModelobjet, vous utilisez à la predict.randomForestplace de predict.trainet aucun prétraitement n'est effectué avant la prédiction.
topepo