2016-07-04 40 views
33

Il mio codice segue la classe di apprendimento automatico di google. I due codici sono gli stessi. Non so perché mostra errore. Potrebbe essere il tipo di variabile è errore. Ma il codice di google è lo stesso per me. Chi ha mai avuto questo problema?graph.write_pdf ("iris.pdf") AttributeError: l'oggetto 'list' non ha attributo 'write_pdf'

Si tratta di errore

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

Questo è un codice

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

risposta

53

Penso che si sta utilizzando la versione più recente di pitone. Si prega di provare con pydotplus.

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

Questo dovrebbe farlo.

+0

La ringrazio molto molto !!!! Questo metodo ha risolto il mio problema. –

+3

Ho appena avuto un'occhiata. Il grafico è un elenco e contiene un oggetto pydot.Dot. Uso l'oggetto pydot.Dot chiama la funzione write_pdf ("iris.pdf"), risolve anche la domanda. –

+0

@ 乔守卿 Quale sintassi hai usato/come hai usato pydot.Dot? – programmer

16

pydot.graph_from_dot_data() restituisce una lista, in modo da provare:

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

Grazie per la risposta. Soluzione abbastanza semplice senza dover passare attraverso il fastidio di pydotplus – maheeka

+0

Che funziona per me. Grazie! –

0

installo scikit-learn tramite Conda e tutti di non lavorare. In primo luogo, devo installare libtool

brew install libtool --universal 

Poi seguo this sklearn guide quindi modificare il file python a questo codice

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

Infine convertire png nel terminale

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

Ho Python 3.6.0 | Anaconda 4.3.1 e ottengo errore:

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

Dovresti installare GraphViz prima da qui (http://www.graphviz.org/Download..php) e poi aggiungere la sua directory "bin" con gli eseguibili (c: \ Programmi (x86) \ Graphviz2.38 \ bin) al PERCORSO del tuo computer. –

3

Ho avuto esattamente lo stesso problema. Si è scoperto che non avevo installato graphviz. Una volta che l'ho fatto, ha iniziato a funzionare.