R 插入符号:$finalModel$predicted 的值和通过 predict() 获得的值

R caret: values of $finalModel$predicted and values obtained by predict()

为了说明 $finalModel$predictedpredict() 计算的值之间的差异,我设置了以下代码:

library(caret)
library(randomForest)

dat <- data.frame(target = c(2.5, 4.5, 6.1, 3.2, 2.2),
              A = c(1.3, 4.4, 5.5, 6.7, 8.1),
              B = c(44.5, 50.1, 23.7, 89.2, 10.5),
              C = c("A", "A", "B", "B", "B"))

control <- trainControl(method="repeatedcv", number=10, repeats=3,     search="grid", savePred =T)

tunegrid <- expand.grid(.mtry=c(1:3))

set.seed(42)
rf_gridsearch <- train(target ~ A + B + C, 
                   data = dat, 
                   method="rf",
                   ntree = 2500, 
                   metric= "RMSE", 
                   tuneGrid=tunegrid, 
                   trControl=control)

dat$pred_caret <- rf_gridsearch$finalModel$predicted

dat$pred <- predict(object = rf_gridsearch, newdata = dat[,2:4])
dat$pred2 <- predict(object = rf_gridsearch$finalModel, newdata = dat[,2:4])

此代码的最后一行给出了错误消息

Error in predict.randomForest(object = rf_gridsearch$finalModel, 
newdata = dat[,  : variables in the training data missing in newdata

如何将 $finalModel 与预测结合使用?

为什么 dat$pred_caret 列中的数据与 dat$pred 列中的数据不同? 2个预测有什么区别?

已经有很多与此问题相关的问题。参见

  • Using randomForest package in R, how to get probabilities from classification model?
  • R random forest inconsistent predictions

在 SO 上 Question 1, Question 2, Question 3, Question 4, Question 5 在 Stats.SE.


关于 Stats.SE 的几个答案提到,dat$pred_caretdat$pred 不同,因为 predict.train 使用整个训练集,而 predict.randomForest 我们有那个

newdata - a data frame or matrix containing new data. (Note: If not given, the out-of-bag prediction in object is returned.

其中rf_gridsearch$finalModel$predicted

基本相同
randomForest:::predict.randomForest(rf_gridsearch$finalModel)

因为 rf_gridsearch$finalModelrandomForest class 的对象。也就是说,没有提供 newdata

至于错误,它与trainrandomForest处理数据的方式不同有关。这次不是关于缩放或居中,而是关于创建虚拟对象。特别是,randomForest 正在寻找 C 变量(因子),而 train 创建了虚拟变量 CB <- 1 * (C == "B")。因此,您可以使用

复制 predict.train 的结果
predict(object = rf_gridsearch$finalModel, 
        newdata = model.matrix(~ A + B + C, dat[, 2:4])[, -1])

哪里

model.matrix(~ A + B + C, dat[, 2:4])[, -1]
#     A    B CB
# 1 1.3 44.5  0
# 2 4.4 50.1  0
# 3 5.5 23.7  1
# 4 6.7 89.2  1
# 5 8.1 10.5  1