Algoritmos de clasificación: árbol de decisión

Introducción al árbol de decisiones

En general, el análisis del árbol de decisiones es una herramienta de modelado predictivo que se puede aplicar en muchas áreas. Los árboles de decisión se pueden construir mediante un enfoque algorítmico que puede dividir el conjunto de datos de diferentes maneras en función de diferentes condiciones. Las decisiones tress son los algoritmos más poderosos que se incluyen en la categoría de algoritmos supervisados.

Se pueden utilizar para tareas de clasificación y regresión. Las dos entidades principales de un árbol son los nodos de decisión, donde los datos se dividen y se van, donde obtuvimos el resultado. A continuación se muestra el ejemplo de un árbol binario para predecir si una persona está en forma o no, proporcionando información diversa como la edad, los hábitos alimentarios y los hábitos de ejercicio:

En el árbol de decisiones anterior, la pregunta son los nodos de decisión y los resultados finales son las hojas. Tenemos los siguientes dos tipos de árboles de decisión:

  • Classification decision trees- En este tipo de árboles de decisión, la variable de decisión es categórica. El árbol de decisión anterior es un ejemplo de árbol de decisión de clasificación.

  • Regression decision trees - En este tipo de árboles de decisión, la variable de decisión es continua.

Implementación del algoritmo de árbol de decisión

Índice de Gini

Es el nombre de la función de costo que se usa para evaluar las divisiones binarias en el conjunto de datos y trabaja con la variable objetivo categorial "Éxito" o "Fallo".

A mayor valor del índice de Gini, mayor homogeneidad. Un valor de índice de Gini perfecto es 0 y el peor es 0,5 (para un problema de 2 clases). El índice de Gini para una división se puede calcular con la ayuda de los siguientes pasos:

  • Primero, calcule el índice de Gini para los subnodos utilizando la fórmula p ^ 2 + q ^ 2, que es la suma del cuadrado de probabilidad de éxito y fracaso.

  • A continuación, calcule el índice de Gini para la división utilizando la puntuación de Gini ponderada de cada nodo de esa división.

El algoritmo del árbol de clasificación y regresión (CART) utiliza el método Gini para generar divisiones binarias.

Creación dividida

Básicamente, una división incluye un atributo en el conjunto de datos y un valor. Podemos crear una división en el conjunto de datos con la ayuda de las siguientes tres partes:

  • Part1: Calculating Gini Score - Acabamos de discutir esta parte en la sección anterior.

  • Part2: Splitting a dataset- Puede definirse como la separación de un conjunto de datos en dos listas de filas que tienen el índice de un atributo y un valor dividido de ese atributo. Después de obtener los dos grupos, derecho e izquierdo, del conjunto de datos, podemos calcular el valor de la división utilizando la puntuación de Gini calculada en la primera parte. El valor dividido decidirá en qué grupo residirá el atributo.

  • Part3: Evaluating all splits- La siguiente parte después de encontrar la puntuación de Gini y dividir el conjunto de datos es la evaluación de todas las divisiones. Para este propósito, primero, debemos verificar cada valor asociado con cada atributo como una división candidata. Luego, necesitamos encontrar la mejor división posible evaluando el costo de la división. La mejor división se utilizará como nodo en el árbol de decisiones.

Construyendo un árbol

Como sabemos, un árbol tiene un nodo raíz y nodos terminales. Después de crear el nodo raíz, podemos construir el árbol siguiendo dos partes:

Parte 1: Creación de nodo terminal

Al crear nodos terminales del árbol de decisión, un punto importante es decidir cuándo dejar de hacer crecer el árbol o crear más nodos terminales. Se puede hacer utilizando dos criterios, a saber, la profundidad máxima del árbol y los registros mínimos de nodos de la siguiente manera:

  • Maximum Tree Depth- Como sugiere el nombre, este es el número máximo de nodos en un árbol después del nodo raíz. Debemos dejar de agregar nodos terminales una vez que un árbol alcanza la profundidad máxima, es decir, una vez que un árbol tiene el número máximo de nodos terminales.

  • Minimum Node Records- Puede definirse como el número mínimo de patrones de entrenamiento de los que es responsable un nodo determinado. Debemos dejar de agregar nodos terminales una vez que el árbol alcance estos registros de nodos mínimos o por debajo de este mínimo.

