【问题标题】:Decision Tree Algorithm Suggestions决策树算法建议
【发布时间】:2018-12-20 11:48:56
【问题描述】:

我想写一个方法,接受近70个参数,根据输入返回结果。

这是我的算法的逻辑表示:

在表示中,有 7 个参数,作为树的结果,它给我们 Y 或 N。

我怎样才能写出这样一个更大、更复杂的算法?哪种语言的计算效率更高?

【问题讨论】:

  • 请不要链接外部图片,将其嵌入到您的答案中。
  • @AndrejKesely 上传图片在这里不起作用。我试图上传这个,但是点击它时它没有显示图像。
  • @AndrejKesely 去点击“示例树”。看到图片了吗?
  • 是的,现在好多了。
  • 您想从训练数据集中学习树的结构和每个节点的决策阈值,还是您已经知道自己想要什么,只需要编写代码?当您要求更高效的东西时,它需要以什么方式高效 - 小代码?执行速度快?

标签: python algorithm decision-tree


【解决方案1】:

一种方法是创建一个带有顶点的图,其中边包含需要满足才能通过它的条件。

class Node:

    def __init__(self, edges, val = None):
        self.edges = edges
        self.val = val

    def decide(self, args):
        if len(self.edges) < 1:
            return self.val

        for edge in self.edges:
            (cond, next) = edge

            if cond(args):
                return next.decide(args)
                break

n_a_a = Node([], 'y')
n_a_b = Node([], 'n')
n_b_a = Node([], 'y')
n_b_b = Node([], 'n')

n_a = Node([(lambda args: args['B'] > 0, n_a_a),
            (lambda args: args['B'] <= 0, n_a_b)])
n_b = Node([(lambda args: args['B'] > 5, n_b_a),
            (lambda args: args['B'] <= 5, n_b_b)])

root = Node([(lambda args: args['A'] > 0, n_a),
             (lambda args: args['A'] <= 0), n_b)])

print root.decide({'A':5,'B':10})

另一种方法是为您的决策树建模,然后使用生成代码的代码生成器或自己手动编写如下代码:

def root(args):
    if args['A'] > 0:
        return n_a(args)

    return n_b(args)

def n_a(args):
    if args['B'] > 0:
        return n_a_a(args)

    return n_a_b(args)

def n_b(args):
    if args['B'] > 5:
        return n_b_a(args)

    return n_b_b(args)

def n_a_a(args):
    return 'y'

def n_a_b(args):
    return 'n'

def n_b_a(args):
    return 'y'

def n_b_b(args):
    return 'n'

print root({'A':5,'B':10})

【讨论】:

  • 你的第二种方法是我最初的想法。但是当有数百个函数时,它的计算速度会很慢,或者我猜这将是一个糟糕的编码。我将首先尝试实施您的第一个建议。谢谢你的回答。
  • 它可能会比第一种方法更快,因为第一种方法有更多的间接等。如果你使用编译语言,编译器会内联和优化它。通常,如果树是静态的,那么从决策树模型中获得有效的代码生成将是我想说的最有效的。
  • 只要函数不需要全局状态,你也可以很容易地并行化它。
  • 那么,您建议使用哪种编程语言来计算这种算法?我将尝试在服务器上运行它,这可能是 Heroku 服务器。
  • 我不知道。这取决于您知道哪些语言以及您的基础架构是什么,您是否需要某些库,是否有需要组合在一起的不同组件等。我是 Go 的忠实粉丝,但我从未用它编写过决策树,但是根据经验,Python 往往比 JITted 或编译语言慢,除非你使用 PyPy,它与 CPython 相比实际上提供了惊人的速度。
【解决方案2】:

在机器学习术语中,您描述的是一个分类树

实现分类树的机器学习库有很多很多。其中许多被设计为部署在服务器上,并且已经过优化以针对构建模型进行评分 - 这是您正在尝试做的机器学习术语 - 有效。

但是,这些库通常旨在从训练数据中学习树的结构,而您希望手动构建它。要使用这种方法,您需要找到一个模型格式可以访问和“伪造”的库。我不知道自己应该推荐哪一个,在这里寻求关于图书馆的建议是题外话,但Data Science 可能会有所帮助。

一种选择是在PMML 中对您的树进行编码,然后将其导入可以执行 PMML 模型的平台。例如,我相信这可以在 SQL Server 和/或 Microsoft Azure 中完成。 This reference 描述了另一种部署 PMML 模型的方法。

或者,您可以生成一个显示所需规则的合成数据集,然后使用您喜欢的任何分类树库在该数据上训练模型。

【讨论】:

  • 感谢您的回答。我在数据科学中问过这个问题。我希望他们会向我推荐一些我可以轻松理解的东西。 :)
猜你喜欢
  • 2011-05-06
  • 2018-12-12
  • 2016-02-23
  • 2019-10-30
  • 2018-08-14
  • 2015-05-11
  • 2016-07-27
  • 2019-10-16
  • 2015-06-17
相关资源
最近更新 更多