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
r
random-forest
prediction
caret
Franc
la source
la source
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.train
modè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.Réponses:
La différence est le prétraitement.
predict.train
centre et met automatiquement à l'échelle les nouvelles données (puisque vous l'avez demandé) tout enpredict.randomForest
prenant 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
la source
RFFit
objet est créé avec latrain
méthode preProcessed ... il doit donc renvoyer un objet centré et mis à l'échelle (n'est-ce pas?). Si c'est le cas -> le$finalModel
devrait également être mis à l'échelle et centrétestSet
.predict.train
fait cela maispredict.randomForest
ne le fait pas.predict(RFFit$finalModel, testSet)
etpredict(RFFit, testSet)
sur le même testSet?predict(RFFit$finalModel, testSet)
etpredict(RFFit, testSet)
sera différent si vous utilisez l'preProc
option danstrain
. 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écutionrandomForest
. Il a également appliqué le même prétraitement à toutes les données que vous prévoyez (en utilisantpredict(RFFit, testSet)
). Si vous utilisez l'finalModel
objet, vous utilisez à lapredict.randomForest
place depredict.train
et aucun prétraitement n'est effectué avant la prédiction.