El nodo terminal se utiliza para hacer una predicción final.

Parte 2: División recursiva

Como entendimos sobre cuándo crear nodos terminales, ahora podemos comenzar a construir nuestro árbol. La división recursiva es un método para construir el árbol. En este método, una vez que se crea un nodo, podemos crear los nodos secundarios (nodos agregados a un nodo existente) de forma recursiva en cada grupo de datos, generados al dividir el conjunto de datos, llamando a la misma función una y otra vez.

Predicción

Después de construir un árbol de decisiones, necesitamos hacer una predicción al respecto. Básicamente, la predicción implica navegar por el árbol de decisiones con la fila de datos proporcionada específicamente.

Podemos hacer una predicción con la ayuda de la función recursiva, como se hizo anteriormente. La misma rutina de predicción se vuelve a llamar con los nodos izquierdo o derecho secundario.

Supuestos

Las siguientes son algunas de las suposiciones que hacemos al crear el árbol de decisiones:

  • Mientras se preparan los árboles de decisión, el conjunto de entrenamiento es como nodo raíz.

  • El clasificador de árbol de decisión prefiere que los valores de las características sean categóricos. En caso de que desee utilizar valores continuos, debe hacerlo discretizado antes de la construcción del modelo.

  • Según los valores del atributo, los registros se distribuyen de forma recursiva.

  • El enfoque estadístico se utilizará para colocar atributos en cualquier posición de nodo, es decir, como nodo raíz o nodo interno.

Implementación en Python

Ejemplo

En el siguiente ejemplo, vamos a implementar el clasificador de árbol de decisiones en la diabetes de los indios Pima:

Primero, comience con la importación de los paquetes de Python necesarios:

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

A continuación, descargue el conjunto de datos de iris de su enlace web de la siguiente manera:

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv(r"C:\pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
pregnant    glucose  bp    skin  insulin  bmi   pedigree    age   label
0       6         148      72    35     0       33.6    0.627     50      1
1       1         85       66    29     0       26.6    0.351     31      0
2       8         183      64     0     0       23.3    0.672     32      1
3       1         89       66    23     94      28.1    0.167     21      0
4       0         137      40    35     168     43.1    2.288     33      1

Ahora, divida el conjunto de datos en características y variable de destino de la siguiente manera:

feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

A continuación, dividiremos los datos en tren y prueba. El siguiente código dividirá el conjunto de datos en un 70% de datos de entrenamiento y un 30% de datos de prueba:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

A continuación, entrene el modelo con la ayuda de la clase DecisionTreeClassifier de sklearn de la siguiente manera:

clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)

Por fin necesitamos hacer predicciones. Se puede hacer con la ayuda del siguiente script:

y_pred = clf.predict(X_test)

A continuación, podemos obtener la puntuación de precisión, la matriz de confusión y el informe de clasificación de la siguiente manera:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

Salida

Confusion Matrix:
[[116 30]
[ 46 39]]
Classification Report:
            precision   recall   f1-score    support
      0       0.72      0.79       0.75     146
      1       0.57      0.46       0.51     85
micro avg     0.67      0.67       0.67     231
macro avg     0.64      0.63       0.63     231
weighted avg  0.66      0.67       0.66     231

Accuracy: 0.670995670995671

Visualización del árbol de decisiones

El árbol de decisiones anterior se puede visualizar con la ayuda del siguiente código:

from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus

dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
      filled=True, rounded=True,
      special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('Pima_diabetes_Tree.png')
Image(graph.create_png())