我使用ExtraTreesClassifier
来找出数据集中哪些属性更为重要。结果,它返回给我一个分数值(例如每个属性都有类似0.037
、0.025
、0.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()
回答:
这些分数本身是在BaseForest
类的feature_importances_中计算的。它们是通过以下方式计算的:
np.mean(all_importances, axis=0, dtype=np.float64) / np.sum(all_importances)
其中all_importances
是一个包含ExtraTreesClassifier
的估计器的feature_importances_
数组。估计器的数量由ExtraTreesClassifier
的参数n_estimators
定义。默认情况下有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_
由compute_feature_importances
方法计算,该方法属于Tree
类,用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_samples
和impurity
是包含节点参数的数组:
est[0].tree_.featureOut[60]: array([ 2, 2, -2, -2, -2], dtype=int64)est[0].tree_.weighted_n_node_samplesOut[61]: array([4., 2., 1., 1., 2.])est[0].tree_.impurityOut[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])