2012-05-13 7 views
9

Soy un novato en el uso de sciki-learn así que por favor tengan paciencia conmigo.Visualizar un árbol de decisiones (ejemplo de scikit-learn)

yo estaba pasando por el ejemplo: http://scikit-learn.org/stable/modules/tree.html#tree

>>> from sklearn.datasets import load_iris 
>>> from sklearn import tree 
>>> iris = load_iris() 
>>> clf = tree.DecisionTreeClassifier() 
>>> clf = clf.fit(iris.data, iris.target) 
>>> from StringIO import StringIO 
>>> out = StringIO() 
>>> out = tree.export_graphviz(clf, out_file=out) 

Al parecer el archivo graphiz está listo para su uso.

Pero, ¿cómo dibujo el árbol usando el archivo graphiz? (el ejemplo no entró en detalles sobre cómo se dibuja el árbol).

¡El código de ejemplo y los consejos son más que bienvenidos!

Gracias!


actualización

estoy usando Ubuntu 12.04, Python 2.7.3

Respuesta

6

¿Qué sistema operativo se ejecuta? ¿Tiene graphviz instalado?

En su ejemplo, StringIO() objeto, contiene datos de graphviz, aquí es una manera de comprobar los datos:

... 
>>> print out.getvalue() 

digraph Tree { 
0 [label="X[2] <= 2.4500\nerror = 0.666667\nsamples = 150\nvalue = [ 50. 50. 50.]", shape="box"] ; 
1 [label="error = 0.0000\nsamples = 50\nvalue = [ 50. 0. 0.]", shape="box"] ; 
0 -> 1 ; 
2 [label="X[3] <= 1.7500\nerror = 0.5\nsamples = 100\nvalue = [ 0. 50. 50.]", shape="box"] ; 
0 -> 2 ; 
3 [label="X[2] <= 4.9500\nerror = 0.168038\nsamples = 54\nvalue = [ 0. 49. 5.]", shape="box"] ; 
2 -> 3 ; 
4 [label="X[3] <= 1.6500\nerror = 0.0407986\nsamples = 48\nvalue = [ 0. 47. 1.]", shape="box"] ; 
3 -> 4 ; 
5 [label="error = 0.0000\nsamples = 47\nvalue = [ 0. 47. 0.]", shape="box"] ; 
4 -> 5 ; 
6 [label="error = 0.0000\nsamples = 1\nvalue = [ 0. 0. 1.]", shape="box"] ; 
4 -> 6 ; 
7 [label="X[3] <= 1.5500\nerror = 0.444444\nsamples = 6\nvalue = [ 0. 2. 4.]", shape="box"] ; 
3 -> 7 ; 
8 [label="error = 0.0000\nsamples = 3\nvalue = [ 0. 0. 3.]", shape="box"] ; 
7 -> 8 ; 
9 [label="X[0] <= 6.9500\nerror = 0.444444\nsamples = 3\nvalue = [ 0. 2. 1.]", shape="box"] ; 
7 -> 9 ; 
10 [label="error = 0.0000\nsamples = 2\nvalue = [ 0. 2. 0.]", shape="box"] ; 
9 -> 10 ; 
11 [label="error = 0.0000\nsamples = 1\nvalue = [ 0. 0. 1.]", shape="box"] ; 
9 -> 11 ; 
12 [label="X[2] <= 4.8500\nerror = 0.0425331\nsamples = 46\nvalue = [ 0. 1. 45.]", shape="box"] ; 
2 -> 12 ; 
13 [label="X[0] <= 5.9500\nerror = 0.444444\nsamples = 3\nvalue = [ 0. 1. 2.]", shape="box"] ; 
12 -> 13 ; 
14 [label="error = 0.0000\nsamples = 1\nvalue = [ 0. 1. 0.]", shape="box"] ; 
13 -> 14 ; 
15 [label="error = 0.0000\nsamples = 2\nvalue = [ 0. 0. 2.]", shape="box"] ; 
13 -> 15 ; 
16 [label="error = 0.0000\nsamples = 43\nvalue = [ 0. 0. 43.]", shape="box"] ; 
12 -> 16 ; 
} 

se puede escribir como .dot file y producir la salida de imagen, como se muestra en la fuente se conectó:

$ dot -Tpng tree.dot -o tree.png (salida en formato PNG)

+0

¡Hola, gracias! Estoy usando Ubuntu 12.04, Python versión 2.7.3. Me preguntaba si de todos modos puedo hacerlo dentro del script python y no en la línea de comando. – DjangoRocks

+1

Claro, solo toma uno de los [enlaces de Python a graphviz] (https://www.google.com/search?q=python+graphviz+binding) y deberías poder hacerlo desde python shell – theta

+0

¡gracias! ¡eso fue útil! – DjangoRocks

4

¡Estuviste muy cerca! Solo hazlo:

graph_from_dot_data(out.getvalue()).write_pdf("somefile.pdf") 
+1

esto solo funcionará si #classes es lo suficientemente pequeño como para que las matrices nvalue en el texto no se rompan entre líneas ... en este caso tuve que buscar/reemplazar \ n manualmente con '' (preservando las legítimas, de por supuesto) ... un poco de dolor. Lo mismo ocurre con las etiquetas codificadas en caliente ... arrojarán errores de inmediato. – user1269942

Cuestiones relacionadas