决策树中的递归编程

Recursive programming in decision tree

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

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

我想创建一个函数 findrootnodes(tree) 遍历树,直至根节点。它应该 return 列表根节点。列表的每个元素都应该包含一个字典。因此,具有四个根节点的决策树示例为 [{0: 25, 1: 9}, {0: 2, 1: 65}, {0: 2, 1: 7}, {0: 52, 1: 4}].

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

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

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

rootnodes = []

假设初始节点没有results,那么你运行:

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

...两者都没有改变 rootnodes 的值。然后你 return 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 将迭代 仅键