R 插入符号:$finalModel$predicted 的值和通过 predict() 获得的值
R caret: values of $finalModel$predicted and values obtained by predict()
为了说明 $finalModel$predicted
和 predict()
计算的值之间的差异,我设置了以下代码:
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_caret
与 dat$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$finalModel
是 randomForest
class 的对象。也就是说,没有提供 newdata
。
至于错误,它与train
和randomForest
处理数据的方式不同有关。这次不是关于缩放或居中,而是关于创建虚拟对象。特别是,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
为了说明 $finalModel$predicted
和 predict()
计算的值之间的差异,我设置了以下代码:
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_caret
与 dat$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$finalModel
是 randomForest
class 的对象。也就是说,没有提供 newdata
。
至于错误,它与train
和randomForest
处理数据的方式不同有关。这次不是关于缩放或居中,而是关于创建虚拟对象。特别是,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