繁体   English   中英

决策树中的递归编程

[英]Recursive programming in decision tree

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

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

我想创建一个函数findrootnodes(tree) ,该函数遍历树,向下遍历到根节点。 它应该返回列表rootnodes。 列表的每个元素都应包含一个字典。 因此,具有四个根节点的决策树的示例为[{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

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将仅对keys进行迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM