如何存储决策树

时间:2014-02-15 00:03:45

标签: python python-2.7 decision-tree

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

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

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

感谢您的帮助

3 个答案:

答案 0 :(得分: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的新实例。该变量的真/假存在将映射到左/右子节点。 (如果是回归树,您需要向Node类添加第四个变量' split_value'并将少于/大于此值的值映射到左/右子项中。

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

要完成您的实施,您需要使用函数来对树进行评估和/或可视化。将递归调用这些函数以完成遍历树。您可以在这里使用类的get_name()函数来区分节点和叶子。要实现此部分,这实际上取决于您存储数据的方式,我建议您使用类似表格的pandas DataFrame。样本评估函数可以是(伪代码):

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
祝你好运!

答案 1 :(得分:1)

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

Sci-kit学习以及作为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

答案 2 :(得分:1)

可能dict就是你想要的:

节点的一个例子是:

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