属性错误: 'list'对象没有 'create_png' 属性。

3

这将数据分类为决策树。已经创建了决策树,但我无法查看决策树。

import numpy as np
from sklearn import linear_model, datasets, tree
import matplotlib.pyplot as plt
iris = datasets.load_iris()
f = open('decision_tree_data.txt')
x_train = []
y_train = []
for line in f:
    line = np.asarray(line.split(),dtype = np.float32)
    x_train.append(line[:-1])
    y_train.append(line[:-1])
x_train = np.asmatrix(x_train)
y_train = np.asmatrix(y_train)
model = tree.DecisionTreeClassifier()
model.fit(x_train,y_train)
from sklearn.externals.six import StringIO
import pydot
from IPython.display import Image
dot_data = StringIO()
tree.export_graphviz(model, out_file=dot_data,  
                     feature_names=iris.feature_names,  
                     class_names=iris.target_names,  
                     filled=True, rounded=True,  
                     special_characters=True)  
graph = pydot.graph_from_dot_data(dot_data.getvalue()) 
Image(graph.create_png())

1
欢迎来到StackOverflow。请仔细阅读并遵循帮助文档中的发帖指南。最小完整可验证示例在此适用。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到一个文本文件中,并重现您描述的问题。特别是,我们需要您包括所有错误消息以及足够的数据来让我们到达问题点。 - Prune
总体来说,它看起来graph是一个列表,而不是预期的pydot对象。你是否忘记进行todot转换了?抱歉,我对这个包不是很熟悉。 - Prune
也许你应该尝试安装pydotplus,并将代码中的pydot替换为pydotplus。Pydot似乎已经多年没有更新了。 - Metaphox
你说的“无法查看”是什么意思?是空白页面吗?还是出现错误信息?或者是乱码等问题? - Joshua Drake
@Prune 当我打印图表时,输出为:[<pydot.Dot object at 0x1139738d0>]。 - Biranchi
这是调试的第一步。现在我有点困惑。您能否在原始帖子中包含那些行(打印和结果)?还请包括整个错误消息(完整文本和回溯)。 - Prune
1个回答

7

函数pydot.graph_from_dot_data返回一个列表pydot >= 1.2.0(与早期版本的pydot相比)。

原因是为了使输出结果更加统一化,过去如果返回两个图形,则为列表,但如果返回单个图形,则为图形。这种分支是用户代码错误的常见来源(简单胜于复杂[PEP 20])。

该更改适用于调用函数dot_parser.parse_dot_data的所有功能,该函数现在在所有情况下返回一个list
为解决错误,您需要拆开预期的单个图形:
graph, = pydot.graph_from_dot_data(dot_data.getvalue())

这个语句还声明了只返回一个图。如果这个假设不成立,返回了多个图,那么这个解包过程就会捕获到它。相比之下,graph = (...)[0] 将不能达到此目的。
相关的 pydot 问题:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接