如何确定RandomForestClassifier中的feature_importance?
我有一个时间序列作为数据input的分类任务,其中每个属性(n = 23)代表一个特定的时间点。 除了绝对的分类结果之外,我还想知道哪些属性/date对结果有什么影响。 因此,我只是使用feature_importances_
,这对我很好。
但是,我想知道他们如何计算和使用哪种度量/algorithm。 不幸的是我找不到关于这个主题的任何文档。
确实有几种方法来获得function“重要性”。 对于这个词的含义,往往没有严格的一致意见。
在scikit学习,我们执行[1]中所述的重要性(经常被引用,但不幸的是很less阅读…)。 它有时被称为“基尼重要性”或“平均降低不纯度”,被定义为节点杂质的总减less量(通过到达该节点的概率(通过到达该节点的样本的比例近似)合奏的树木。
在文献或其他一些软件包中,还可以查找以“平均降低精度”实现的要素重要性。 基本上,这个想法是当您随机置换该function的值时,测量OOB数据的精度下降。 如果降低,那么该特征不重要,反之亦然。
(请注意,这两种algorithm都可以在randomForest R包中find。)
[1]:布莱曼,弗里德曼,“分类和回归树”,1984年。
计算单个树的特征重要性值的常用方法如下所示:
-
您将初始化一个大小为
n_features
的所有零的数组feature_importances
。 -
遍历树:对于在特征
i
上分割的每个内部节点,计算该节点的误差减less量乘以路由到该节点的样本数,并将此数量添加到feature_importances[i]
。
错误减less取决于您使用的杂质标准(例如基尼,熵,MSE等)。 它是被路由到内部节点的一组例子的杂质减去由分裂产生的两个分区的杂质的总和。
重要的是这些值是相对于一个特定的数据集(误差减less和样本数量是数据集特定的),因此这些值不能在不同的数据集之间进行比较。
据我所知,还有其他的方法来计算决策树中的特征重要性值。 上述方法的简要描述可以在Trevor Hastie,Robert Tibshirani和Jerome Friedman的“统计学习要素”中find。
这是在集合的任何一棵树上涉及该特征的决策节点的样本数量与训练集合中样本总数的比值。
在决策树顶层节点中涉及的特征倾向于看到更多的样本,因此可能更重要。
编辑 :这个描述只是部分正确的:吉尔斯和彼得的答案是正确的答案。
正如@GillesLouppe所指出的那样,scikit-learn目前实现了“重要性降低杂质”指标。 我个人发现第二个度量更有趣一点,你随机地为每个要素的值逐个排列,看看你的包外performance是多糟糕的。
由于你所追求的特征重要性是每个特征对整体模型的预测性能有多大贡献,第二个指标实际上给了你一个直接的衡量标准,而“平均减less杂质”只是一个很好的指标。
如果你有兴趣,我写了一个小包,实现了排列重要性度量,可以用来从一个scikit学习随机森林类的实例计算值:
https://github.com/pjh2011/rf_perm_feat_import
编辑:这适用于Python 2.7,而不是3