如果对max_depth,min_samples等没有约束,有没有办法检索sklearn.tree.DecisionTreeClassifier生成的最终节点数?
答案 0 :(得分:2)
部分原因是因为我没有自己的决策树,所以我不能在这里提供具体的例子。但是,我认为深入研究源代码可能有所帮助。
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx
sklearn的决策树有一个属性tree_,它是底层的Tree对象。 Tree对象在_tree.pyx类中定义。 Tree对象是:
"二进制决策树的基于数组的表示。 二叉树表示为多个并行数组。
i
- 每个数组的元素包含有关节点i
的信息。节点0是 树的根。
回想一下树中有一些内部节点,但决策树总是二进制的。因此,当您从节点0开始遍历时,您可以访问树属性children_left
和children_right
以确定哪些节点是每个节点的子节点。 threshold
属性也可能对您有用。
可能(强调可能)工作的一些伪代码是:
clf = DecisionTreeClassifier()
[... train and test...]
print(clf.tree_.node_count) #get the node count.
print(clf.tree_.children_left[node]) #where node is some integer
print(clf.tree_.children_right[node])
print(clf.tree_.threshold[node])
希望这有帮助。
答案 1 :(得分:2)
获得树后,您可以访问其内部树_ 对象以及该树的各种属性。源中描述的其中一个是node_count:
属性
- node_count:int
树中的节点数(内部节点+叶子)。
所以你可以这样做:
c = DecisionTreeClassifier(…)
c.fit(…)
n_nodes = c.tree_.node_count
节点的其他各种属性存储在树对象的数组中,并由节点ID索引。例如,值属性是节点分数的数组, n_node_samples 是每个节点的样本数量的数组。 ericmjl的答案通过对该表示的引用进一步详细说明。您可以使用它来获取特定节点的值:
c = DecisionTreeClassifier(…)
c.fit(…)
value_i = c.tree_.value[i]
答案 2 :(得分:-1)
“if”节点的数量
我认为计算“if”节点的数量而不是总节点数更有用。
from sklearn.tree import _tree
clf.fit(…)
ifs_count = len([x for x in clf.tree_.feature if x != _tree.TREE_UNDEFINED])