我正在用python编写决策树。tree
是具有真分支tb
和假分支的对象fb
。仅根节点具有属性results
。
results
是一个字典,其中包含节点上每个目标变量(即因变量)的计数。我正在研究二进制分类问题,因此一个示例是dictionary {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 = []
假设初始节点没有no 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上进行迭代。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句