sklearn - plot decision tree python
Visualización del árbol de decisiones en scikit-learn (5)
Estoy tratando de diseñar un árbol de decisiones simple usando scikit-learn en Python (estoy usando el cuaderno Ipython de Anaconda con Python 2.7.3 en el sistema operativo Windows) y lo visualizo de la siguiente manera:
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")
Sin embargo, me sale el siguiente error:
AttributeError: ''NoneType'' object has no attribute ''close''
Utilizo la siguiente publicación de blog como referencia: enlace de Blogpost
La siguiente pregunta sobre stackflow no parece funcionar también para mí: Pregunta
¿Podría alguien ayudarme a visualizar el árbol de decisiones en scikit-learn?
sklearn.tree.export_graphviz
no devuelve nada y, por lo tanto, devuelve None
.
Al hacer dotfile = tree.export_graphviz(...)
sobreescribes tu objeto de archivo abierto, que previamente había sido asignado a dotfile
, por lo que obtienes un error cuando tratas de cerrar el archivo (como ahora es None
).
Para solucionarlo, cambie su código a
...
dotfile = open("D:/dtree2.dot", ''w'')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
...
Alternativamente, podrías intentar usar pydot para producir el archivo png desde dot:
...
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")
...
Si, como yo, tiene un problema al instalar graphviz, puede visualizar el árbol
- exportándolo con
export_graphviz
como se muestra en las respuestas anteriores - Abra el archivo
.dot
en un editor de texto - Copie el trozo de código y péguelo @ webgraphviz.com
Puede copiar el contenido del archivo export_graphviz y puede pegar el mismo en el sitio webgraphviz.com .
Puede consultar el artículo sobre Cómo visualizar el árbol de decisiones en Python con graphviz para obtener más información.
Aquí hay un trazador de líneas para los que están utilizando jupyter y sklearn (18.2+). Ni siquiera necesitas matplotlib
para eso. El único requisito es graphviz
pip install graphviz
de ejecutar (de acuerdo con el código en la pregunta X es un marco de datos de pandas)
from graphviz import Source
from sklearn import tree
Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
Esto lo mostrará en formato SVG. El código anterior produce el objeto fuente de Graphviz source_code . (no da miedo) Eso se representaría directamente en jupyter.
Algunas cosas que es probable que hagas con él
Muéstralo en jupter:
from IPython.display import SVG
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
SVG(graph.pipe(format=''svg''))
Guardar como png:
graph = Source( tree.export_graphviz(dtreg, out_file=None, feature_names=X.columns))
graph.format = ''png''
graph.render(''dtree_render'',view=True)
Obtener la imagen png, guardarla y verla:
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)
Si vas a jugar con esa lib aquí hay enlaces a ejemplos y guía de usuario