[英]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))
Output:
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))
Output:
setosa versicolor virginica setosa 50 0 0 versicolor 0 47 4 virginica 0 3 46
在第一个示例中,我设置了importance = FALSE
,在第二个示例中设置了TRUE
。 据我了解,这不应该影响结果预测。 文档中也没有任何迹象表明这种行为。
根据交叉验证线程,邻近度或重要性会影响随机森林的预测吗? ,重要性标志不应该影响预测,但在上面的示例中显然会影响。
那么为什么随机森林方法的重要性参数会影响randomForest
的性能呢?
这是展示再现性极限的一个很好的例子; 简而言之:
让我们看看为什么会这样……
所有的可重复性研究都基于一个强大的隐含假设:所有其他的都是平等的; 如果两个实验之间的变化使这个假设无效,我们不能期望您在这里寻求的确定性意义上的再现性(我们当然可能仍然期望统计意义上的再现性,但这不是这里的问题)。
您在此处介绍的两种情况(是否计算特征重要性)之间的区别非常微妙; 要了解为什么它实际上违反了上述原则,我们必须在文档和源代码中进行一些挖掘。
RF importance
function 的文档已经提供了强有力的提示(强调我的):
以下是变量重要性度量的定义。 第一个度量是根据排列OOB 数据计算的 [...] 然后在排列每个预测变量后进行相同的操作。
你可能已经开始怀疑了; 这种数据排列通常是在随机意义上执行的,因此当我们使用importance=TRUE
时,可能会为一个额外的进程调用随机数生成器(RNG),而在importance=FALSE
的情况下该进程不存在。
换句话说:如果在importance=TRUE
的情况下,RNG的参与方式与importance=FALSE
的情况不同,那么从程序中第一次发生这样的事情开始,这两种情况就不再具有确定性可比性,无论常见的随机种子。
在这一点上,这可能是一个强烈的暗示,但仍然只是一种猜测; 毕竟,原则上,排列可以确定性地执行,即不涉及任何随机过程(因此不涉及 RNG)。 吸烟枪在哪里?
事实证明确实存在确凿证据,埋藏在randomForest
R package 使用的底层 C 源代码中; 这是 C function 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--;
}
我们可以清楚地看到 function unif_rand()
(即 RNG)在代码片段的第 4 行( 这里在源代码中)被调用,在一个方法中调用,仅当我们要求importance=TRUE
时调用,而不是相反案子。
可以说,鉴于 RF 是一种算法,其中随机性(以及因此 RNG 使用)从太多点进入,这应该足以证明为什么您提出的两个案例确实不一样,因为不同的用途RNG的结果使实际结果出现分歧。 另一方面,150 个样本中一个错误分类的差异应该足以保证这两个案例在统计上仍然相似。 还应该清楚的是,这里的细微实现问题(即 RNG 参与)并没有违反两个结果在理论上应该相等的期望。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.