我正在开发这个项目,我想从 JSON 动态生成多维决策树。 JSON 具有嵌套的决策规则,每个规则作为节点都应该进行转换。子节点代表决策点。下面我举个例子:
{
"rule": "A > 5",
"true": {
"rule": "B < 3",
"true": {"rule": "C==1", "true": "Leaf 1", "false": "Leaf 2"},
"false": {"rule": "D!= 4", "true": "Leaf 3", "false": "Leaf 4"}
},
"false": {
"rule": "E>= 2",
"true": {"rule": "F <6", "true": "Leaf 5", "false": "Leaf 6"},
"false": {"rule": "G==0", "true": "Leaf 7", "false": "Leaf 8"}
}
}
目标是使用 Python 创建决策树。每个节点作为 TreeNode 类的实例。我想要具体的条件来解决这个问题。
class TreeNode: def __init__(self, rule, truebranch, falsebranch): self.rule = rule self.truebranch= truebranch self.falsebranch =falsebranch def evaluate(self, conditions): pass
我期望 build_tree_from_json 函数来执行此功能。我尝试对规则字符串进行一些解析并管理树中叶节点的不同数据类型。
我需要以下方面的指导:
正确解析运算符和值。
评估方法应正确管理。
准确无误地处理egde案件。
只要您的字符串中有“实际”条件(或任何与此相关的代码),您就不需要使用任何格式。函数
eval(expression, globals, locals)
可以接受任何代表 Python 代码的字符串并执行它。例如:
eval("print(3)") # output: 3
eval("5 >= 12") # output: False
eval("A > 5", {"A": 6}) # output: True
您唯一需要注意的是树叶的停止点。有很多方法可以做到这一点,但这是我最喜欢的方法:
class TreeNode:
rule: str
truebranch: 'TreeNode'
falsebranch: 'TreeNode'
def __init__(self, data_json):
self.rule = data_json['rule']
self.truebranch = None
self.falsebranch = None
if type(data_json["true"]) is dict:
self.truebranch = TreeNode(data_json["true"])
if type(data_json["false"]) is dict:
self.falsebranch = TreeNode(data_json["false"])
def evaluate(self, conditions):
cond_result = eval(self.rule, conditions)
if cond_result:
if self.truebranch is not None:
return self.truebranch.evaluate(conditions)
else:
if self.falsebranch is not None:
return self.falsebranch.evaluate(conditions)
return cond_result
此解决方案假设字典的格式正确,并且“Leaf x”没有特殊含义