随机森林sklearn变量重要性

时间:2017-04-04 06:44:21

标签: scikit-learn random-forest feature-selection

feature_importance_的{​​{1}}的属性sklearn给出的变量重要性值是否可以解释为百分比?据我所知,当在分裂点使用特定特征时,它是所有树上杂质指数降低的平均值。RandomForestClassifier值的范围是多少?对于具有1000个特征的数据集,如果feature_importance_值的范围为0~0.05,大多数特征为0,只有少数显示略有增加,这是否表明数据有噪声?

2 个答案:

答案 0 :(得分:3)

  

据我所知,它是在分裂点使用特定特征时所有树木的杂质指数减少的平均值。

这是对的。让我们看看如何详细计算单个树的特征重要性[1]。杂质减少是分裂前节点的杂质减去两个子节点的总和。分裂后的杂质。对于每个要素,这是对树中所有拆分的平均值。然后,将重要性标准化:每个特征重要性除以重要性总和。

因此,在某种意义上,单个树的特征重要性是百分比。它们总和为1并描述了单个特征对树木总杂质减少的贡献程度。

随机森林的要素重要性计算为所有树的重要性平均值。它们仍然可以被视为单个特征的分数减少。你可以(并且应该)验证他们是否一对一。

  

feature_importance_值的范围是多少?

理论上,由于重要性的归一化方式,范围是0到1。然而,在实践中,范围将相当低。随机森林随机选择数据的特征和子集,因此很有可能在分割中使用所有特征。即使它们不是很重要,它们也只占总重要性的一小部分。由于重要性应该是一对一的,因此随着您拥有的功能越多,重要性就越低。

  

feature_importance_值的范围为0~0.05,大多数特征为0,只有少数显示略有增加,这是否表明数据有噪声?

不,这很可能意味着你有很少的样本和/或很少的树(估算器)。 0的重要性很可能意味着森林中根本没有使用该特征。由于该分类器的随机性,所有特征应至少使用一点。所以这表明没有多少分裂被执行。

我认为你没有很多树,因为n_estimators=10的默认值非常低。大多数文献建议使用100或1000棵树。你不能拥有太多,只会降低成本。

最后,发出警告

不要过分依赖功能重要性。如果一个功能的重要性高于另一个功能,那么可能意味着它更重要,但您无法确定:

例如,假设您复制了一个功能并将其作为新功能添加到数据中。原始功能和新功能应该同样重要。但是,每当执行分割时,只能选择其中一个,因此原始特征将在一半的时间内随机选择。这也使原始特征的重要性减半!如果另一个不存在,新功能和原始功能的重要性只有它们的一半。

如果数据中的某些特征是相关的(实际上是统计相关的),那么它们的重要性将低于同等重要的不相关特征。

答案 1 :(得分:0)

  

这表明数据有噪音吗?

您的问题非常笼统,如果不查看数据,就无法回答这个问题。

但是,您可以通过标准化其值来轻松查看feature_importance_值百分比:

importance_sum = sum(rf.feature_importance_)
feature_importance_as_percent =  [100*(x/sum) for x in rf.feature_importance_]