随机森林 sklearn 变量重要性
Posted
技术标签:
【中文标题】随机森林 sklearn 变量重要性【英文标题】:Random Forest sklearn Variable Importance 【发布时间】:2017-08-29 05:34:12 【问题描述】:sklearn
的RandomForestClassifier
的属性feature_importance_
给出的变量重要性值可以解释为百分比吗?我知道当在分割点使用特定特征时,它是所有树的杂质指数减少的平均值。feature_importance_
值的范围是多少?对于一个有 1000 个特征的数据集,如果feature_importance_
的取值范围为 0~0.05,大部分特征为 0,只有少数显示略有增加,这是否表明数据有噪声?
【问题讨论】:
【参考方案1】:我知道它是在分割点使用特定特征时所有树的杂质指数减少的平均值。
这是正确的。让我们看看如何详细计算单个树的特征重要性[1]。杂质减少是分裂前一个节点的杂质减去分裂后两个子节点的杂质之和。这是对每个特征的树中所有拆分的平均值。然后,对重要性进行归一化:每个特征重要性除以重要性的总和。
因此,从某种意义上说,单个树的特征重要性是百分比。它们总和为 1,并描述了单个特征对树的总杂质减少的贡献程度。
随机森林的特征重要性计算为所有树的重要性的平均值。它们仍然可以看作是单个特征的部分缩减。您可以(并且应该)验证它们是否一对一。
feature_importance_ 值的范围是多少?
理论上,由于重要性归一化的方式,范围是 0 到 1。然而,在实践中,该范围将大大降低。随机森林随机选择数据的特征和子集,因此很有可能在拆分中使用所有特征。即使它们不是很重要,它们也会占总重要性的一小部分。由于重要性应该是一对一的,因此您拥有的功能越多,重要性总体上就会越低。
feature_importance_取值范围为0~0.05,大部分特征为0,只有少数略有增加,是否说明数据有噪声?
不,这很可能意味着您的样本和/或树(估计器)很少。重要性为 0 很可能意味着该功能在森林中根本没有使用。由于这个分类器的随机性,所有特征都应该至少使用一点。所以这表明没有执行很多拆分。
我假设您没有很多树,因为 n_estimators=10
的默认值非常低。大多数文献建议使用 100 或 1000 棵树。不能太多,只会性价比。
最后一句警告
不要过分依赖特征重要性。如果一个特征的重要性高于另一个特征,可能意味着它更重要,但您不能确定:
例如,假设您复制了一个特征并将其作为新特征添加到数据中。原始特征和新特征应该同等重要。但是,每当执行拆分时,只能选择其中一个,因此一半时间将随机选择原始特征。这也使原始功能的重要性减半!如果另一个不在,新功能和原始功能的重要性都只有一半。
如果数据中的某些特征是相关的(实际上是统计相关的),它们的重要性将低于同等重要的不相关特征。
【讨论】:
非常感谢您的详细解答。我在每次拆分时使用 700n_estimators
和 sqrt(p) 数量的特征。但我认为对于我用来定义数据的特征数量(即 1024)而言,我拥有的样本数量太少(2789)。我不确定。我会对此进行研究。再次感谢您抽出宝贵时间。
@chilvandu 我大致预计700*log2(1024) = 7000
在森林中分裂。如果它是纯随机的,每个特征应该被使用约 7 次,但分类器不是纯随机的——它从多个候选者中选择最好的特征。我想如果有更好的功能可供选择,很容易发生某些功能永远不会被选择的情况。 2789 听起来功能数量很少,但我太确定了。随机森林应该能够处理“无限”维特征空间。我想这取决于数据中有多少结构/噪声。一定要对此进行详细调查。【参考方案2】:
这是否表明数据有噪声?
你的问题很笼统,不看数据真的不可能回答。
但是,将feature_importance_
values 视为百分比的一种简单方法是将它们的值标准化:
importance_sum = sum(rf.feature_importance_)
feature_importance_as_percent = [100*(x/sum) for x in rf.feature_importance_]
【讨论】:
以上是关于随机森林 sklearn 变量重要性的主要内容,如果未能解决你的问题,请参考以下文章
sklearn 随机森林索引如何特征_importances_
sklearn库学习----随机森林(RandomForestClassifier,RandomForestRegressor)