【问题标题】:Recursive programming in decision tree决策树中的递归编程
【发布时间】:2017-03-18 23:07:05
【问题描述】:

我正在用 python 编写决策树。 tree 是一个具有真分支tb 和假分支fb 的对象。只有根节点具有属性results

results 是一个字典,包含节点上每个目标变量(即因变量)的计数。我正在研究一个二元分类问题,所以一个例子是字典{0: 25, 1: 9}

我想创建一个函数findrootnodes(tree),它遍历树,一直到根节点。它应该返回列表根节点。列表的每个元素都应该包含一个字典。所以一个有四个根节点的决策树的例子是[{0: 25, 1: 9}, {0: 2, 1: 65}, {0: 2, 1: 7}, {0: 52, 1: 4}]

我该怎么做?我当前的代码如下,但问题是它总是返回一个空列表。如果我将 rootnodes 带出函数,Python 会抱怨在实例化之前引用了局部变量 rootnodes。

def findrootnodes(tree):   
    rootnodes = []
    if tree.results != None:
        rootnodes += tree.results
    else: 
        findrootnodes(tree.tb)
        findrootnodes(tree.fb)
    return rootnodes

【问题讨论】:

    标签: python recursion decision-tree


    【解决方案1】:

    在您的findrootnodes 函数中,您永远不会更改非结果节点的rootnodes 的值。也就是当你调用findrootnodes时,你先设置:

    rootnodes = []
    

    假设初始节点没有results,然后运行:

        findrootnodes(tree.tb)
        findrootnodes(tree.fb)
    

    ...两者都不会改变rootnodes 的值。然后你返回rootnodes,它仍然是一个空列表。

    我认为你真正想要的是:

    def findrootnodes(tree):   
        rootnodes = []
        if tree.results != None:
            rootnodes.append(tree.results)
        else: 
            rootnodes.extend(findrootnodes(tree.tb))
            rootnodes.extend(findrootnodes(tree.fb))
        return rootnodes
    

    请注意,我已将您的 += 更改为 .append(...),因为:

    >>> x = []
    >>> x += {'key': 'value'}
    >>> x
    ['key']
    

    尝试通过+= 将字典添加到列表中会将字典视为可迭代对象,Python 将仅对键进行迭代

    【讨论】:

    • 谢谢,特别是关于通过+=将字典添加到列表中的部分
    • 结果变成这样:[[[{0.0: 10, 1.0: 11}], [{0.0: 157, 1.0: 23}]], [[{0.0: 7, 1.0: 177}], [{0.0: 77, 1.0: 44}]]]
    • 有什么办法可以避免嵌套列表?
    • 是的,将else 中的append 替换为extend(请参阅我对答案的更新)
    猜你喜欢
    • 2012-10-18
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2018-06-16
    • 2020-03-03
    • 2018-09-02
    • 1970-01-01
    相关资源
    最近更新 更多