首页 文章

scikit learn - 在决策树中进行特征重要性计算

提问于
浏览
4

我试图了解如何计算sci-kit学习中的决策树的特征重要性 . 之前已经问过这个问题,但我无法重现算法提供的结果 .

例如:

from StringIO import StringIO

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree.export import export_graphviz
from sklearn.feature_selection import mutual_info_classif

X = [[1,0,0], [0,0,0], [0,0,1], [0,1,0]]

y = [1,0,1,1]

clf = DecisionTreeClassifier()
clf.fit(X, y)

feat_importance = clf.tree_.compute_feature_importances(normalize=False)
print("feat importance = " + str(feat_importance))

out = StringIO()
out = export_graphviz(clf, out_file='test/tree.dot')

导致特征重要性:

feat importance = [0.25       0.08333333 0.04166667]

并给出以下决策树:

decision tree

现在,这个answer对类似的问题表明其重要性计算如下

formula_a

其中G是节点杂质,在这种情况下是基尼杂质 . 据我所知,这是杂质减少 . 但是,对于功能1,这应该是:

formula_b

这表明重要性是通过到达节点的概率(通过到达该节点的样本的比例来近似)来加权的 . 同样,对于功能1,这应该是:

formula_c

两个公式都提供了错误的结果 . 如何正确计算特征重要性?

1 回答

  • 8

    我认为功能重要性取决于实现,所以我们需要查看scikit-learn的文档 .

    功能重要性 . 功能越高,功能越重要 . 特征的重要性计算为该特征带来的标准的(标准化的)总减少量 . 它也被称为基尼的重要性

    减少或加权信息增益定义为:

    加权杂质减少方程式如下:N_t / N *(杂质 - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity)其中N是样本总数,N_t是当前节点的样本数,N_t_L是左子项中的样本数,N_t_R是右子项中的样本数 .

    http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

    由于每种特征在您的情况下使用一次,因此特征信息必须等于上面的等式 .

    对于X [2]:

    feature_importance = (4 / 4) * (0.375 - (0.75 * 0.444)) = 0.042

    对于X [1]:

    feature_importance = (3 / 4) * (0.444 - (2/3 * 0.5)) = 0.083

    对于X [0]:

    feature_importance = (2 / 4) * (0.5) = 0.25

相关问题