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中决策树的字典对象的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用rpart包构建决策树模型选择合适的树大小(复杂度)检查决策树对象的cptable内容(树的大小由分裂次数定义预测误差)使用plotcp函数可视化决策树复杂度参数与交叉验证错误的关系