Pydot中决策树的字典对象

Posted

技术标签:

【中文标题】Pydot中决策树的字典对象【英文标题】:Dictionary object to decision tree in Pydot 【发布时间】:2012-11-21 05:21:39 【问题描述】:

我有一个这样的字典对象:

menu = 'dinner':'chicken':'good','beef':'average','vegetarian':'tofu':'good','salad':'caeser':'bad','italian':'average','pork':'bad'

我正在尝试使用带有“菜单”数据this 的 pydot 创建一个图表(决策树)。

'Dinner' 将是顶部节点,其值(鸡肉、牛肉等)位于其下方。参考链接,graph函数有两个参数;一个源和一个节点。

它看起来像 this:

除了“king”是“dinner”,“lord”是“chicken”、“beef”等。

我的问题是:如何访问值中的键?要从这些数据中创建一棵树,我觉得我需要创建一个循环来检查特定键是否存在值并绘制它。我不确定如何调用任何字典对象的值(如果它不一定称为“晚餐”或具有尽可能多的元素。)。

关于如何绘制它的任何建议?

【问题讨论】:

【参考方案1】:

使用递归函数

您可能需要考虑使用 recursive 函数(如我下面代码中的 visit,以便您能够处理一般嵌套字典。在此函数中,您希望通过parent 参数来跟踪谁是您的传入节点。还请注意,您使用 isinstance 检查键的字典值是否是它自己的字典,在这种情况下,您需要递归调用 visit .

import pydot

menu = 'dinner':
            'chicken':'good',
             'beef':'average',
             'vegetarian':
                   'tofu':'good',
                   'salad':
                            'caeser':'bad',
                            'italian':'average'
                   ,
             'pork':'bad'
        

def draw(parent_name, child_name):
    edge = pydot.Edge(parent_name, child_name)
    graph.add_edge(edge)

def visit(node, parent=None):
    for k,v in node.iteritems():
        if isinstance(v, dict):
            # We start with the root node whose parent is None
            # we don't want to graph the None node
            if parent:
                draw(parent, k)
            visit(v, k)
        else:
            draw(parent, k)
            # drawing the label using a distinct name
            draw(k, k+'_'+v)

graph = pydot.Dot(graph_type='graph')
visit(menu)
graph.write_png('example1_graph.png')

生成的树结构

【讨论】:

是的,这正是我正在做的事情。我唯一要更改的是在相应节点下为“坏”、“平均”、...添加另一个气泡。不过这很棒。 另外,我在哪里粘贴 graph.write_png('...')? 为了完整起见,我只是将其添加到我的代码中。感谢您接受答案。 graph.write_png('example1_graph.png'),这个 write_png 函数给了我以下错误。谁能帮我摆脱错误?错误:带有 args ['-Tpng', 'C:\\Users\\MYPC~1\\AppData\\Local\\Temp\\tmptnelq9i2'] 的“点”返回代码:1 标准输出,标准错误:b'' b '格式:“png”无法识别。未找到任何格式。\r\n也许需要运行“dot -c”(使用安装程序的权限)来注册插件?\r\n' 是的,我也遇到同样的错误,FileNotFoundError: [Errno 2] "dot" not found in path.【参考方案2】:

您的问题对我来说并不完全清楚,但在 Python 中访问字典键值的方法很简单:

dictionary[key]

这将返回给您该键的值。如果该键不在字典中,它将返回 KeyError,因此,如果您正在使用字典并且不确定您请求的键是否在字典中,您有两种选择。

If 语句(首选):

if key in dictionary:
    return dictionary[key]

尝试捕捉:

try:
    return dictionary[key]
except KeyError:
    pass

如果您不知道字典中的键并且需要获取它们,您只需调用dictionary.keys(),它将返回字典中所有键的列表。

获取字典键的值将返回一个对象,该对象甚至可能是另一个对象。因此,例如,要找出"tofu" 的值,我们将执行以下操作:

menu['dinner']['vegetarian']['tofu']
# returns value 'good'

【讨论】:

让我改写一下:请注意,'dinner' 的值中有键。如何访问这些键的值?不确定这是否清楚。例如,如何获取键“豆腐”的值?

以上是关于Pydot中决策树的字典对象的主要内容,如果未能解决你的问题,请参考以下文章

Python、PyDot 和决策树

决策树的图形可视化

R语言使用rpart包构建决策树模型选择合适的树大小(复杂度)检查决策树对象的cptable内容(树的大小由分裂次数定义预测误差)使用plotcp函数可视化决策树复杂度参数与交叉验证错误的关系

Python 决策树 GraphViz

数据挖掘中决策树的探讨2

决策树ID3决策树C4.5决策树CARTCART树的生成树的剪枝从ID3到CART从决策树生成规则决策树优缺点