Saltar al contenido principal

Tutorial de Clasificación en Árbol de Decisión en Python

En este tutorial, aprenderás Clasificación en Árbol de Decisión, medidas de selección de atributos y cómo construir y optimizar el Clasificador en Árbol de Decisión utilizando el paquete Python Scikit-learn.
29 ene 2024  · 12 min de lectura

Como responsable de marketing, quieres un conjunto de clientes que tengan más probabilidades de comprar tu producto. Así es como puedes ahorrar tu presupuesto de marketing encontrando a tu público. Como gestor de préstamos, tienes que identificar las solicitudes de préstamos arriesgadas para conseguir una tasa de impago de préstamos más baja. Este proceso de clasificación de los clientes en un grupo de clientes potenciales y no potenciales o de solicitudes de préstamo seguras o arriesgadas se conoce como problema de clasificación.

La clasificación es un proceso de dos pasos: un paso de aprendizaje y un paso de predicción. En el paso de aprendizaje, el modelo se desarrolla a partir de unos datos de entrenamiento dados. En el paso de predicción, el modelo se utiliza para predecir la respuesta a unos datos dados. Un árbol de decisión es uno de los algoritmos de clasificación más fáciles y populares utilizados para comprender e interpretar datos. Puede utilizarse tanto para problemas de clasificación como de regresión.

Mira y aprende más sobre la Clasificación del Árbol de Decisión en Python en este vídeo de nuestro curso.

El algoritmo del árbol de decisión

Un árbol de decisión es una estructura arbórea similar a un diagrama de flujo, en la que un nodo interno representa una característica (o atributo), la rama representa una regla de decisión y cada nodo hoja representa el resultado.

El nodo superior de un árbol de decisión se conoce como nodo raíz. Aprende a dividir en función del valor del atributo. Particiona el árbol de forma recursiva, llamada partición recursiva. Esta estructura en forma de organigrama te ayuda en la toma de decisiones. Es una visualización como un diagrama de flujo que imita fácilmente el pensamiento a nivel humano. Por eso los árboles de decisión son fáciles de entender e interpretar.

ejemplo de árbol de decisión para la prevención del infarto de miocardio

Imagen | Abid Ali Awan 

Un árbol de decisión es un algoritmo de ML de tipo caja blanca. Comparte la lógica interna de toma de decisiones, que no está disponible en el tipo de algoritmos de caja negra, como ocurre con una red neuronal. Su tiempo de entrenamiento es más rápido que el del algoritmo de la red neuronal.

La complejidad temporal de los árboles de decisión es función del número de registros y atributos de los datos dados. El árbol de decisión es un método sin distribución o no paramétrico que no depende de supuestos de distribución de probabilidad. Los árboles de decisión pueden manejar datos de alta dimensión con buena precisión.

¿Cómo funciona el algoritmo del árbol de decisión?

La idea básica de cualquier algoritmo de árbol de decisión es la siguiente:

  1. Selecciona el mejor atributo utilizando las Medidas de Selección de Atributos (MSA) para dividir los registros.
  2. Convierte ese atributo en un nodo de decisión y divide el conjunto de datos en subconjuntos más pequeños.
  3. Comienza la construcción del árbol repitiendo este proceso recursivamente para cada hijo hasta que una de las condiciones coincida:
    • Todas las tuplas pertenecen al mismo valor de atributo.
    • No quedan más atributos.
    • No hay más instancias.
¿Cómo funciona el algoritmo del árbol de decisión?

Medidas de selección de atributos

La medida de selección de atributos es una heurística para seleccionar el criterio de división que divide los datos de la mejor manera posible. También se conoce como reglas de división, porque nos ayuda a determinar los puntos de ruptura de las tuplas en un nodo determinado. La ASM proporciona un rango a cada característica (o atributo) explicando el conjunto de datos dado. El atributo con mejor puntuación se seleccionará como atributo de división(Fuente). En el caso de un atributo de valor continuo, también hay que definir los puntos de división de las ramas. Las medidas de selección más populares son la Ganancia de Información, el Coeficiente de Ganancia y el Índice de Gini.

Ganancia de información

