Python中的简单决策树(嵌套if语句)?

Posted

技术标签:

【中文标题】Python中的简单决策树(嵌套if语句)?【英文标题】:Simple decision tree (nested if-statement) in Python? 【发布时间】:2020-04-08 08:10:14 【问题描述】:

我想在 JSON 中定义一个嵌套的 if-statement 并使用 Python 对其进行测试。我正在考虑一个带有嵌套分支的简单决策树,并进行递归测试。

伪代码

# is_valid = (a == b OR a == a) AND c == c  # True
tree = 
    branches: [
        
            value1: 'a',
            operator: '==',
            value2: 'b',
            child_connector: 'or'
            children: [
                
                    value1: 'a',
                    operator: '==',
                    value2: 'a'
                   
            ]
        ,
        
            connector: 'and',
            value1: 'c',
            operator: '==',
            value2: 'c'
        
    ]


def is_tree_valid(tree):
    # TODO
    return

is_valid = is_tree_valid(tree)

当我在 Google 上搜索决策树时,我发现了很多与 AI 相关的内容,但往往过于深入。我正在寻找一些简单的东西,并猜测这是一个常见的话题,并且经常被重新发明。

我会感谢代码 sn-ps、模块或任何其他建议来完成 is_tree_valid()

提前致谢!

【问题讨论】:

is_tree_valid() 内部的逻辑难道不取决于您对“有效”的定义吗?我不完全清楚您要完成的工作,但请查看内置的ast module。您可能正在重新发明***。 在制作原型时,我会创建key_name: validation_func 的映射并使用它。它有点笨重,但适用于较小的问题。但是您的 dict 看起来像是在重新发明 LR 解析器。看看PLY 包。您必须学习一些 lex 和 yacc,但是如果您正在创建某种语句语言/语法,那么从一开始就以正确的方式进行操作将对您以后大有裨益。 ast 是一个选项,但 IIRC 它仅适用于 Python 语法。 @BłażejMichalik 非常感谢您提供的链接和关键字。树会更复杂,这只是一个非常简化的示例。 a/b/c 代表什么?这些只是文字(这将是微不足道的),还是您的(Python)评估者知道的某种值? @Mr.B.:当然,但代码中最复杂的部分是调用这些函数(或识别已经获得的结果)。 【参考方案1】:

这与算法一样重要,但将它们设计在一起只是合理的。要评估的表达式的最简单编码是AST 的直接翻译:


  "operator": "and",
  "left": 
    "operator": "or",
    "left": 
      "operator": "==",
      "left": "a",
      "right": "b"
    ,
    "right": 
      "operator": "==",
      "left": "a",
      "right": "a"
    
  ,
  "right": 
    "operator": "==",
    "left": "c",
    "right": "c"
  

然后(解析成明显的 Python 结构后),求值看起来像

def evaluate(node):
  try: op=node['operator']
  except TypeError: return node  # leaf
  l=evaluate(node['left'])
  r=node['right']  # not evaluated yet
  if op=='==': return l==evaluate(r)
  elif op=='and': return l and evaluate(r)
  elif op=='or': return l or evaluate(r)
  else: raise ValueError("unknown operator: %r"%op)

【讨论】:

非常感谢您提供这个sn-p。我没有看到任何括号,这意味着层次结构将保持平坦,对吗?它如何处理,例如(a == b OR a == a) AND c == c @Mr.B.:JSON 的嵌套深度与表达式一样;括号(它们不会被优先级暗示)由对象层次结构暗示。在这种情况下,orand 的左操作数。 啊,当然是嵌套的。 :-) 我期待明天用一个新鲜的大脑来测试它。再次非常感谢您。

以上是关于Python中的简单决策树(嵌套if语句)?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 决策树存储

能打造新型CPU的有机分子元件登Nature,用if语句攒出决策树,一个顶数千晶体管...

机器学习:通俗易懂决策树与随机森林及代码实践

决策树模型(简单例子理解原理)

机器学习决策树ID3算法,手把手教你用Python实现

决策树算法总结