这个“分数”实际上是什么?带有sklearn / Python的额外树分类器

时间:2019-07-18 12:35:18

标签: python machine-learning scikit-learn

我使用额外的树分类器来找出哪些属性在我的数据集中更重要。结果,它为我返回了一个得分值(例如,每个属性都有一个得分,例如0.0370.0250.012等。),这个得分到底是什么意思? >

model = ExtraTreesClassifier()
model.fit(dataValues, dataTargetEncoded)

feat_importances = pd.Series(model.feature_importances_,index=dataValues.columns)
feat_importances.nlargest(25).plot(kind='barh')
plt.show()

2 个答案:

答案 0 :(得分:1)

分数本身是在BaseForest类的feature_importances_中计算的。它们的计算方式为

np.mean(all_importances, axis=0, dtype=np.float64) / np.sum(all_importances)

其中all_importancesExtraTreesClassifier的估计量的feature_importances_的数组。估计数由的参数n_estimators定义 ExtraTreesClassifier。默认情况下,有10个估算器(n_estimators的默认值将从版本0.20中的10更改为版本0.22中的100):

est = [estimator for estimator in model.estimators_]

est[0]
Out[57]: 
ExtraTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
          max_features='auto', max_leaf_nodes=None,
          min_impurity_decrease=0.0, min_impurity_split=None,
          min_samples_leaf=1, min_samples_split=2,
          min_weight_fraction_leaf=0.0, random_state=1045388471,
          splitter='random')

len(est)
Out[58]: 10

所以all_importances看起来像

[x.feature_importances_ for x in est]
Out[59]: 
[array([0., 0., 1.]),
 array([0., 0., 1.]),
 array([0., 0., 1.]),
 array([0.33333333, 0.        , 0.66666667]),
 array([0.11111111, 0.88888889, 0.        ]),
 array([0., 1., 0.]),
 array([0., 0., 1.]),
 array([0., 1., 0.]),
 array([0., 0., 1.]),
 array([0.33333333, 0.66666667, 0.        ])]
每个估计量的

feature_importances_通过用Cython编写的compute_feature_importances类的Tree方法来计算。它是通过遍历树节点的每个节点并添加到相应功能来计算的:

feature_importances_[node.feature] += node.weighted_n_node_samples * node.impurity -
                                      left.weighted_n_node_samples * left.impurity -
                                      right.weighted_n_node_samples * right.impurity

其中weighted_n_node_samplesimpurity是带有节点参数的数组:

est[0].tree_.feature
Out[60]: array([ 2,  2, -2, -2, -2], dtype=int64)

est[0].tree_.weighted_n_node_samples
Out[61]: array([4., 2., 1., 1., 2.])

est[0].tree_.impurity
Out[62]: array([0.375, 0.5  , 0.   , 0.   , 0.   ])

feature_importances_在计算后被标准化。您可以通过使用参数compute_feature_importances调用normalize=False来查看原始值:

est[3].tree_.compute_feature_importances(normalize=False)
Out[63]: array([0.125, 0.   , 0.25 ])

est[3].tree_.compute_feature_importances()
Out[64]: array([0.33333333, 0.        , 0.66666667])

答案 1 :(得分:0)

一行:

分数越高,相应的功能就越重要。

来自Documentation

用作树中决策节点的特征的相对等级(即深度)可用于评估该特征相对于目标变量的可预测性的相对重要性。 树顶部使用的功能有助于大部分输入样本的最终预测决策。他们所贡献的样本的预期比例因此可以用作特征相对重要性的估计。

在scikit学习中,特征贡献的样本比例从拆分中减少的杂质减少量相结合,以创建特征预测能力的归一化估计该功能。

您可以在

中找到更多详细信息
  

G。卢珀,“理解随机森林:从理论到实践”,   列日大学博士学位论文,2014年。