with sklearn example decision classifier python scikit-learn visualization decision-tree

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

  1. exportándolo con export_graphviz como se muestra en las respuestas anteriores
  2. Abra el archivo .dot en un editor de texto
  3. Copie el trozo de código y péguelo @ webgraphviz.com


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