为什么重要性参数会影响 R 中随机森林的性能?

Why does the importance parameter influence performance of Random Forest in R?

R中使用随机森林时,我遇到了以下情况:

library(randomForest)
set.seed(42)
data(iris)
rf_noImportance <- randomForest(Species~.,data=iris,ntree=100,importance=F)
print(table(predict(rf_noImportance),iris$Species))

输出:

            setosa versicolor virginica
 setosa         50          0         0
 versicolor      0         47         3
 virginica       0          3        47

library(randomForest)
set.seed(42)
data(iris)  
rf_importance <- randomForest(Species~.,data=iris,ntree=100,importance=T)
print(table(predict(rf_importance),iris$Species))

输出:

            setosa versicolor virginica
 setosa         50          0         0
 versicolor      0         47         4
 virginica       0          3        46

在第一个例子中我设置了importance = FALSE,在第二个例子中我设置了TRUE。据我了解,这不应影响最终的预测。在 documentation.

中也没有迹象表明该行为

根据交叉验证线程 Do proximity or importance influence predictions by a random forest?,重要性标志不应影响预测,但在上面的示例中显然会影响。

那么为什么 randomForest 方法的重要性参数会影响模型的性能?

这是展示再现性限制的一个很好的例子;简而言之:

如果实验以不同方式调用随机数生成器,固定随机种子不会使结果具有可比性。

让我们看看为什么会这样...

所有可重复性研究均基于隐含假设:所有其他条件相同;如果两个实验之间的变化使这个假设无效,我们不能期望您在这里寻求的 确定性 意义上的再现性(我们当然可能仍然期望 统计性 有道理,但这不是这里的问题)。

您在此处介绍的两种情况(是否计算特征重要性)之间的区别非常微妙;要了解为什么它实际上违反了上述原则,我们必须在文档和源代码中进行一些挖掘。

RFimportance函数的documentation已经提供了很强的提示(强调我的):

Here are the definitions of the variable importance measures. The first measure is computed from permuting OOB data [...] Then the same is done after permuting each predictor variable.

你可能已经开始怀疑了;这样的 数据排列 通常是在随机意义上执行的,因此当我们使用 importance=TRUE 时,可能会为一个额外的过程调用随机数生成器 (RNG),该过程在importance=FALSE 案例。

换句话说:如果在 importance=TRUE 案例中,RNG 以 importance=FALSE 案例中不存在的方式参与,那么从程序中第一次发生这样的事情开始两种情况不再确定性地可比,无论公共随机种子如何。

在这一点上,这可能是一个强烈的暗示,但仍然只是一种推测;毕竟,原则上,排列可以确定性地执行,即不涉及任何随机过程(因此不涉及 RNG)。确凿的证据在哪里?

事实证明确凿证据确实存在,隐藏在 randomForest R 包使用的底层 C 源代码中;这是 C 函数的相关部分 permuteOOB:

/* Permute tp */
    last = nOOB;
    for (i = 0; i < nOOB; ++i) {
        k = (int) last * unif_rand();
        tmp = tp[last - 1];
        tp[last - 1] = tp[k];
        tp[k] = tmp;
        last--;
    }

我们可以清楚地看到函数 unif_rand()(即 RNG)在片段的第 4 行(源代码中的 here)被调用,在一个仅当我们调用的方法中要求 importance=TRUE,反之则不行。

可以说,考虑到 RF 是一种算法,其中随机性(因此使用 RNG)从太多点进入,这应该足以证明为什么您提出的两种情况确实不是 完全相同,因为RNG的使用方式不同,导致实际结果出现差异。另一方面,150 个样本中一个单一错误分类的差异应该足以保证这两个案例在统计上仍然 相似。同样显而易见的是,这里的微妙实施问题(即 RNG 参与)并不违反 expectation 两个结果 应该 在理论上是相等的。