【问题标题】:R random forest inconsistent predictionsR随机森林不一致的预测
【发布时间】:2019-01-22 17:21:48
【问题描述】:

我最近使用 R 中的 ranger 包构建了一个随机森林模型。但是,我注意到训练期间存储在 ranger 对象中的预测(可通过 model$predictions 访问)与运行预测时得到的预测不匹配使用创建的模型对同一数据集执行命令。以下代码重现了 mtcars 数据集上的问题。我创建了一个二进制变量只是为了将其转换为分类问题,尽管我也看到了与回归树相似的结果。

library(datasets)
library(ranger)
mtcars <- mtcars
mtcars$mpg2 <- ifelse(mtcars$mpg > 19.2 , 1, 0)
mtcars <- mtcars[,-1]
mtcars$mpg2 <- as.factor(mtcars$mpg2)
set.seed(123)
mod <- ranger(mpg2 ~ ., mtcars, num.trees = 20, probability = T)
mod$predictions[1,] # Probability of 1 = 0.905
predict(mod, mtcars[1,])$predictions # Probability of 1 = 0.967

这个问题也出现在 randomForest 包中,我观察到类似的问题可以用以下代码重现。

library(randomForest)
set.seed(123)
mod <- randomForest(mpg2 ~ ., mtcars, ntree = 20)
mod$votes[1,]
predict(mod, mtcars[1,], type = "prob")

谁能告诉我为什么会这样?我希望结果是一样的。我做错了什么,还是我对导致这种情况的随机森林的某些固有属性的理解有误?

【问题讨论】:

    标签: r machine-learning random-forest


    【解决方案1】:

    我认为您可能想更深入地了解随机森林的工作原理。我真的推荐 R 中的统计学习简介 (ISLR),它可以在线免费获得 here

    也就是说,我认为这里的主要问题是您将 mod$votes 值和 predict() 值视为相同,而它们并不完全相同。如果您查看 randomForest 函数的文档,mod$votesmod$predicted 值是输入数据的袋外 ("OOB") 预测。这与predict() 函数生成的值不同,后者评估对randomForest() 生成的模型的观察。通常,您希望在一组数据上训练模型,并在测试集上使用 predict() 函数。

    最后,如果您想为 mod 对象获得相同的结果,您可能需要在每次创建随机森林时重新运行您的 set.seed() 函数。我认为有一种方法可以为整个会话设置种子,但我不确定。这看起来很有用:Fixing set.seed for an entire session

    旁注:这里,您没有指定要用于每棵树的变量数量,但在大多数情况下,默认值已经足够了(请查看您使用的每个随机森林函数的文档以了解默认值)。也许你在你的实际代码中这样做并且没有将它包含在你的示例中,但我认为值得一提。

    希望这会有所帮助!

    编辑: 我尝试使用除第一次观察(马自达 RX4)之外的所有数据来训练随机森林,然后仅在该观察上使用预测函数,我认为这更好地说明了我的观点。尝试运行这样的东西:

    library(randomForest)
    set.seed(123)
    mod <- randomForest(mpg2 ~ ., mtcars[-1,], ntree = 200)
    predict(mod, mtcars[1,], type = "prob")
    

    【讨论】:

    • 感谢您的回复。我通常使用 ranger,这是我提供的第一个示例,并且在这两种情况下我都使用了 $predictions。所以我对出现的差异感到困惑。我将阅读 ISLR 并回到这里,因为虽然我只发布了训练集,但我在测试中也遇到了类似的问题。我制作了一个模型,在测试集上运行预测,并将模型保存为 rda。但是当我重新加载 rda 并对相同的测试数据进行预测时,数字会发生变化。如果再次通过 ISLR 无法解决我的问题,我将发布一个可重现的示例。再次感谢您的指导!
    【解决方案2】:

    由于您已将 mpg 转换为 mpg2,因此您希望构建分类模型。但是,当您的模型试图从您的数据点中学习时, mod$predictions 会为您提供概率,而 predict(mod,mtcars[,1:10])$predictions 选项会提供来自训练模型的概率。使用 Probability = F 运行相同的代码,得到以下结果,您可以看到训练模型的预测是完美的,而从 mod$predictions 选项我们有 3 个未命中分类。

    mod <- ranger(mpg2 ~ ., mtcars, num.trees = 20, probability = F) 
    
    > table(mtcars$mpg2,predict(mod, mtcars[,1:10])$predictions)
    
         0  1
      0 17  0
      1  0 15
    > table(mtcars$mpg2,mod$predictions)
    
         0  1
      0 15  2
      1  1 14
    

    【讨论】:

    • 这如何回答这个问题,这正是关于两种方法之间不同结果的问题?
    • 在我的例子中,因变量是二元的,但我们需要概率预测,因为不同的概率水平会导致不同的业务决策。例如,有 75% 概率的人被拒绝贷款,而有 50% 概率的人可能会获得部分贷款等。
    • 这是我要说的一点“mod$predictions 为您提供概率,而您的模型正试图从您的数据点和 predict(mod,mtcars[,1:10])$predictions 选项中学习给出训练模型的概率”。同样的@Parker Quinn 也使用了更好的术语进行了解释。
    猜你喜欢
    • 2019-05-04
    • 2014-08-17
    • 2014-08-07
    • 2019-02-19
    • 2021-03-21
    • 2021-07-12
    • 2020-10-20
    • 2019-07-10
    相关资源
    最近更新 更多