Visualizando el árbol de decisiones en scikit-learn

Estoy tratando de diseñar un Árbol de decisiones sencillo usando scikit-learn en Python (estoy usando el Ipython Notebook 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 entrada de blog como referencia: Blogpost link

La siguiente pregunta de stackoverflow no parece funcionar para mí también: 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, por defecto devuelve None .

Al hacer dotfile = tree.export_graphviz(...) , sobrescribe su objeto de archivo abierto, que había sido asignado previamente a dotfile , por lo que recibe un error cuando intenta cerrar el archivo (ya que ahora es None ).

Para arreglarlo cambia tu código a

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

Aquí hay un trazador de líneas para aquellos que usan jupyter y sklearn (18.2+) Ni siquiera necesita matplotlib para eso. El único requisito es Graphviz

 pip install graphviz 

than run (según el código en cuestión X es un DataFrame 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 ( código de fuente , no miedo) que se representaría directamente en jupyter.

Algunas cosas que es probable que hagas con él

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

Obtén la imagen png, guárdala y visualízala:

 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 biblioteca, aquí están los enlaces a ejemplos y guía de uso.

Si, como yo, tiene un problema al instalar graphviz, puede visualizar el árbol mediante

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

Alternativamente, puedes intentar usar pydot para generar el archivo png desde el 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") ... 

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.

Si tiene problemas para agarrar la fuente .dot directamente, también puede usar Source.from_file así:

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

Copio y cambio una parte de su código como se muestra a continuación:

 from pandas import read_csv, DataFrame from sklearn import tree from sklearn.tree import DecisionTreeClassifier 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) 

Después de asegurarse de que tiene dtree, lo que significa que el código anterior funciona bien, agregue el siguiente código para visualizar el árbol de decisiones:

Recuerde instalar primero graphviz: pip install graphviz

 import graphviz from graphviz import Source dot_data = tree.export_graphviz(dtree, out_file=None, feature_names=X.columns) graph = graphviz.Source(dot_data) graph.render("name of file",view = True) 

Probé con mis datos, la visualización funcionó bien y obtuve un archivo PDF que se vio de inmediato.

Lo siguiente también funciona bien:

 from sklearn.datasets import load_iris iris = load_iris() # Model (can also use single decision tree) from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators=10) # Train model.fit(iris.data, iris.target) # Extract single tree estimator = model.estimators_[5] from sklearn.tree import export_graphviz # Export as dot file export_graphviz(estimator, out_file='tree.dot', feature_names = iris.feature_names, class_names = iris.target_names, rounded = True, proportion = False, precision = 2, filled = True) # Convert to png using system command (requires Graphviz) from subprocess import call call(['dot', '-Tpng', 'tree.dot', '-o', 'tree.png', '-Gdpi=600']) # Display in jupyter notebook from IPython.display import Image Image(filename = 'tree.png') 

introduzca la descripción de la imagen aquí

Puedes encontrar la fuente aquí