【问题标题】:Why is Mean Decrease Gini in Random Forest dependent on population size?为什么随机森林中的平均减少基尼系数取决于人口规模?
【发布时间】:2019-07-28 21:42:09
【问题描述】:

我正在使用 R 包 randomForest 并且要了解变量的重要性,我们可以研究 varImpPlot,它显示了平均减少基尼。我已经详细研究了随机森林,并且非常了解该模型的详细工作原理,关于如何计算平均下降基尼系数,或者更确切地说为什么它取决于人口规模,我无法完全理解。

当我们计算出基尼指数时,我们可以通过以下公式(除以树的数量)来汇总平均下降基尼:

我知道当种群数量较多时,每棵树的分裂次数会更多,但这些分裂的基尼指数平均下降不应该很小吗?

这是显示我的意思的示例代码(正如预期的那样,树的数量不会影响平均基尼系数的下降,但人口有很大的影响,并且似乎或多或少与人口规模呈线性关系):

install.packages("randomForest")
library(randomForest)

set.seed(1)
a <- as.factor(c(rep(1, 20), rep(0, 30)))
b <- c(rnorm(20, 5, 2), rnorm(30, 4, 1))
c <- c(rnorm(25, 0, 1), rnorm(25, 1, 2))
data <- data.frame(a = a, b = b, c = c)

rf <- randomForest(data = data, a ~ b + c, importance = T, ntree = 300)
varImpPlot(rf)


a2 <- as.factor(c(rep(1, 200), rep(0, 300)))
b2 <- c(rnorm(200, 5, 2), rnorm(300, 4, 1))
c2 <- c(rnorm(250, 0, 1), rnorm(250, 1, 2))
data2 <- data.frame(a2 = a2, b2 = b2, c2 = c2)

rf2 <- randomForest(data = data2, a2 ~ b2 + c2, importance = T, ntree = 
300)
varImpPlot(rf2)


a3 <- as.factor(c(rep(1, 2000), rep(0, 3000)))
b3 <- c(rnorm(2000, 5, 2), rnorm(3000, 4, 1))
c3 <- c(rnorm(2500, 0, 1), rnorm(2500, 1, 2))
data3 <- data.frame(a3 = a3, b3 = b3, c3 = c3)

rf3 <- randomForest(data = data3, a3 ~ b3 + c3, importance = T, ntree = 
300)
varImpPlot(rf3)

在这些图中,我们看到 x 轴随着人口的每次增加而增加大约 10 倍:

我的猜测是,在每个拆分中都有一个基于人数的权重,也就是说,在第一个节点中进行的拆分,拆分 1000 人,其权重比在树下进行的拆分更重,比如 10人,我在任何文献中都找不到这一点,因为似乎所有计算都是通过考虑人口的一小部分而不是绝对数字来进行的。

我错过了什么?

【问题讨论】:

    标签: r random-forest gini


    【解决方案1】:

    你的猜测是正确的。

    您已经写下了单个拆分的基尼杂质的定义。随机森林中的树通常会分裂多次。更高的节点有更多的样本,并且直观地更“不纯”。因此,基尼平均下降的公式考虑了节点大小。

    所以不是

    Delta i(tau) = i(tau) - (n_l/n) i(tau_l) - (n_r/n) i(tau_r)
    

    杂质的减少计算为

    Delta i(tau) = n i(tau) - n_l i(tau_l) - n_r i(tau_r)
    

    也就是说,按原始计数衡量杂质,而不是按比例。

    算法不断将树拆分为最大可能大小(除非您指定 nodesizemaxnodes 参数)。因此可以多次选择一个特征作为分割标准。它的总体重要性是这些拆分处Deltas 的总和。这是一棵树的重要性计算。最后,对森林中所有树木的重要性进行平均。

    让我们用一个非常人为的例子来展示这一点。

    library("randomForest")
    #> randomForest 4.6-14
    #> Type rfNews() to see new features/changes/bug fixes.
    set.seed(1)
    
    n <- 1000
    # There are three classes in equal proportions
    a <- rep(c(-10,0,10), each = n)
    # One feature is useless
    b <- rnorm(3*n)
    # The other feature is highly predictive but we need at least two splits
    c <- rnorm(3*n, a)
    data <- data.frame(a = as.factor(a), b = b, c = c)
    
    # First let's do just one split, i.e., ask for just two terminal nodes
    
    # Expected MeanDecreaseGini:
    # With one split the best we can do is separate one class from the other two
    3000*(2/3) - 1000*0 - 2000*(1/2)
    #> [1] 1000
    
    # Actual MeanDecreaseGini
    rf3 <- randomForest(data = data, a ~ b + c, importance = TRUE,
                        ntree = 1000, mtry = 2, maxnodes = 2)
    rf3$importance[, "MeanDecreaseGini"]
    #>        b        c 
    #>    0.000 1008.754
    
    
    # Next let's do two splits; this is enough to separate classes perfectly
    
    # Expected MeanDecreaseGini:
    3000*(2/3) - 1000*0 - 2000*(1/2)  +   2000*(1/2) - 1000*0 - 1000*0
    #> [1] 2000
    
    # Actual MeanDecreaseGini
    rf3 <- randomForest(data = data, a ~ b + c, importance = TRUE,
                        ntree = 1000, mtry = 2, maxnodes = 3)
    rf3$importance[, "MeanDecreaseGini"]
    #>        b        c 
    #>    0.000 1999.333
    

    reprex package (v0.2.1) 于 2019 年 3 月 8 日创建

    PS:很高兴知道如何使用 Gini 标准计算重要性。但是请阅读这篇文章以了解为什么应该使用排列重要性来代替:https://explained.ai/rf-importance/index.html

    【讨论】:

    • 非常感谢您证实了我的理论!我绝对会看看排列的重要性。目前,我没有使用变量重要性来删除任何变量(因为可用的变量非常少,而且数据点数量相当多),我更想对近似重要性进行总体概述。您是否碰巧有文章/书籍确认您提供的计算?我一直在努力寻找支持我的理论的来源(因为我将需要可靠的来源来支持我的主张)。再次感谢,不胜感激!
    • 我试图用谷歌搜索一些明确给出公式但没有遇到任何具体内容的文档。所以我做了一个小模拟,很容易用手计算基尼杂质的减少。它按预期工作,至少在这个例子中是这样。
    • 好的,再次感谢您。因为我正在写一份报告,所以我必须找到支持我提供的方程式的东西,所以我必须继续寻找它。看起来很奇怪,我找不到任何关于这个相对简单的区域的文档。
    猜你喜欢
    • 2022-06-14
    • 2018-06-05
    • 2017-03-15
    • 2019-10-13
    • 2018-04-04
    • 2015-07-22
    • 2018-11-09
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多