sklearn forest export_graphviz example decision clustering classifier python numpy scipy scikit-learn decision-tree

python - forest - cómo explicar el árbol de decisiones de scikit-learn



random forest sklearn (3)

Tengo dos problemas para entender el resultado del árbol de decisiones de scikit-learn. Por ejemplo, este es uno de mis árboles de decisión:

Mi pregunta es ¿cómo puedo usar el árbol?

La primera pregunta es que: si una muestra cumple con la condición, entonces va a la rama IZQUIERDA (si existe), de lo contrario va a la DERECHA . En mi caso, si una muestra con X [7]> 63521.3984. Luego la muestra irá al recuadro verde. ¿Correcto?

La segunda pregunta es que: cuando una muestra llega al nodo hoja, ¿cómo puedo saber a qué categoría pertenece? En este ejemplo, tengo tres categorías para clasificar. En el cuadro rojo, hay 91, 212 y 113 muestras que cumplen la condición, respectivamente. Pero ¿cómo puedo decidir la categoría? Sé que hay una función clf.predict (muestra) para indicar la categoría. ¿Puedo hacer eso desde el gráfico? Muchas gracias.


De acuerdo con el libro "Learning scikit-learn: Machine Learning en Python", el árbol de decisiones representa una serie de decisiones basadas en los datos de entrenamiento.

! ( http://i.imgur.com/vM9fJLy.png )

Para clasificar una instancia, debemos responder la pregunta en cada nodo. Por ejemplo, ¿es el sexo <= 0.5? (estamos hablando de una mujer?). Si la respuesta es sí, vaya al nodo secundario izquierdo en el árbol; De lo contrario, vaya al nodo secundario derecho . Sigues respondiendo preguntas (¿estaba en la tercera clase? ¿Estaba en la primera clase? ¿Tenía menos de 13 años?), Hasta que alcanzas una hoja. Cuando está allí, la predicción corresponde a la clase objetivo que tiene la mayoría de las instancias .


La línea de value en cada cuadro le indica cuántas muestras de ese nodo caen en cada categoría, en orden. Por eso, en cada recuadro, los números en value suman al número que se muestra en la sample . Por ejemplo, en su caja roja, 91 + 212 + 113 = 416. Entonces, esto significa que si llega a este nodo, había 91 puntos de datos en la categoría 1, 212 en la categoría 2 y 113 en la categoría 3.

Si fuera a predecir el resultado para un nuevo punto de datos que alcanzó esa hoja en el árbol de decisión, predeciría la categoría 2, porque esa es la categoría más común para las muestras en ese nodo.


Primera pregunta: Sí, tu lógica es correcta. El nodo izquierdo es Verdadero y el nodo derecho es Falso. Esto puede ser contraintuitivo; true puede equipararse a una muestra más pequeña.

Segunda pregunta: este problema se resuelve mejor visualizando el árbol como un gráfico con pydotplus. El atributo ''nombres de clase'' de tree.export_graphviz () agregará una declaración de clase a la clase mayoritaria de cada nodo. El código se ejecuta en un cuaderno iPython.

from sklearn.datasets import load_iris from sklearn import tree iris = load_iris() clf2 = tree.DecisionTreeClassifier() clf2 = clf2.fit(iris.data, iris.target) with open("iris.dot", ''w'') as f: f = tree.export_graphviz(clf, out_file=f) import os os.unlink(''iris.dot'') import pydotplus dot_data = tree.export_graphviz(clf2, out_file=None) graph2 = pydotplus.graph_from_dot_data(dot_data) graph2.write_pdf("iris.pdf") from IPython.display import Image dot_data = tree.export_graphviz(clf2, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, # leaves_parallel=True, special_characters=True) graph2 = pydotplus.graph_from_dot_data(dot_data) ## Color of nodes nodes = graph2.get_node_list() for node in nodes: if node.get_label(): values = [int(ii) for ii in node.get_label().split(''value = ['')[1].split('']'')[0].split('','')]; color = {0: [255,255,224], 1: [255,224,255], 2: [224,255,255],} values = color[values.index(max(values))]; # print(values) color = ''#{:02x}{:02x}{:02x}''.format(values[0], values[1], values[2]); # print(color) node.set_fillcolor(color ) # Image(graph2.create_png() )

En cuanto a la determinación de la clase en la hoja, su ejemplo no tiene hojas con una sola clase, como lo hace el conjunto de datos del iris. Esto es común y puede requerir un ajuste excesivo del modelo para lograr dicho resultado. Una distribución discreta de clases es el mejor resultado para muchos modelos con validación cruzada.

Disfruta el código!