【问题标题】:R caret: values of $finalModel$predicted and values obtained by predict()R 插入符号:$finalModel$predicted 的值和通过 predict() 获得的值
【发布时间】:2019-06-02 04:47:56
【问题描述】:

为了说明$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 不同?这两个预测有什么区别?

【问题讨论】:

    标签: r prediction r-caret


    【解决方案1】:

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

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


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

    newdata - 包含新数据的数据框或矩阵。 (注:如果不是 给定,对象中的袋外预测被返回。

    其中rf_gridsearch$finalModel$predicted基本相同

    randomForest:::predict.randomForest(rf_gridsearch$finalModel)
    

    因为rf_gridsearch$finalModelrandomForest 类的对象。也就是说,不会提供newdata

    至于错误,它与trainrandomForest 对待数据不同的事实有关。这一次不是关于缩放或居中,而是关于创建假人。特别是,randomForest 正在寻找C 变量(因子),而train 创建了虚拟变量CB &lt;- 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
    

    【讨论】:

    • 感谢您的回复。但我为 predict() 函数提供了新数据。那么为什么它会返回 OOB 预测呢?
    • @yPennylane,我在回答中澄清说,如果还有什么不清楚的地方,请告诉我。您确实在dat$pred2 中提供了数据,但出现了错误。我解释了错误;一旦我们修复它,那么它确实不再是 OOB 预测并且与 dat$pred 重合。
    • 我还为计算dat$pred (dat$pred &lt;- predict(object = rf_gridsearch, newdata = dat[,2:4])) 提供了新数据。该行没有产生错误,但给出的值与 rf_gridsearch$finalModel$predicted 不同
    • @yPennylane, 1) rf_gridsearch 属于train 类并使用predict.train, 2) rf_gridsearch$finalModel 属于randomForest 类并使用predict.randomForest, 3) 由于什么我在我的回答中说过(许多链接的答案都在讨论),rf_gridsearch$finalModel$predicted 给出的结果与predict(rf_gridsearch$finalModel) 相同,即OOB,4)使用predict(rf_gridsearch) 有或没有newdata 不会给出OOB,predict(rf_gridsearch$finalModel, newdata = ...) 也不会给出OOB .
    • 好的。但是,predict(rf_gridsearch) 给出了什么?它是否使用最终模型的所有输入数据(新数据)来预测值?
    猜你喜欢
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2012-06-03
    • 2020-02-24
    相关资源
    最近更新 更多