我正在用 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
最佳答案
在 findrootnodes
函数中,您永远不会更改非结果节点的 rootnodes
值。也就是说,当您调用 findrootnodes
时,您首先设置:
rootnodes = []
假设初始节点没有结果
,则运行:
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 将仅迭代键。
关于python - 决策树中的递归编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434121/