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 的输出是啥?的主要内容,如果未能解决你的问题,请参考以下文章
基于sklearn 实现决策树(含最简代码,复杂源码:预测带不带眼镜)
Python 的 sklearn coef_ 输出中的目标是啥?
AttributeError 是啥意思:'ColumnSelector' 对象没有属性'n_features_in_'?