Claude Shannon inventó el concepto de entropía, que mide la impureza del conjunto de entrada. En física y matemáticas, se denomina entropía a la aleatoriedad o impureza de un sistema. En teoría de la información, se refiere a la impureza de un grupo de ejemplos. La ganancia de información es la disminución de la entropía. La ganancia de información calcula la diferencia entre la entropía antes de la división y la entropía media después de la división del conjunto de datos en función de los valores de los atributos dados. El algoritmo de árbol de decisión ID3 (dicotomizador iterativo) utiliza la ganancia de información.

obtención de información

Donde Pi es la probabilidad de que una tupla arbitraria de D pertenezca a la clase Ci.

obtención de información
obtención de información

Dónde:

  • Info(D) es la cantidad media de información necesaria para identificar la etiqueta de clase de una tupla en D.
  • |Dj|/|D| actúa como peso de la j-ésima partición.
  • InfoA(D) es la información esperada necesaria para clasificar una tupla de D basándose en la partición por A.

El atributo A con la mayor ganancia de información, Ganancia(A), se elige como atributo de división en el nodo N().

Relación de ganancia

La ganancia de información está sesgada para el atributo con muchos resultados. Significa que prefiere el atributo con un gran número de valores distintos. Por ejemplo, considera un atributo con un identificador único, como id_cliente, que tiene info(D) cero debido a la partición pura. Esto maximiza la ganancia de información y crea una partición inútil.

C4.5, una mejora de ID3, utiliza una extensión de la ganancia de información conocida como relación de ganancia. La relación de ganancia trata el problema del sesgo normalizando la ganancia de información mediante Split Info. La implementación Java del algoritmo C4.5 se conoce como J48, que está disponible en la herramienta de minería de datos WEKA.

Relación de ganancia

Dónde:

  • |Dj|/|D| actúa como peso de la j-ésima partición.
  • v es el número de valores discretos del atributo A.

La relación de ganancia puede definirse como

Relación de ganancia

El atributo con la mayor relación de ganancia se elige como atributo de división(Fuente).

Índice Gini

Otro algoritmo de árbol de decisión CART (Árbol de Clasificación y Regresión) utiliza el método de Gini para crear puntos de división.

Índice Gini

Donde pi es la probabilidad de que una tupla de D pertenezca a la clase Ci.

El Índice de Gini considera una división binaria para cada atributo. Puedes calcular una suma ponderada de la impureza de cada partición. Si una división binaria sobre el atributo A divide los datos D en D1 y D2, el índice de Gini de D es:

Índice Gini

En el caso de un atributo de valor discreto, se selecciona como atributo de división el subconjunto que da el índice de gini mínimo para ese elegido. En el caso de los atributos de valor continuo, la estrategia consiste en seleccionar cada par de valores adyacentes como posible punto de división, y se elige como punto de división el que tenga un índice de gini menor.

índice gini

El atributo con el índice de Gini mínimo se elige como atributo de división.

Empieza a aprender Python gratis

Machine Learning with Tree-Based Models in Python

BeginnerSkill Level
5 hr
92.2K learners
In this course, you'll learn how to use tree-based models and ensembles for regression and classification using scikit-learn.
See DetailsRight Arrow

Ejecute y edite el código de este tutorial en línea

Ejecutar código

Construcción de Clasificadores de Árboles de Decisión en Scikit-learn

Importar bibliotecas necesarias

Primero vamos a cargar las bibliotecas necesarias.

# Load libraries
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation

Carga de datos

En primer lugar, carguemos el conjunto de datos necesario sobre la diabetes de los indios Pima utilizando la función de lectura CSV de pandas. Puedes descargar el conjunto de datos de Kaggle para seguirlo.

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("diabetes.csv", header=None, names=col_names)
pima.head()
  embarazada glucose bp skin insulin bmi pedigrí edad etiqueta
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

Selección de características

Aquí, tienes que dividir las columnas dadas en dos tipos de variables: dependiente (o variable objetivo) e independiente (o variables características).

#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

Dividir datos

Para comprender el rendimiento del modelo, dividir el conjunto de datos en un conjunto de entrenamiento y un conjunto de prueba es una buena estrategia.

