【问题标题】:How to find out the size of a sklearn decision tree in python?如何在 python 中找出 sklearn 决策树的大小?
【发布时间】:2014-12-23 12:08:10
【问题描述】:

我正在对决策树进行一些特征归纳,并想知道树的节点数量。我如何在 python 中做到这一点?

使用 sklearn 网站上的股票示例,

x = [[0,0],[0,1]]
y = [0,1] 

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifer(n_estimators = 10)
clf = clf.fit(x,y)

我可以通过 clf[1]、clf[...] 之类的方法获取单个树,但是如何根据总节点数确定每棵树的大小?

【问题讨论】:

  • 您是否使用库来制作决策树?如果有,是哪一个?
  • 嗨 BreBarn,我正在使用 sklearn 的 RandomForestClassifier,然后单独访问这些树。
  • 致反对者:这个问题很切题且相关。

标签: python machine-learning scikit-learn nodes decision-tree


【解决方案1】:

根据之前的答案,scikit learn 中随机森林的正确代码是:

nodeNumber = sum(tree.tree_.node_count for tree in clf.estimators_)

【讨论】:

    【解决方案2】:

    最大深度是一个非常有用的指标,我在 API 中没有找到它,所以我写了这个:

    def dectree_max_depth(tree):
        n_nodes = tree.node_count
        children_left = tree.children_left
        children_right = tree.children_right
    
        def walk(node_id):
            if (children_left[node_id] != children_right[node_id]):
                left_max = 1 + walk(children_left[node_id])
                right_max = 1 + walk(children_right[node_id])
                return max(left_max, right_max)
            else: # leaf
                return 1
    
        root_node_id = 0
        return walk(root_node_id)
    

    您可以像这样在森林中的所有树木 (rf) 上使用它:

    [dectree_max_depth(t.tree_) for t in rf.estimators_]
    

    BSD 许可证。

    【讨论】:

      【解决方案3】:

      sklearn.tree._tree.Tree 对象具有“node_count”属性:

      from sklearn import tree
      X = [[0, 0], [1, 1]]
      Y = [0, 1]
      clf = tree.DecisionTreeClassifier()
      clf = clf.fit(X, Y)
      treeObj = clf.tree_
      print treeObj.node_count
      

      【讨论】:

        【解决方案4】:

        喜欢所有语言的所有树:

        每个节点返回 1 + 所有子树大小的总和。

        在python中,将此方法应用于根:

        def size(tree):
            return 1 + sum([size(subtree) for subtree in tree.subtrees])
        

        具体到sklearn,看这里的源码[https://github.com/scikit-learn/scikit-learn/tree/master/sklearn]

        我认为这可以尝试:

        nodeNumber = sum( len(tree.value) for tree in clf.estimators_ )
        

        【讨论】:

        • 此代码似乎不适用于我使用已编辑问题中的代码制作的树类型。抱歉,我之前说的不够具体。如何为随机森林分类器中的单个树调整此代码?
        猜你喜欢
        • 1970-01-01
        • 2018-09-06
        • 2020-03-30
        • 2019-06-27
        • 2020-07-26
        • 2020-01-09
        • 2019-03-04
        • 2018-05-24
        • 2013-11-05
        相关资源
        最近更新 更多