46 votes

graph.write_pdf("iris.pdf") AttributeError : l'objet 'list' n'a pas d'attribut 'write_pdf'.

Mon code suit la classe de machine learning de google.Les deux codes sont identiques.Je ne sais pas pourquoi il montre une erreur.Peut être que le type de variable est une erreur.Mais le code de google est le même pour moi.Qui a déjà eu ce problème ?

Il s'agit d'une erreur

[0 1 2]
[0 1 2]
Traceback (most recent call last):
  File "/media/joyce/oreo/python/machine_learn/VisualizingADecisionTree.py", line 34, in <module>
    graph.write_pdf("iris.pdf")
AttributeError: 'list' object has no attribute 'write_pdf'
[Finished in 0.4s with exit code 1]
[shell_cmd: python -u "/media/joyce/oreo/python/machine_learn/VisualizingADecisionTree.py"]
[dir: /media/joyce/oreo/python/machine_learn]
[path: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games]

Il s'agit du code

import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree

iris = load_iris()
test_idx = [0, 50, 100]

# training data
train_target = np.delete(iris.target, test_idx)
train_data = np.delete(iris.data, test_idx, axis=0)

# testing data
test_target = iris.target[test_idx]
test_data = iris.data[test_idx]

clf = tree.DecisionTreeClassifier()
clf.fit(train_data, train_target)

print test_target
print clf.predict(test_data) 

# viz code
from sklearn.externals.six import StringIO
import pydot
dot_data = StringIO()
tree.export_graphviz(clf,
        out_file=dot_data,
        feature_names=iris.feature_names,
        class_names=iris.target_names,
        filled=True, rounded=True,
        impurity=False)

graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")

69voto

avellable Points 965

Je pense que vous utilisez une version plus récente de Python. Essayez avec pydotplus.

import pydotplus
...
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")

Ceci devrait suffire.

3 votes

Le graphique est une liste et il contient un objet pydot.Dot. J'utilise l'objet pydot.Dot pour appeler la fonction write_pdf("iris.pdf")cela résout aussi la question.

0 votes

Quelle syntaxe avez-vous utilisée / comment avez-vous utilisé pydot.Dot ?

2 votes

@programmer La longueur de cette liste est en fait de 1. Donc, il suffit de graph[0].write_pdf . BTW, je suppose que la raison pour laquelle il renvoie une liste est qu'il peut y avoir plusieurs arbres dans un seul fichier dot.

29voto

Iliyan Bobev Points 516

pydot.graph_from_dot_data() renvoie une liste, alors essayez :

graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph[0].write_pdf("iris.pdf")

1 votes

Merci pour la réponse. C'est une solution assez simple sans avoir à passer par les tracas de pydotplus.

5voto

Deepak Rao Points 271

J'ai eu exactement le même problème. Il s'est avéré que je n'avais pas installé graphviz. Une fois que je l'ai fait, cela a commencé à fonctionner.

2voto

Alex Sokolov Points 81
import pydotplus
...
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("iris.pdf")

J'ai Python 3.6.0 |Anaconda 4.3.1 et j'obtiens une erreur :

Dossier " C:\Anaconda\lib\site -Paquets \pydotplus\graphviz.py ", ligne 1960, dans créer 'Les exécutables de GraphViz\ ne sont pas trouvés')

InvocationException : Les exécutables de GraphViz ne sont pas trouvés.

1voto

Jai Points 56

@Alex Sokolov, pour mon cas sous windows, j'ai téléchargé et installé / dézippé les suivants dans un dossier, puis configurer le PATH dans les variables d'environnement Windows J'espère que cela vous sera utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X