clf.tree_.feature 的输出是啥?

Posted

技术标签:

【中文标题】clf.tree_.feature 的输出是啥?【英文标题】:What is the output of clf.tree_.feature?clf.tree_.feature 的输出是什么? 【发布时间】:2017-02-04 02:52:38 【问题描述】:

我观察到 scikit-learn clf.tree_.feature 偶尔会返回负值。例如-2。据我了解 clf.tree_.feature 应该返回功能的顺序。如果我们有特征名称数组 ['feature_one', 'feature_two', 'feature_three'],然后 -2 将引用 feature_two。我对负指数的使用感到惊讶。通过索引 1 引用 feature_two 会更有意义。(-2 是便于人类消化的引用,而不是机器处理的引用)。我读对了吗?

更新:这是一个例子:

def leaf_ordering():
    X = np.genfromtxt('X.csv', delimiter=',')
    Y = np.genfromtxt('Y.csv',delimiter=',')
    dt = DecisionTreeClassifier(min_samples_leaf=10, random_state=99)
    dt.fit(X, Y)
    print(dt.tree_.feature)

这里是文件X 和Y

这是输出:

    [ 8  9 -2 -2  9  4 -2  9  8 -2 -2  0  0  9  9  8 -2 -2  9 -2 -2  6 -2 -2 -2
  2 -2  9  8  6  9 -2 -2 -2  8  9 -2  9  6 -2 -2 -2  6 -2 -2  9 -2  6 -2 -2
  2 -2 -2]

【问题讨论】:

【参考方案1】:

通过阅读树生成器的 Cython 源代码,我们看到 -2 只是叶节点特征拆分属性的虚拟值。

Line 63

TREE_UNDEFINED = -2

Line 359

if is_leaf:
    # Node is not expandable; set node as leaf
    node.left_child = _TREE_LEAF
    node.right_child = _TREE_LEAF
    node.feature = _TREE_UNDEFINED
    node.threshold = _TREE_UNDEFINED

【讨论】:

【参考方案2】:

在您编写时,clr.tree_.feature 按深度优先搜索算法按顺序返回节点/叶子。首先,它从根节点开始,然后跟随左子节点,直到它到达一个叶子(用 -2 编码),当它到达一个叶子时,它从一个叶子爬到另一个叶子,直到它到达一个节点。一旦到达一个节点,它就会在层次结构中再次下降,直到到达叶节点。

看看你的例子,根节点是特征 8,它有一个左子节点,特征 9。然后如果我们下降层次结构,我们会立即到达叶节点。所以我们开始往上走,直到我们到达一个非叶子节点。下一个节点(右孩子)也是一个叶子节点(特征 9 的两个孩子都是叶子节点),然后爬上树,我们再次在层次结构的第一级到达特征 9。这里特征 9 有一个左孩子,特征 4 有一个叶子节点作为其左孩子,然后我们再看特征 4 的右孩子,也就是特征 9,以此类推。

【讨论】:

以上是关于clf.tree_.feature 的输出是啥?的主要内容,如果未能解决你的问题,请参考以下文章

创建第一个简单的AI分类器

基于sklearn 实现决策树(含最简代码,复杂源码:预测带不带眼镜)

pipeline结合GridSearchCV的一点小介绍

Python 的 sklearn coef_ 输出中的目标是啥?

sklearn plot_tree 图太小

AttributeError 是啥意思:'ColumnSelector' 对象没有属性'n_features_in_'?