Vamos a dividir el conjunto de datos utilizando la función train_test_split(). Tienes que pasar tres parámetros características; objetivo, y tamaño del conjunto_prueba.

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 70% training and 30% test

Construir el modelo de árbol de decisión

Vamos a crear un modelo de árbol de decisión utilizando Scikit-learn.

# Create Decision Tree classifer object
clf = DecisionTreeClassifier()

# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = clf.predict(X_test)

Evaluación del modelo

Estimemos la precisión con la que el clasificador o modelo puede predecir el tipo de cultivares.

La precisión puede calcularse comparando los valores reales del conjunto de pruebas y los valores predichos.

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.6753246753246753

Obtuvimos un índice de clasificación del 67,53%, lo que se considera una buena precisión. Puedes mejorar esta precisión ajustando los parámetros del algoritmo del árbol de decisión.

Visualizar árboles de decisión

Puedes utilizar la función export_graphviz de Scikit-learn para visualizar el árbol dentro de un cuaderno Jupyter. Para trazar el árbol, también necesitas instalar graphviz y pydotplus.

pip install graphviz

pip install pydotplus

La función export_graphviz convierte el clasificador del árbol de decisión en un archivo dot, y pydotplus convierte este archivo dot en png o en una forma visualizable en Jupyter.

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('diabetes.png')
Image(graph.create_png())
Visualizar árboles de decisión

En el gráfico del árbol de decisión, cada nodo interno tiene una regla de decisión que divide los datos. Gini, denominado ratio de Gini, mide la impureza del nodo. Se puede decir que un nodo es puro cuando todos sus registros pertenecen a la misma clase, este tipo de nodos se conoce como nodo hoja.

Aquí, el árbol resultante no está podado. Este árbol sin podar es inexplicable y no es fácil de entender. En la siguiente sección, vamos a optimizarlo mediante la poda.

Optimizar el rendimiento del árbol de decisión

  • criterio : opcional (por defecto="gini") o Elegir medida de selección de atributos. Este parámetro nos permite utilizar la medida de selección de atributos diferente-diferente. Los criterios admitidos son "gini" para el índice de Gini y "entropía" para la ganancia de información.

  • divisor : cadena, opcional (por defecto="mejor") o Estrategia de división. Este parámetro nos permite elegir la estrategia de división. Las estrategias admitidas son "mejor" para elegir la mejor división y "aleatoria" para elegir la mejor división aleatoria.

  • max_depth : int o None, opcional (por defecto=None) o Profundidad máxima de un árbol. La profundidad máxima del árbol. Si es Ninguno, los nodos se expanden hasta que todas las hojas contengan menos muestras que min_muestras_split. Un valor más alto de la profundidad máxima provoca un sobreajuste, y un valor más bajo, un infraajuste(Fuente).

En Scikit-learn, la optimización del clasificador de árbol de decisión se realiza sólo mediante la prepoda. La profundidad máxima del árbol puede utilizarse como variable de control para la prepoda. En el siguiente ejemplo, puedes trazar un árbol de decisión sobre los mismos datos con profundidad_máxima=3. Además de los parámetros de prepoda, también puedes probar otras medidas de selección de atributos, como la entropía.

# Create Decision Tree classifer object
clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)

# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = clf.predict(X_test)

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.7705627705627706

Pues bien, el índice de clasificación aumentó hasta el 77,05%, lo que supone una mayor precisión que el modelo anterior.

Visualizar árboles de decisión

Hagamos que nuestro árbol de decisión sea un poco más fácil de entender utilizando el siguiente código: 

from six import StringIO from IPython.display import Image from sklearn.tree import export_graphviz 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('diabetes.png') Image(graph.create_png())

Aquí, hemos completado los siguientes pasos: 

  • Importa las bibliotecas necesarias.
  • Creado un StringIO objeto llamado dot_data para guardar la representación textual del árbol de decisión.
  • Exportar el árbol de decisión al dot utilizando el formato export_graphviz y escribe la salida en la función dot_data tampón.
  • Creado un pydotplus objeto gráfico del dot formato de representación del árbol de decisión almacenado en el dot_data tampón.
  • Escribe el gráfico generado en un archivo PNG llamado "diabetes.png".
  • Visualiza la imagen PNG generada del árbol de decisión utilizando la función Image del objeto IPython.display módulo.
