graph.write_pdf ("iris.pdf") AttributeError: объект 'list' не имеет атрибута 'write_pdf'

Мой код соответствует классу машинного обучения google. Оба кода одинаковы. Я не знаю, почему он показывает ошибку. Может быть, тип переменной - ошибка. Но код Google такой же для меня. Кто когда-либо имел это проблема?

Это ошибка

[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]

Это код

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")

Ответы

Ответ 1

pydot.graph_from_dot_data() возвращает список, поэтому попробуйте:

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

Ответ 2

Я думаю, вы используете более новую версию python. Попробуйте с pydotplus.

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

Это должно сделать это.

Ответ 3

У меня была точно такая же проблема. Оказалось, что я не установил graphviz. Как только я это сделал, он начал работать.

Ответ 4

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

У меня есть Python 3.6.0 | Anaconda 4.3.1 и получите ошибку:

Файл "C:\Anaconda\lib\site-packages\pydotplus\graphviz.py", строка 1960, в создании "GraphViz\executables not found")

InvocationException: исполняемые файлы GraphViz не найдены

Ответ 5

@Alex Sokolov, для моего случая в окне, я загрузил и установил/распакувал следующее в папку, а затем установил PATH в переменных среды Windows. перезапустите py-код для меня. надежда полезна для вас.

Ответ 6

Я устанавливаю scikit-learn через conda, и все об этом не работает. Во-первых, мне нужно установить libtool

brew install libtool --universal

Затем я следую этому руководству sklearn. Затем измените файл python на этот код.

clf = clf.fit(train_data, train_target)
tree.export_graphviz(clf,out_file='tree.dot') 

Наконец, конвертировать в png в терминале

dot -Tpng tree.dot -o tree.png

Ответ 7

Я попробовал предыдущие ответы и все еще получил ошибку при запуске скрипта. Поэтому я просто использовал pydotplus

import pydotplus

и установите " graphviz ", используя:

sudo apt-get install graphviz

Тогда это сработало для меня, и я добавил

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

Благодаря предыдущим участникам.

Ответ 8

На Python3.7 он работает следующим образом, но не забудьте установить pydot с помощью приглашения Anaconda:

   from sklearn.externals.six import StringIO
   import pydot

   # viz code
   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[0].write_pdf('iris.pdf')

Ответ 9

Я использую Анаконду. Вот что у меня сработало: run from Terminal:

conda install python-graphviz
conda install pydot     ## don't forget this <-----------------

Тогда беги

clf = clf.fit(train_data, train_target)
tree.export_graphviz(clf,out_file='tree.dot')

Затем из терминала:

dot -Tpng tree.dot -o tree.png

Ответ 10

Надеюсь, это поможет, у меня была аналогичная проблема. Я решил не использовать pydot/pydotplus, а скорее graphviz. Я изменил (едва) код, и он творит чудеса! :)

# 2. Train classifier
# Testing Data
# Examples used to "test" the classifier accuracy
# Not part of the training data
import numpy as np
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
test_idx = [0, 50, 100] # Grabs one example of each flower for testing data (in the data set it so happens to be that
                        # each flower begins at 0, 50, and 100

# training data
train_target = np.delete(iris.target, test_idx)     # Delete all but 3 for training target data
train_data = np.delete(iris.data, test_idx, axis=0) # Delete all but 3 for training data

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

# create decision tree classifier and train in it on the testing data
clf = tree.DecisionTreeClassifier()
clf.fit(train_data, train_target)

# Predict label for new flower
print(test_target)
print(clf.predict(test_data))

# Visualize the tree
from sklearn.externals.six import StringIO
import graphviz
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 = graphviz.Source(dot_data.getvalue())
graph.render("iris.pdf", view=True)