有没有办法检索sklearn.tree.DecisionTreeClassifier生成的最终节点数?

时间:2015-01-26 22:45:38

标签: python scikit-learn

如果对max_depth,min_samples等没有约束,有没有办法检索sklearn.tree.DecisionTreeClassifier生成的最终节点数?

3 个答案:

答案 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_leftchildren_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])