【问题标题】:Refactoring of decision trees using automatic learning使用自动学习重构决策树
【发布时间】:2012-12-19 16:26:16
【问题描述】:

问题如下:

我开发了一个表达式评估引擎,它为用户提供了一种类似 XPath 的语言,以便他可以构建表达式。然后将这些表达式解析并存储为表达式树。表达式有很多种,包括逻辑(and/or/not),关系(=, !=, >, =,

除了这些操作之外,表达式还可以包含常量(数字、字符串、日期等),还可以使用类似于 XPath 的语法在 Java 对象树中导航来访问外部信息。

鉴于上述情况,我们可以构建如下表达式:

/some/value and /some/other/value

/some/value or /some/other/value

if (<evaluate some expression>) then 
    <evaluate some other expression> 
else 
    <do something else>

由于 if-then-else 表达式的 then-part 和 else-part 本身就是表达式,并且一切都被认为是一个表达式,那么任何东西都可以出现在那里,包括其他 if-then-else,允许用户通过嵌套 if-then-else 来构建大型决策树。

由于这些表达式是手动构建的并且容易出现人为错误,因此我决定构建一个能够基于对常见外部数据的分析来优化这些表达式树的自动学习过程。例如:在上面的第一个表达式中(/some/value and /some/other/value),如果 /some/other/value 的结果大部分是 false时间,我们可以重新排列树,这样这个分支将成为左分支,以利​​用短路评估(AND 的右侧不被评估,因为左侧已经确定了结果)。

另一个可能的优化是重新排列嵌套的 if-then-else 表达式(决策树),以便根据最常用的外部数据采用的最频繁路径将在未来更快地执行,从而避免对某些分支进行不必要的评估大多数时候。

您对用于执行这些表达式树的自动重构的最佳或推荐方法/算法有什么想法吗?

【问题讨论】:

  • 我不明白,优化如何帮助您解决人为错误?

标签: machine-learning expression-trees decision-tree


【解决方案1】:

我认为您所描述的是编译器优化,这是一个巨大的主题

  • 内联扩展
  • 死码消除
  • 不断传播
  • 循环变换

基本上,您有很多重写规则可以保证保留代码/xpath 的功能。

在有关重新排列嵌套 if-else 的问题中,我认为您不需要求助于机器学习。 一种(我认为最佳)方法是使用链接的霍夫曼编码huffman_coding 把每条路径当作一个字母,然后我们用霍夫曼编码对它们进行编码,得到一个所谓的霍夫曼树。该树将在(足够大的)样本上运行最少的评估,该样本具有与您制作 Huffman 树的相同分布。

如果您对“评估某些表达式”-表达式有限制,或者它们具有不同的计算成本等。您可能需要另一种方法。

请记住,与往常一样,在优化方面您应该小心,只做真正重要的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2013-04-21
    • 2011-06-23
    • 2011-01-29
    • 2015-06-15
    • 2013-01-07
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多