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
r
random-forest
prediction
caret
Frank
quelle
quelle
RFFit
haben. 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.train
Modell 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.Antworten:
Der Unterschied ist die Vorverarbeitung.
predict.train
zentriert und skaliert die neuen Daten automatisch (da Sie danach gefragt haben), während siepredict.randomForest
alles nehmen, was ihnen gegeben wurde. Da die Baumaufteilungen auf den verarbeiteten Werten basieren, sind die Vorhersagen deaktiviert.Max
quelle
RFFit
Objekt wird jedoch mit dertrain
Methode preProcessed erstellt. Daher sollte ein zentriertes und skaliertes Objekt zurückgegeben werden (nicht wahr?). Wenn ja ->$finalModel
sollte das auch skaliert und zentriert werdentestSet
.predict.train
tut das aberpredict.randomForest
nicht.predict(RFFit$finalModel, testSet)
undpredict(RFFit, testSet)
auf demselben TestSet?predict(RFFit$finalModel, testSet)
undpredict(RFFit, testSet)
wird anders sein, wenn Sie diepreProc
Option in verwendentrain
. 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ührtrandomForest
. Dieselbe Vorverarbeitung wurde auch auf alle Daten angewendet, die Sie vorhersagen (mitpredict(RFFit, testSet)
). Wenn Sie dasfinalModel
Objekt verwenden, verwenden Siepredict.randomForest
stattdessenpredict.train
und keine Vorverarbeitung wird vor der Vorhersage durchgeführt.