2015-01-07 16 views
14

Sto cercando di progettare un semplice Albero decisionale utilizzando scikit-learn in Python (sto usando Notebook ipython di Anaconda con Python 2.7.3 su Windows OS) e visualizzare come segue:Visualizzazione albero decisionale in scikit-learn

from pandas import read_csv, DataFrame 
from sklearn import tree 
from os import system 

data = read_csv('D:/training.csv') 
Y = data.Y 
X = data.ix[:,"X0":"X33"] 

dtree = tree.DecisionTreeClassifier(criterion = "entropy") 
dtree = dtree.fit(X, Y) 

dotfile = open("D:/dtree2.dot", 'w') 
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns) 
dotfile.close() 
system("dot -Tpng D:.dot -o D:/dtree2.png") 

Tuttavia, ottengo il seguente errore:

AttributeError: 'NoneType' object has no attribute 'close' 

io uso il seguente post sul blog come riferimento: Blogpost link

il seguente q StackOverflow non sembra funzionare anche per me: Question

Qualcuno potrebbe aiutarmi a visualizzare l'albero delle decisioni in scikit-learn?

+0

Viene creato il file 'dtree2.dot'? –

+0

Puoi eseguire il debug della riga 'export_graphviz' perché restituisce' None', quindi si è verificato un errore – EdChum

+0

Sì. dtree2.dot viene creato. – Ravi

risposta

10

sklearn.tree.export_graphviz non restituisce nulla, quindi restituisce per impostazione predefinita None.

Effettuando dotfile = tree.export_graphviz(...) si sovrascrive l'oggetto file aperto, che era stato precedentemente assegnato a dotfile, in modo da ottenere un errore quando si tenta di chiudere il file (come è ora None).

Per risolvere il problema modificare il codice per

... 
dotfile = open("D:/dtree2.dot", 'w') 
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns) 
dotfile.close() 
... 
+0

Questo elimina l'errore ma il seguente comando non produce il grafico: sistema ("dot -Tpng D: /dtree2.dot -o D: /dtree2.png"). Tuttavia, viene creato il file dtree2.dot. – Ravi

+0

Non so nulla sull'utilizzo di graphviz mi dispiace. È meglio se chiedi una nuova domanda poiché è un problema completamente diverso. – Ffisegydd

8

In alternativa, si potrebbe provare a utilizzare pydot per produrre il file PNG da punto:

... 
tree.export_graphviz(dtreg, out_file='tree.dot') #produces dot file 

import pydot 
dotfile = StringIO() 
tree.export_graphviz(dtreg, out_file=dotfile) 
pydot.graph_from_dot_data(dotfile.getvalue()).write_png("dtree2.png") 
... 
15

Se, come me, avete un problema di installazione graphviz, è possibile visualizzare l'albero per

  1. esportandolo con export_graphviz come mostrato nelle precedenti risposte
  2. Aprire il file .dot in un editor di testo
  3. Copiare il pezzo di codice e incollarlo @webgraphviz.com
+1

questo è molto utile grazie! – joshi123

7

Ecco una fodera per coloro che utilizzano jupyter e sklearn (18.2+) Non è nemmeno necessario matplotlib per quello. Unico requisito è graphviz

pip install graphviz 

di corsa (secondo codice in questione X è un dataframe panda)

from graphviz import Source 
from sklearn import tree 
Source(tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns)) 

Questo mostrerà in formato SVG. Il codice sopra produce l'oggetto Source di Graphviz (source_code - non spaventoso) che verrebbe visualizzato direttamente in jupyter.

Alcune cose che si possono fare con esso

visualizzarla in jupter:

from IPython.display import SVG 
graph = Source(tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns)) 
SVG(graph.pipe(format='svg')) 

Salva come PNG:

graph = Source(tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns)) 
graph.format = 'png' 
graph.render('dtree_render',view=True) 

ottenere l'immagine png, salvarlo e visualizzarlo :

graph = Source(tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns)) 
png_bytes = graph.pipe(format='png') 
with open('dtree_pipe.png','wb') as f: 
    f.write(png_bytes) 

from IPython.display import Image 
Image(png_bytes) 

Se giocherai con quella lib, ecco i link a examples e userguide

Problemi correlati