【问题标题】:Extracting class distribution at each final node of trees in random forest in R在R中随机森林中树的每个最终节点处提取类分布
【发布时间】:2016-02-02 21:13:07
【问题描述】:

我在 R 中使用 randomForest 包。据我了解,这个包只为我在每棵树的最终节点处为每个实例分配了类,但我需要知道每个节点处的类分布。

假设在一棵树的最后一个节点上,当整个森林都被训练时,我们有 10 个类 0 的实例和 20 个类 1 的实例。现在,我不想说为这个节点分配的类是 1(因为大多数实例来自类 1),我想知道类数(10 和 20)。有什么办法吗?提前感谢您的帮助。

【问题讨论】:

  • 从那以后有什么更新吗?

标签: r tree random-forest


【解决方案1】:

您可以使用函数predict.randomForest(.., type = "prob") 来获取预测概率。但是,它们是通过聚合单个决策树的预测(但不是预测的概率!)来计算的。如果您有 10 棵树预测 class=1 和 30 棵树预测 class=0,那么此函数调用将得出第一类的预测概率为 0.25。

如果您需要“真实”的树级概率,那么您必须切换到不同的 RF 算法。例如,Scikit-Learn 的课程RandomForestClassifier 就是这样工作的。

【讨论】:

    【解决方案2】:

    好问题!

    如果您没有完全种植树木,这只会成为 RF 分类的问题。为了防止完全生长的树,您必须将 minnodes>1 设置为 1 和/或 maxnodesgetTree(rf)

    我在编写 forestFloor 包以可视化功能贡献时遇到了同样的问题。我不得不使用递归 Rcpp 函数重新计算树的所有节点状态。我认为您必须这样做或修复软件包的源代码。你也可以请 randomForest 的维护者 Liaw 来实现它。或者让我实现计算节点状态的输出。其他随机森林实现中的一个小概率已经支持更详细的节点状态。

    randomForest 仅输出/存储终端注释的多数票

    library(randomForest)
    set.seed(123)
    obs=2000
    X = matrix(rnorm(obs))
    y = factor((X+rnorm(obs))>=0)
    
    plot(X,col=y)
    
    rf = randomForest(X,y,
                      keep.inbag=T,
                      nodesize = 15,
                      ntree=2)
    
    #but notice prob predictions only can be 100%, 50% or 0%
    print(head(predict(rf,X,type="prob"),15)) #(NB these predictions are not OOB-CV!)
    
       FALSE TRUE
    1    1.0  0.0
    2    0.0  1.0
    3    0.0  1.0
    4    0.0  1.0
    5    0.5  0.5
    6    0.0  1.0
    7    0.0  1.0
    8    1.0  0.0
    9    1.0  0.0
    10   1.0  0.0
    11   0.0  1.0
    12   0.0  1.0
    13   0.0  1.0
    14   0.0  1.0
    15   1.0  0.0
    

    【讨论】:

    • 您可以在base R中编写自己的预测函数,并发送观察结果并记录终端节点分布。您不需要在 C++ 或类似语言中实现,因为与训练相比,预测速度相当快。矢量化,也许 data.table 将有助于加快速度。
    猜你喜欢
    • 2017-09-03
    • 2020-12-13
    • 2016-06-26
    • 2016-10-08
    • 2013-12-31
    • 2020-08-16
    • 2019-11-09
    • 2018-10-26
    • 2017-03-14
    相关资源
    最近更新 更多