如何存储决策树

Posted

技术标签:

【中文标题】如何存储决策树【英文标题】:how to store decision tree 【发布时间】:2014-03-14 12:55:21 【问题描述】:

我尝试了几种不同的方法,其中一些是我在这里找到的,其中包括创建 Node 类和嵌套字典,但我似乎无法让它们工作。

我的代码目前接收几行 DNA (a,t,g,c),然后存储为一个 numpy 数组。然后它找到提供最大增益的属性并将数据拆分为 4 个新的 numpy 数组(取决于属性中存在的 a、t、g 或 c)。

我无法创建一个可以构建树的递归函数。我对python和编程本身还是很陌生,所以请详细描述我应该做什么。

感谢您的帮助

【问题讨论】:

这里可能有一些帮助:***.com/questions/4983882/… 你能举一个更详细的例子来说明这个逻辑是如何工作的吗? 【参考方案1】:

可能 dict 就是你想要的:

一个节点的例子是:

'sex': 'yes': 'send email', 'no': 'not send email'

【讨论】:

【参考方案2】:

如果您想从头开始实现决策树,我建议您使用类来构建决策树。一棵树由节点组成,其中一个节点递归地包含节点,叶子是终端节点。对于二叉树的情况,这些类可以是:

class Node(object):
    def __init__(self):
        self.split_variable = None
        self.left_child = None
        self.right_child = None

    def get_name(self):
        return 'Node'

class Leaf(object):
    def __init__(self):
        self.value = None

    def get_name(self):
        return 'Leaf'

对于 Node 类:“split_variable”将包含拆分中使用的变量名称,即:[a,t,g,c] 和“left_child”和“right_child”将是 Node 或 Leaf 的新实例。该变量的真/假存在将被映射到左/右孩子。 (在回归树的情况下,您需要将第四个变量添加到节点类“split_value”,并将小于/大于该值的值映射到左/右子级)。

对于 Leaf 类:'value' 包含树类变量的赋值(即离散变量的大多数情况下或连续变量情况下的平均值)。

要完成您的实现,您需要使用函数来遍历树评估和/或可视化它。这些函数将被递归调用以完成遍历树。在这里,您可以使用类的 get_name() 函数来区分节点和叶子。要实现这部分,它实际上取决于您如何存储数据,我建议您使用类似于表格的pandas DataFrames。示例评估函数可以是(伪代码):

def evaluate_tree(your_data, node):
    if your_data[node.split_variable]:
        if node.left_child.get_name() == 'Node':
            evaluate_tree(your_data, node.left_child)
        elif node.left_child.get_name() == 'Leaf':
            return node.left_child.value
    else:
        if node.right_child.get_name() == 'Node':
            evaluate_tree(your_data, node.right_child)
        elif node.right_child.get_name() == 'Leaf':
            return node.right_child.value

祝你好运!

【讨论】:

【参考方案3】:

如果您希望在 python 中使用决策树,您可以使用 Sci-kit learn 中的决策树模块,而不是编写自己的决策树类和逻辑:http://scikit-learn.org/stable/modules/tree.html。使用 Scikit Learn 决策树模块,您可以将决策树对象保存到内存中,或者将树的某些属性写入文件或数据库。

Sci-kit learn 以及作为 Anacondas 包一部分的其他 Python 库几乎是 Python 中数据探索和分析的标准。您可以在此处从 Continuum 获取 Anaconda 包:http://continuum.io/downloads

编辑 1

我在 Hacker News 上看到了这个。它是关于使用 PostgreSQL 作为您从中提取值的数据库在 Python 中构建决策树。结帐可能很有趣: http://www.garysieling.com/blog/building-decision-tree-python-postgres-data

【讨论】:

这是我想要的,但我真的很想学习如何自己实现决策树。我问过一些程序员同事,他们建议使用类。但是,我仍然有点忘记如何实现“类节点:”以获得我想要的结果。 一个很好的起点是下载 scikit learn 源代码并查看它们如何实现决策树——这是我之前使用 Numpy 和矩阵乘法所做的事情。您可能不会编写与 scikit 学习一样快或优化的代码,但您会了解它是如何实现的。

以上是关于如何存储决策树的主要内容,如果未能解决你的问题,请参考以下文章

C++ 决策树存储

《机器学习实战》-决策树

我应该如何在数据库中存储稀疏决策树(移动列表)?

机器学习实战教程:决策树实战篇

《机器学习实战》第3章 决策树 学习笔记

决策树 - 决策树如何在每个节点上选择规则