scikit学习:迭代DecisionTreeClassifier的节点

scikit学习:迭代DecisionTreeClassifier的节点,tree,scikit-learn,Tree,Scikit Learn,如何迭代clf的节点。我在文档中的任何地方都找不到它。您想如何处理clf的节点 有一个名为clf.tree.的变量,它包含实际的决策树信息。在面向用户的文档中,它的文档记录得很差,但是您可以尝试更好地了解它的功能 不幸的是,实际的节点数组似乎隐藏在Cython属性中,但您可以使用整数索引0…clf.tree\uNode\u count作为clf.tree\uFeature[i],clf.tree\uThreshold[i]等的索引(有关更多信息,请参阅链接代码中的文档)。如果您想知道样本落在哪个

如何迭代clf的节点。我在文档中的任何地方都找不到它。

您想如何处理
clf
的节点

有一个名为
clf.tree.
的变量,它包含实际的决策树信息。在面向用户的文档中,它的文档记录得很差,但是您可以尝试更好地了解它的功能


不幸的是,实际的节点数组似乎隐藏在Cython属性中,但您可以使用整数索引
0…clf.tree\uNode\u count
作为
clf.tree\uFeature[i]
clf.tree\uThreshold[i]
等的索引(有关更多信息,请参阅链接代码中的文档)。如果您想知道样本落在哪个节点上,可以使用
clf.tree\uu.apply(X)
来获取节点的实际整数索引。

现在,有一个示例说明了如何做到这一点

在那里,他们使用

n\u节点=clf.tree\u.node\u计数
children\u left=clf.tree\u.children\u left
children\u right=clf.tree\u.children\u right
feature=clf.tree\uu0.feature
阈值=clf.树\阈值
node_depth=np.zeros(shape=n_nodes,dtype=np.int64)
is_leaves=np.zeros(shape=n_节点,dtype=bool)
堆栈=[(0,0)]#从根节点id(0)及其深度(0)开始
当len(stack)>0时:
#'pop'确保每个节点只访问一次
node_id,depth=stack.pop()
节点深度[节点id]=深度
#如果一个节点的左、右子节点不相同,我们将进行拆分
#节点
拆分节点=子节点左[节点id]!=子节点右[节点id]
#如果是拆分节点,请将左、右子级和深度附加到“堆栈”`
#这样我们就可以循环通过它们
如果是分割节点:
stack.append((子项左[节点id],深度+1))
stack.append((子项右[节点id],深度+1))
其他:
is_leaves[node_id]=True
print(“二叉树结构有{n}个节点,有”
“以下树结构:\n”。格式(n=n_节点))
对于范围内的i(n_节点):
如果is_离开[i]:
打印(“{space}node={node}是叶节点。”。格式(
空间=节点(深度[i]*“\t”,节点=i))
其他:
打印(“{space}node={node}是拆分节点:”
如果X[:,{feature}]有一个库,则转到节点{left},这使得在决策树的节点(或边)上进行迭代更加容易

下面是您如何从代码示例中的拟合分类器迭代节点:

来自sklearn导入树的

导入pydotplus
dot_data=tree.export_graphviz(clf,
功能名称=iris.feature名称,
out\u file=None,
填充=真,
四舍五入=真)
graph=pydotplus.graph_from_dot_数据(dot_数据)
对于图中的节点。get_node_list():#迭代发生在这里!
打印(node.to_string())
 from sklearn.datasets import load_iris
 from sklearn.tree import DecisionTreeClassifier

 iris = load_iris()
 X    = iris.data
 y    = iris.target
  
 clf  = DecisionTreeClassifier()
 clf  = clf.fit(iris.data,iris.target)