随机森林中预测变量的mtry和不平衡使用

机器算法验证 r 采样 随机森林 重要性
2022-03-16 13:57:27

我正在研究随机森林预测,重点是预测变量的重要性,并且有一个关于理解 mtry 和 R 中随机森林树中变量的实际使用的问题(包 randomForest)。

我有一个包含超过 1000 个观察值的样本和一个分类为 2 类的响应向量:0 和 1。我有 4 个自变量。对于实验,我选择了以下参数:

rftry1=randomForest(x,y,xtest,ytest,mtry=4,ntree=500, importance=TRUE,keep.forest=TRUE,do.trace=TRUE,replace=TRUE,keep.inbag=TRUE,proximity=TRUE)

然后我检查了森林中实际使用了哪些变量,并发现了一个非常倾斜的用法:

> varUsed(rftry1)

[1] 2436 1758 1988 1156

从第一个变量到第四个变量,使用量实际上急剧下降。它真的会影响预测吗?为什么会这样?

然后我用 mtry=2 重新运行实验,使用量总体上有所减少,但仍与第一个的使用量成正比。

MeanDecreaseAccuracy MeanDecreaseGini

1 0.006535855 2.177148 2 0.224706591 127.106268 3 0.006633846 5.020456 4 0.017522580 36.867821

我注意到,变量在树中的使用频率不会影响重要性到改变变量重要性顺序的程度。所以我的主要两个问题是:

1)我想我不明白 mtry 究竟控制了什么(我已经阅读了每次拆分时采样的变量数量)。我注意到,在 mtry 2 和 4 中,一些变量已在树中重用,而在 m=1 时,它们没有被重用,而且树要短得多。当我说:

mtry=2 意味着在每次拆分时,我们不会坚定地选择下一个要拆分的变量,而是从 2 个变量中随机选择?如果我总共有 4 个变量,并且变量 1 用于第一次拆分 - 我对左女儿和右女儿的选择是什么?

2) mtry 是否与拆分变量的不平衡使用有关?为什么要这样使用变量,是否会影响预测结果而产生偏差?

我所有的变量都是因子的形式,其中 3 个有 2 个级别,1 个有 3 个级别。

谢谢您的回答!

1个回答

使用的整体随机森林算法的一部分mtry是(改编自The Elements of Statistical Learning):

在大于最小尺寸的每个终端节点处,

1 )p回归变量,

2) 从这些mtry变量中,选择最佳变量和分割点,

3) 使用选择的变量和分割点将节点分割成两个子节点。

顺便说一句 - 您可以使用包中的tuneRF函数为您randomForest选择“最佳” mtry,使用袋外误差估计作为标准。

在每个节点拆分步骤中随机选择变量使其成为随机森林,而不仅仅是袋装估计器。引自 The Elements of Statistical Learning, p 588 in the second edition:

随机森林中的想法......是通过降低树之间的相关性来改善 bagging 的方差减少,而不会过多地增加方差。这是通过随机选择输入变量在树生长过程中实现的。

因此,偏差不会增加。当然,如果模型本身存在根本偏差,例如,通过忽略重要的预测变量,使用随机森林不会使情况变得更好,但也不会使情况变得更糟。

预测变量的不平衡使用只是反映了这样一个事实,即有些变量不如其他变量重要,重要的是在启发式而不是正式意义上使用,因此,对于某些树,可能不经常使用或根本不使用。例如,考虑一下如果您有一个变量在完整数据集上几乎不显着,但随后您从完整数据集生成了大量引导数据集并在每个引导数据集上再次运行回归,会发生什么情况。你可以想象这个变量在很多引导数据集上是微不足道的。现在比较一个在整个数据集上非常重要的变量;它可能对几乎所有的引导数据集也很重要。因此,如果您计算“选择”每个变量的回归比例 通过显着,您将获得跨变量的不平衡计数。这有点(但只是有点)类似于随机森林内部发生的情况,只是变量选择基于“每次拆分时的最佳值”而不是“p 值 < 0.05”等。

针对 OP 提出的问题进行编辑:但是,请注意,变量重要性度量不仅仅基于变量在拆分中使用的次数的计数。因此,您可以拥有“重要”变量(通过“重要性”衡量)在拆分中使用的频率低于不太“重要”的变量(通过“重要性”衡量)。例如,考虑模型:

yi=I(xi>c)+0.25zi2+ei

由以下 R 代码实现和估计:

x <- runif(500)
z <- rnorm(500)
y <- (x>0.5) + z*z/4 + rnorm(500)
df <- data.frame(list(y=y,x=x,z=z,junk1=rnorm(500),junk2=runif(500),junk3=rnorm(500)))
foo <- randomForest(y~x+z+junk1+junk2+junk3,mtry=2,data=df)
importance(foo)
      IncNodePurity
x         187.38456
z         144.92088
junk1     102.41875
junk2      93.61086
junk3      92.59587

varUsed(foo)
[1] 16916 17445 16883 16434 16453

这里x具有更高的重要性,但z在拆分中更频繁地使用;x的重要性很高,但在某种意义上非常局部,而z在整个范围内更为重要z价值观。

有关随机森林的更全面讨论,请参阅第 1 章。15 个元素...,上面的链接允许您免费下载为 pdf 格式。