我尝试了几种不同的方法,其中一些我在这里找到了包括制作Node类和嵌套字典,但我似乎无法使它们起作用。
我的代码目前需要几行DNA(a,t,g,c),然后存储为numpy数组。然后它找到提供最大增益的属性,并将数据拆分为4个新的numpy数组(取决于属性中存在的a,t,g或c)。
我无法创建可以构建树的递归函数。我对python和编程本身很陌生,所以请详细描述我应该做些什么。
感谢您的帮助
答案 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'}}