Árboles de decisión en Python

Árboles de decisión en Python

10 julio 2023 1 Por Alvaro

En el campo del machine learning, los árboles de decisión son un algoritmo ampliamente utilizado para la clasificación y regresión de datos. Son modelos predictivos que utilizan una estructura similar a un árbol para tomar decisiones basadas en características o atributos de los datos de entrada. En este artículo, exploraremos en detalle cómo funcionan los árboles de decisión y cómo implementarlos en Python. Se pueden utilizar tanto para problemas de clasificación como de regresión.

¿Qué son los árboles de decisión?

Un árbol de decisión es una estructura de datos compuesta por nodos que representan decisiones o acciones, y ramas que representan las posibles consecuencias de esas decisiones. En el contexto del machine learning, un árbol de decisión se construye a partir de un conjunto de datos de entrenamiento, donde cada instancia se caracteriza por un conjunto de atributos y una etiqueta de clase.

El objetivo principal de un árbol de decisión es aprender reglas o patrones en los datos que permitan predecir la etiqueta de clase de nuevas instancias. Para lograrlo, el árbol se construye de forma recursiva dividiendo el conjunto de datos en subconjuntos más pequeños utilizando diferentes atributos como criterios de división. Estos atributos se seleccionan de acuerdo a la medida de impureza o ganancia de información que proporcionan.

Implementación de árboles de decisión en Python

Python cuenta con diversas bibliotecas y frameworks que facilitan la implementación de árboles de decisión. Una de las bibliotecas más populares es scikit-learn, que ofrece una amplia gama de algoritmos de machine learning. A continuación, presentaremos un ejemplo de cómo implementar un árbol de decisión utilizando scikit-learn:

# Importar las bibliotecas necesarias
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import accuracy_score

# Cargar el conjunto de datos de ejemplo (iris)
iris = datasets.load_iris()
X = iris.data
y = iris.target

# Dividir el conjunto de datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear el modelo de árbol de decisión
clf = DecisionTreeClassifier()

# Entrenar el modelo con los datos de entrenamiento
clf.fit(X_train, y_train)

# Realizar predicciones en los datos de prueba
y_pred = clf.predict(X_test)

# Calcular la precisión del modelo
accuracy = accuracy_score(y_test, y_pred)
print("Precisión:", accuracy)
<span class="hljs-comment"># Visualizar el árbol de decisión</span> plot_tree(clf)

En este ejemplo, estamos utilizando el conjunto de datos de ejemplo «iris» de scikit-learn, que consiste en la clasificación de diferentes especies de iris. Primero, cargamos el conjunto de datos y lo dividimos en conjuntos de entrenamiento y prueba. Luego, creamos una instancia de la clase DecisionTreeClassifier para representar nuestro árbol de decisión. A continuación, entrenamos el modelo utilizando los datos de entrenamiento y realizamos predicciones en los datos de prueba. Finalmente, calculamos la precisión del modelo comparando las etiquetas predichas con las etiquetas reales.

Cortes en un árbol de decisión:

Los árboles de decisión se construyen mediante una serie de cortes o divisiones del conjunto de datos en subconjuntos más pequeños. Estas divisiones se realizan de manera iterativa utilizando un atributo específico y un criterio de división. Veamos los pasos involucrados en el proceso de corte de un árbol de decisión:

  1. Selección del atributo y criterio de división: En cada paso, se selecciona un atributo para realizar la división del conjunto de datos. Para tomar esta decisión, se utilizan diferentes criterios como la ganancia de información, la reducción de la impureza de Gini o la ganancia de Gini. Estos criterios evalúan qué atributo tiene el mayor impacto en la clasificación o la regresión.
  2. Cálculo del criterio de división: Una vez seleccionado el atributo, se evalúa cómo dividir los datos utilizando el criterio de división elegido. Por ejemplo, en el caso de la ganancia de información, se calcula la ganancia de información obtenida al dividir los datos según diferentes valores del atributo seleccionado. Se elige el valor que maximice la ganancia de información.
  3. Creación de un nodo hijo: Una vez determinado el valor óptimo para dividir los datos, se crea un nuevo nodo hijo correspondiente a esa división. Cada nodo representa una regla o condición que se utiliza para clasificar o predecir los datos.
  4. Repetición del proceso: Los pasos anteriores se repiten de forma recursiva para cada uno de los nodos hijos, dividiendo los subconjuntos de datos hasta alcanzar un criterio de parada. Esto puede ser cuando se alcanza una profundidad máxima predefinida, cuando todos los datos en un nodo tienen la misma etiqueta de clase, o cuando se cumple algún otro criterio de detención.

Supongamos que tenemos un conjunto de datos de clasificación de flores con tres atributos: longitud del pétalo, ancho del pétalo y tipo de suelo. Queremos construir un árbol de decisión para clasificar las flores en tres categorías: rosa, lirio y tulipán.

En el primer paso, seleccionamos el atributo que mejor discrimine las clases. Supongamos que la longitud del pétalo es el atributo seleccionado. Calculamos la ganancia de información obtenida al dividir los datos según diferentes longitudes del pétalo y elegimos el valor que maximice esta ganancia.

Digamos que encontramos que una longitud del pétalo de 4.7 cm es la mejor división inicial. Creamos un nodo hijo correspondiente a esta división y continuamos el proceso para cada subconjunto de datos resultante.

En el segundo paso, seleccionamos el siguiente atributo más discriminante en cada subconjunto de datos. Digamos que encontramos que el ancho del pétalo es el atributo más discriminante en el primer subconjunto y el tipo de suelo es el atributo más discriminante en el segundo subconjunto.

Repetimos este proceso recursivamente para cada nodo hijo hasta que se cumpla el criterio de parada. Por ejemplo, podemos detenernos cuando alcanzamos una profundidad máxima predefinida o cuando todos los datos en un nodo tienen la misma etiqueta de clase.

Al finalizar este proceso, obtenemos un árbol de decisión que representa las reglas para clasificar las flores en las diferentes categorías.

Recuerda que los ejemplos y criterios de división utilizados pueden variar según el algoritmo de árbol de decisión y el objetivo del problema. Los árboles de decisión son altamente personalizables y se pueden ajustar según las necesidades del problema específico.

árbol de decisión

zonas de corte

Conclusiones

Los árboles de decisión son una poderosa técnica en el campo del machine learning, ya que proporcionan una representación clara y comprensible de las reglas de decisión aprendidas a partir de los datos. Además, la implementación de árboles de decisión en Python es relativamente sencilla gracias a bibliotecas como scikit-learn.

En resumen, los árboles de decisión son algoritmos versátiles que se utilizan tanto para la clasificación como para la regresión en machine learning. Con su estructura de árbol y criterios de división, permiten tomar decisiones basadas en características o atributos de los datos de entrada. Al implementar árboles de decisión en Python, es posible aprovechar el poder del machine learning para resolver una amplia gama de problemas.

Si te ha sido de utilidad este post, te agradecería que me apoyases en Patreon (donando una cantidad aunque sea poca ya sea una vez, o apoyándome mensualmente). Tener una web, dominio, hosting, no es gratis y me apoyas a seguir ayudando con la difusión de educación libre. Apóyame en Patreon! Mil gracias!!

¿Te ha parecido útil este artículo?