Visualizar árboles de decisión

Como puedes ver, este modelo podado es menos complejo, más explicable y más fácil de entender que el anterior diagrama del modelo de árbol de decisión.

Profesionales del árbol de decisión

  • Los árboles de decisión son fáciles de interpretar y visualizar.
  • Puede captar fácilmente patrones no lineales.
  • Requiere menos preprocesamiento de datos por parte del usuario, por ejemplo, no es necesario normalizar las columnas.
  • Puede utilizarse para la ingeniería de rasgos, como la predicción de valores perdidos, adecuada para la selección de variables.
  • El árbol de decisión no tiene suposiciones sobre la distribución debido a la naturaleza no paramétrica del algoritmo. (Fuente)

Contras del árbol de decisión

  • Sensible a los datos ruidosos. Puede sobreajustar datos ruidosos.
  • La pequeña variación (o varianza) de los datos puede dar lugar a un árbol de decisión diferente. Esto puede reducirse mediante algoritmos de bagging y boosting.
  • Los árboles de decisión están sesgados con un conjunto de datos desequilibrado, por lo que se recomienda equilibrar el conjunto de datos antes de crear el árbol de decisión.

Conclusión

Enhorabuena, ¡has llegado al final de este tutorial!

En este tutorial, has cubierto muchos detalles sobre los árboles de decisión; cómo funcionan, medidas de selección de atributos como la Ganancia de Información, el Coeficiente de Ganancia y el Índice de Gini, construcción de modelos de árboles de decisión, visualización y evaluación de un conjunto de datos de diabetes utilizando el paquete Scikit-learn de Python. También discutimos sus pros, sus contras y cómo optimizar el rendimiento del árbol de decisión mediante el ajuste de parámetros.

Esperamos que ahora puedas utilizar el algoritmo del árbol de decisión para analizar tus propios conjuntos de datos.

Si quieres aprender más sobre Aprendizaje Automático en Python, sigue el curso Aprendizaje Automático con Modelos Basados en Árboles en Python de DataCamp.

Consulta nuestro tutorial de Kaggle en : Tu primer modelo de aprendizaje automático.

Temas

Cursos de Python

curso

Introduction to Python

4 hr
5.7M
Master the basics of data analysis with Python in just four hours. This online course will introduce the Python interface and explore popular packages.
Ver detallesRight Arrow
Comienza El Curso
Ver másRight Arrow
Relacionado

tutorial

Tutorial de clasificación Naive Bayes con Scikit-learn

Aprende a construir y evaluar un Clasificador Naive Bayes utilizando el paquete Scikit-learn de Python.
Abid Ali Awan's photo

Abid Ali Awan

13 min

tutorial

Aprendizaje automático de datos categóricos con el tutorial de Python

Aprenda los trucos más comunes para manejar datos categóricos y preprocesarlos para construir modelos de aprendizaje automático.
Moez Ali's photo

Moez Ali

28 min

tutorial

Introducción a k-Means Clustering con scikit-learn en Python

En este tutorial, aprenda a aplicar k-Means Clustering con scikit-learn en Python

Kevin Babitz

21 min

tutorial

Tutorial sobre el uso de XGBoost en Python

Descubre la potencia de XGBoost, uno de los marcos de machine learning más populares entre los científicos de datos, con este tutorial paso a paso en Python.
Bekhruz Tuychiev's photo

Bekhruz Tuychiev

16 min

tutorial

Clasificación de bosques aleatorios con Scikit-Learn

Este artículo trata de cómo y cuándo utilizar la clasificación Random Forest con scikit-learn. Centrado en conceptos, flujo de trabajo y ejemplos. También veremos cómo utilizar la matriz de confusión y las importancias de las características.
Adam Shafi's photo

Adam Shafi

14 min

tutorial

Comprender la regresión logística en el tutorial de Python

Aprende sobre la regresión logística, sus propiedades básicas, y construye un modelo de machine learning sobre una aplicación del mundo real en Python.
Avinash Navlani's photo

Avinash Navlani

10 min

See MoreSee More