使用带有插入符号包的RandomForest的FinalModel进行预测之前是否需要进行预处理?


12

我使用插入符号包训练10x10CV的randomForest对象。

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"))

之后,我在testSet上测试randomForest(新数据)

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

混乱矩阵向我展示了该模型还不错。

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 

我现在想测试$ finalModel,我认为它应该给我相同的结果,但是以某种方式我收到了

> 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 

我想念什么?

编辑@topepo:

我还学习了另一个没有preProcessed选项的randomForest,并得到了另一个结果:

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     

RFFit我猜是第一种情况,您使用称为的火车对象进行了预测,第二种情况是使用模型对象进行了预测。因此,区别可能在于将其他事物与处理新测试数据的火车对象一起传递的方式与不使用火车对象的传递方式有所不同。
攻读博士学位

4
对于第二个train模型,除非您在运行随机种子之前对其进行设置(请参阅参考资料?set.seed),否则结果会略有不同。精度值为0.8135和0.8111,这非常接近,并且仅是由于重采样和模型计算的随机性。
topepo 2014年

Answers:


17

区别在于预处理。predict.train自动(根据您的要求)对新数据进行居中和缩放,同时predict.randomForest获取给出的所有数据。由于树拆分基于处理后的值,因此预测将不可用。

最高


但是RFFit对象是使用preProcessed train方法创建的...因此它应返回居中并缩放的对象(不是吗?)。如果是这样-> $finalModel还应该缩放并居中
弗兰克(Frank)

2
是的,但是根据上面的代码,您尚未将居中和缩放应用于testSetpredict.train做到了,但是predict.randomForest没有。
topepo 2014年

所以在同一个testSet上使用predict(RFFit$finalModel, testSet)和没有区别predict(RFFit, testSet)
2014年

6
predict(RFFit$finalModel, testSet)predict(RFFit, testSet)如果你使用的将是不同preProc的选项train。如果您不这样做,他们将在同一数据集上进行训练。换句话说,您要求的任何预处理都在运行之前对训练集进行了randomForest。它还将相同的预处理应用于您预测的任何数据(使用predict(RFFit, testSet))。如果使用finalModel对象,则使用predict.randomForest而不是,predict.train并且在预测之前不会进行任何预处理。
topepo 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.