2016-07-04 20 views
33

Mój kod jest zgodny z klasą uczenia maszynowego google. Oba kody są takie same.Nie wiem dlaczego to pokaż error.May być typem zmiennej jest błąd. Ale kod google jest dla mnie taki sam. Kto kiedykolwiek miał ten problem?graph.write_pdf ("iris.pdf") AttributeError: 'list' obiekt nie ma atrybutu "write_pdf"

Jest to błąd

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

Jest to kod

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

Odpowiedz

53

myślę używasz nowszej wersji Pythona. Proszę spróbuj z pydotplus.

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

To powinno wystarczyć.

+0

Dziękuję bardzo bardzo! Ta metoda rozwiązała mój problem. –

+3

Właśnie się obejrzałem. Wykres jest listą i zawiera obiekt pydot.Dot. Używam obiektu pydot.Dot wywołującego funkcję write_pdf ("iris.pdf"), ale także rozwiązuje to pytanie. –

+0

@ 乔守卿 Jakiej składni używałeś/jak używałeś pydot.Dot? – programmer

16

pydot.graph_from_dot_data() zwraca listę, więc spróbuj:

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

Dzięki za odpowiedź. Proste rozwiązanie bez konieczności przechodzenia przez kłopoty z pydotplus – maheeka

+0

To działa dla mnie. Dziękuję Ci! –

0

zainstalować scikit-learn poprzez Conda i wszyscy o nie działać. Po pierwsze, muszę zainstalować Libtool

brew install libtool --universal 

Potem wykonaj this sklearn guide Następnie zmienić plik Pythona do tego kodu

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

Wreszcie przekonwertować png w terminalu

dot -Tpng tree.dot -o tree.png 
0
import pydotplus 
... 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
graph.write_pdf("iris.pdf") 

Mam Python 3.6.0 | Anaconda 4.3.1 i otrzymuję błąd:

File "C:\Anaconda\lib\site-packages\pydotplus\graphviz.py", line 1960, in create 'GraphViz\'s executables not found')

InvocationException: GraphViz's executables not found

+1

Najpierw zainstaluj GraphViz (http://www.graphviz.org/Download..php), a następnie dodaj jego katalog "bin" do plików wykonywalnych (c: \ Program Files (x86) \ Graphviz2.38 \ bin) do PATH twojego komputera. –

3

Miałem dokładnie ten sam problem. Okazało się, że nie zainstalowałem graphviz. Kiedy to zrobiłem, zaczęło działać.

Powiązane problemy