clf.tree_.feature 的输出是什么?

What is the output of clf.tree_.feature?

我观察到 scikit-learn clf.tree_.feature 偶尔会出现 return 负值。例如-2。据我了解 clf.tree_.feature 应该是 return 特征的顺序。如果我们有特征名称数组 ['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 and 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]

通过阅读树生成器的 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

如您所写,clr.tree_.feature returns nodes/leaves 作为 Depth-First 搜索算法的顺序。首先,它从根节点开始,然后跟随左 children 直到它到达一个叶子(用-2编码),当它到达一个叶子时它从一个叶子爬到另一个叶子直到它到达一个树节点。一旦它到达一个节点,它就会在层次结构中再次下降,直到它到达一个叶节点。

看看你的例子,根节点是特征 8,它有一个左边 child,特征 9。然后如果我们降低层次结构,我们会立即到达叶节点。所以我们开始上升,直到到达 non-leaf 节点。下一个节点(右边child)也是叶子节点(特征9的两个children都是叶子节点),然后向上爬树我们在第一层再次到达特征9等级制度。这里特征 9 有一个左边 child,特征 4 的左边有一个叶节点 child,然后我们再看特征 4 的右边 child 也就是特征 9,依此类推。