这个“分数”到底是多少?基于sklearn/Python的额外树分类器

2024-09-30 00:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用额外的树分类器来找出数据集中哪些属性更重要。结果,它返回一个分数值(例如每个属性都有一个分数,比如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()

Tags: 数据编辑model属性分类器分数fit公式
2条回答

在一行中:

分数越高,对应的特征越重要。在

来自Documentation

作为树中决策节点的特征的相对秩(即深度)可以用来评估该特征相对于目标变量的可预测性的相对重要性。树顶部使用的特征有助于更大比例输入样本的最终预测决策。因此,它们贡献的样本的期望分数可以用来估计特征的相对重要性。在

在scikit-learn中,特征贡献的样本分数与拆分样本所导致的杂质减少相结合,从而对该特征的预测能力进行归一化估计。在

您可以在中找到更多详细信息

G. Louppe, “Understanding Random Forests: From Theory to Practice”, PhD Thesis, U. of Liege, 2014.

从上述论题来看:

enter image description here

根据文档:

根据代码,加权杂质减少方程如下:

Feature of importance of feature X_i 
    = Sum of the following value for all nodes, in which X_i is the splitting features

       N_t / N *impurity - N_t_R / N_t * right_impurity
                        - N_t_L / N_t * left_impurity

其中N是样本总数,N_t是 samples at the current node,N_t_L是 left child,N_t_R是右子元素中的样本数。 NN_tN_t_R和{}都是加权和, 如果sample_weight被传递。在

对于一组树,对所有树的特征重要性进行平均,得到整个模型的特征重要性。在

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

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

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

^{pr2}$

所以,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上编写的^{}类的^{}方法计算的。它通过迭代树节点的每个节点来计算,并添加到相应的特性:

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_在计算后被规范化。您可以通过使用参数normalize=False调用compute_feature_importances来查看原始值:

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])

相关问题 更多 >

    热门问题