5. Árboles de Decisión

 Aplicación Práctica: Árboles de Decisión (Aprendizaje Supervisado)



Enlace a Google Colab para ver nuestro código 

Los árboles de decisión son modelos de aprendizaje automático utilizados tanto para problemas de clasificación como de regresión. Se llaman así debido a su estructura similar a un árbol, compuesta por nodos, ramas y hojas.

  • Nodos: Representan características o atributos en los datos. En un árbol de decisión, cada nodo representa una pregunta o prueba sobre alguna característica.
  • Ramas: Conectan los nodos y representan el resultado de una prueba o una decisión tomada basada en una característica.
  • Nodos Hoja: Son los nodos terminales del árbol y representan una etiqueta o valor de salida, ya sea la clasificación en problemas de clasificación o el valor predicho en problemas de regresión.

El árbol se construye a partir de los datos de entrenamiento, donde el modelo busca la mejor característica para dividir los datos en subconjuntos más puros en términos de la variable objetivo. Este proceso se repite recursivamente para cada subconjunto, creando ramificaciones y nodos hasta que se alcanza un criterio de parada, como una profundidad máxima o un número mínimo de muestras en un nodo.

Para cada división, el árbol busca la característica que mejor separa las clases en el caso de la clasificación o que mejor reduce el error en el caso de la regresión. Los criterios comunes para tomar estas decisiones incluyen la ganancia de información, la entropía o el índice Gini, según el algoritmo utilizado.

Una vez construido, el árbol puede utilizarse para hacer predicciones sobre nuevos datos, donde cada instancia sigue el camino a través del árbol basado en sus características hasta llegar a un nodo hoja, que proporciona la predicción.


Los fundamentos clave de los árboles de decisiones son:

Estructura Jerárquica:

  • Nodos y Ramas: Un árbol consta de nodos, donde cada nodo representa una característica o atributo. Las ramas conectan los nodos y representan las posibles salidas de una característica.
  • Nodos Hoja: Son los nodos finales del árbol y contienen la etiqueta o valor de la variable objetivo.

Proceso de Decisión:

  • División de Datos: En cada nivel del árbol, se elige la característica que mejor divide los datos en subgrupos más puros posible, es decir, que maximiza la homogeneidad de la variable objetivo dentro de esos subgrupos.
  • Criterios de División: Los árboles de decisiones utilizan diversos criterios (como índice Gini, entropía o ganancia de información) para determinar la mejor manera de dividir los datos en cada nodo.

Predicciones y Generalización:

  • Clasificación y Predicción: Una vez construido el árbol, se utiliza para realizar predicciones sobre nuevas instancias. Estas instancias descienden por el árbol siguiendo las reglas de decisión aprendidas.
  • Generalización: El objetivo es que el árbol generalice bien los datos nuevos y desconocidos, evitando sobreajustarse (overfitting) a los datos de entrenamiento.

Interpretabilidad:

  • Explicabilidad: Los árboles de decisiones son modelos fácilmente interpretables y explicables. Sus reglas pueden entenderse intuitivamente, lo que los hace útiles para tomar decisiones basadas en datos y comunicar cómo se realizan estas decisiones.

Ventajas y Desafíos:

  • Ventajas: Fáciles de entender e interpretar, manejan datos numéricos y categóricos, requieren poco preprocesamiento y pueden manejar problemas de clasificación y regresión.
  • Desafíos: Tendencia al sobreajuste, sensibles a pequeñas variaciones en los datos y pueden no capturar relaciones complejas.

Los árboles de decisiones forman la base para algoritmos más avanzados, como Random Forests, Gradient Boosting y otros métodos ensemble, que combinan múltiples árboles para mejorar la precisión y la generalización.


Poda del árbol:

  1. Control del sobreajuste (overfitting):

    • Los árboles de decisiones tienden a ajustarse demasiado a los datos de entrenamiento, memorizando el ruido y perdiendo generalización en nuevos datos.
    • La poda es un proceso para evitar el sobreajuste al restringir o eliminar algunas ramas del árbol que no son informativas o redundantes.
  2. Mejora de la generalización:

    • La poda puede mejorar la capacidad del modelo para generalizar bien en datos no vistos al simplificar la estructura del árbol.
    • Permite construir un modelo más sencillo que aún capture las tendencias esenciales en los datos.
  3. Hiperparámetros de poda:

    • Los hiperparámetros de poda (como la profundidad máxima del árbol, el número mínimo de muestras por hoja, la complejidad del árbol, etc.) controlan el proceso de poda.
    • Ajustar estos hiperparámetros es crucial para encontrar el equilibrio entre la complejidad del árbol y la capacidad de generalización.

En resumen, comprender la importancia de las características ayuda a mejorar la calidad de las predicciones y la interpretación del modelo, mientras que la poda es fundamental para evitar el sobreajuste y mejorar la generalización del modelo de árbol de decisiones.



Ejemplo de construcción de un árbol de decisión en Python:

Supongamos que tienes un conjunto de datos ficticios llamado datos_educativos con características como "Edad", "Nivel_Educativo", "Horas_Estudio", y una columna de destino "Rendimiento" que indica si un estudiante tiene un rendimiento "Alto", "Medio" o "Bajo".

from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Supongamos que tienes tus datos en un DataFrame llamado datos_educativos
# Cargar el conjunto de datos
# Reemplaza este bloque de código con la carga de tus datos reales

# Crear datos ficticios para demostración
np.random.seed(42)
num_students = 1000

edad = np.random.randint(15, 25, num_students)
nivel_educativo = np.random.randint(1, 5, num_students)
horas_estudio = np.random.uniform(1, 10, num_students)

rendimiento = np.random.choice(['Bajo', 'Medio', 'Alto'], num_students)

datos_educativos = pd.DataFrame({
    'Edad': edad,
    'Nivel_Educativo': nivel_educativo,
    'Horas_Estudio': horas_estudio,
    'Rendimiento': rendimiento
})

# Separar características y etiquetas
X = datos_educativos.drop('Rendimiento', axis=1)
y = datos_educativos['Rendimiento']

# Dividir 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 y entrenar el modelo de árbol de decisiones
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)

# Evaluar el modelo
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Precisión del modelo: {accuracy}")

# Mostrar el reporte de clasificación
print(classification_report(y_test, y_pred))

# Visualización del árbol de decisiones
plt.figure(figsize=(12, 8))
plot_tree(model, feature_names=X.columns, class_names=sorted(y.unique()), filled=True)
plt.title("Árbol de Decisiones para Predicción de Rendimiento")
plt.show()

Resultado obtenido: 

Precisión del modelo: 0.355 precision recall f1-score support Alto 0.35 0.11 0.16 74 Bajo 0.35 0.85 0.50 72 Medio 0.40 0.04 0.07 54 accuracy 0.36 200 macro avg 0.37 0.33 0.24 200 weighted avg 0.36 0.35 0.26 200



Análisis de resultado

Este código asume que tienes un DataFrame llamado datos_educativos con las características "Edad", "Nivel_Educativo" y "Horas_Estudio", y una columna objetivo "Rendimiento".

Reemplaza la sección de la generación de datos ficticios con la carga de tus propios datos. El modelo de árbol de decisiones se entrena con esos datos y se muestra la precisión del modelo y el reporte de clasificación. Además, se visualiza el árbol de decisiones resultante para entender cómo se toman las decisiones de clasificación.

Enlace a Google Colab para ver nuestro código 



Comentarios

Entradas populares de este blog

4. Regresión Logística (Aprendizaje Supervisado)