在 Scikit-learn 中对一组特征求和特征重要性

机器算法验证 机器学习 分类 随机森林 scikit-学习
2022-03-08 13:45:34

我已经使用一组特征(~100)构建了一个随机森林,我想比较两个特征子集的特征重要性。在 scikit-learn 中,与提供无界 MeanDecreaseGini 的 R 相比,所有特征的特征重要性总和为 1,请参阅相关线程R 中随机森林分类中一组预测变量的相对重要性我的问题是,是否可以简单地总结一组特征的特征重要性,还是应该类似于 R 解决方案并使用一些加权平均值?

我已经使用基尼杂质作为分割标准,而 RF 如何使用该度量来估计特征重要性对我来说还不清楚。

1个回答

TL,DR:是的,这对于对一组特征的重要性求和是完全正确的。

在 scikit-learn 中,节点在单个决策树中的重要性计算为(源代码): 其中是节点中的加权样本数,作为总加权样本数的一部分,是节点中的杂质,是其各自的子节点节点。j

nij=wjCjwleft(j)Cleft(j)wright(j)Cright(j)
wjjCjjleft(j)right(j)

然后特征的特征重要性计算为: In RandomForest 或 GradientBoosting,然后在所有树上平均特征重要性(源代码)。i

fii=j:node j splits on feature inijjall nodesnij

简而言之,一个特征的(未归一化的)特征重要性是相应节点的重要性之和。因此,如果您采用一组特征,则将这组特征的重要性表示为所有相应节点的重要性之和是完全一致的。后者正好等于单个特征重要性的总和。并且归一化分母对于所有特征都是相同的,因此不会改变相对重要性。

一个简单的例子:

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
rf = RandomForestClassifier(random_state=42).fit(iris.data, iris.target)
print(rf.feature_importances_)
sepal_features = [0, 1]
petal_features = [2, 3]
print(sum(rf.feature_importances_[sepal_features]))
print(sum(rf.feature_importances_[petal_features]))

它将给出以下输出:

[ 0.1292683   0.01582194  0.4447404   0.41016935]
0.145090242144
0.854909757856

由此,您可以判断花瓣特征对随机森林的预测贫困率有 85% 的贡献,而萼片特征仅占 15%。如果您的特征没有太大的相关性,那么这些数字是有意义的。