这个“分数”到底是什么?使用sklearn/Python的Extra Trees分类器

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

回答:

这些分数本身是在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_samplesimpurity是包含节点参数的数组:

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注