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

Árbol de Decisión.-

Un árbol de decisión1​ es un modelo de predicción utilizado en diversos ámbitos que van desde la inteligencia artificial hasta la Economía. Dado un conjunto de datos se fabrican diagramas de construcciones lógicas, muy similares a los sistemas de predicción basados en reglas, que sirven para representar y categorizar una serie de condiciones que ocurren de forma sucesiva, para la resolución de un problema.

Elementos de un Árbol de decisión.-

Los árboles de decisión están formados por nodos, vectores de números, flechas y etiquetas.

Cada nodo se puede definir como el momento en el que se ha de tomar una decisión de entre varias posibles, lo que va haciendo que a medida que aumenta el número de nodos aumente el número de posibles finales a los que puede llegar el individuo. Esto hace que un árbol con muchos nodos sea complicado de dibujar a mano y de analizar debido a la existencia de numerosos caminos que se pueden seguir.

Los vectores de números serían la solución final a la que se llega en función de las diversas posibilidades que se tienen, dan las utilidades en esa solución.

Las flechas son las uniones entre un nodo y otro y representan cada acción distinta.

Las etiquetas se encuentran en cada nodo y cada flecha y dan nombre a cada acción.



Ejemplo Código Python


# Importar las bibliotecas necesarias
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn import metrics
from sklearn.tree import export_graphviz
import graphviz

# Cargar el conjunto de datos de ejemplo (puedes reemplazarlo con tu propio conjunto de datos)
# Aquí, estoy utilizando un conjunto de datos de clientes ficticios para propósitos ilustrativos
data = {
    'Edad': [25, 35, 45, 22, 28, 32, 50, 28, 40, 60],
    'Ingresos': [50000, 75000, 100000, 40000, 60000, 80000, 120000, 55000, 90000, 110000],
    'Deuda': [1000, 5000, 2000, 10000, 3000, 4000, 8000, 2000, 6000, 12000],
    'Clasificacion': ['No', 'No', 'No', 'No', 'No', 'Si', 'Si', 'No', 'Si', 'Si']
}

df = pd.DataFrame(data)

# Dividir el conjunto de datos en características (X) y etiquetas (y)
X = df[['Edad', 'Ingresos', 'Deuda']]
y = df['Clasificacion']

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

# Crear un modelo de árbol de decisión
model = DecisionTreeClassifier()

# Entrenar el modelo
model.fit(X_train, y_train)

# Realizar predicciones en el conjunto de prueba
y_pred = model.predict(X_test)

# Evaluar la precisión del modelo
accuracy = metrics.accuracy_score(y_test, y_pred)
print(f'Precisión del modelo: {accuracy:.2f}')

# Visualizar el árbol de decisión
dot_data = export_graphviz(model, out_file=None,
                           feature_names=X.columns,
                           class_names=model.classes_,
                           filled=True, rounded=True,
                           special_characters=True)

graph = graphviz.Source(dot_data)
graph.render("customer_tree")

# Imprimir la importancia de las características
feature_importance = model.feature_importances_
print('Importancia de las características:')
for i, feature in enumerate(X.columns):
    print(f'{feature}: {feature_importance[i]:.4f}')

# Realizar la poda del árbol
pruned_model = DecisionTreeClassifier(max_depth=3)
pruned_model.fit(X_train, y_train)

# Realizar predicciones en el conjunto de prueba con el árbol podado
y_pruned_pred = pruned_model.predict(X_test)

# Evaluar la precisión del modelo podado
pruned_accuracy = metrics.accuracy_score(y_test, y_pruned_pred)
print(f'Precisión del modelo podado: {pruned_accuracy:.2f}')

Precisión del modelo: 0.50 Importancia de las características: Edad: 0.0000 Ingresos: 0.6000 Deuda: 0.4000 Precisión del modelo podado: 0.50

Este código crea un árbol de decisión utilizando un conjunto de datos ficticio de

clientes. También incluye la visualización del árbol de decisión, la importancia de

las características y la poda del árbol para mejorar su generalización. Puedes adaptar este ejemplo a tu conjunto de datos específico.



# Cargar el conjunto de datos de ejemplo
data = {
    'Edad': [25, 35, 45, 22, 28, 32, 50, 28, 40, 60],
    'Ingresos': [50000, 75000, 100000, 40000, 60000, 80000, 120000, 55000, 90000, 110000],
    'Deuda': [1000, 5000, 2000, 10000, 3000, 4000, 8000, 2000, 6000, 12000],
    'Clasificacion': ['No', 'No', 'No', 'No', 'No', 'Si', 'Si', 'No', 'Si', 'Si']
}

df = pd.DataFrame(data)

# Dividir el conjunto de datos en características (X) y etiquetas (y)
X = df[['Edad', 'Ingresos', 'Deuda']]
y = df['Clasificacion']

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

# Crear un modelo de árbol de decisión
model = DecisionTreeClassifier()

# Entrenar el modelo
model.fit(X_train, y_train)

# Realizar predicciones en el conjunto de prueba
y_pred = model.predict(X_test)

# Crear la matriz de confusión
confusion_matrix = metrics.confusion_matrix(y_test, y_pred)

# Visualizar la matriz de confusión usando seaborn
plt.figure(figsize=(3, 3))
sns.heatmap(confusion_matrix, annot=True, fmt='g', cmap='Blues', cbar=False,
            xticklabels=model.classes_, yticklabels=model.classes_)
plt.xlabel('Predicho')
plt.ylabel('Verdadero')
plt.title('Matriz de Confusión')
plt.show()

Este código crea y visualiza la matriz de confusión para evaluar el rendimiento del modelo de árbol de decisión en el conjunto de prueba. La matriz de confusión muestra las predicciones correctas e incorrectas del modelo.

El método de árboles de decisión es una herramienta poderosa en el aprendizaje supervisado y ofrece varias ventajas y consideraciones:

Ventajas:

Interpretabilidad: Los árboles de decisión son fáciles de entender y visualizar. Puedes seguir las ramas del árbol para comprender el proceso de toma de decisiones.

Manejo automático de características: No es necesario realizar un escalamiento de características, y los árboles de decisión pueden manejar tanto características categóricas como numéricas sin requerir una transformación especial.

No linealidad: Los árboles de decisión pueden modelar relaciones no lineales en los datos.

Versatilidad: Se pueden utilizar tanto para problemas de clasificación como de regresión.

Consideraciones:

Sensibilidad a los datos: Pequeñas variaciones en los datos de entrenamiento pueden dar como resultado árboles de decisión diferentes. Esto puede llevar a modelos menos estables.

Sobreajuste: Los árboles de decisión pueden sobreajustarse fácilmente a los datos de entrenamiento, memorizando ruido en lugar de patrones genuinos. La poda del árbol y la limitación de la profundidad son estrategias para mitigar esto.

Complejidad: En conjuntos de datos grandes y complejos, los árboles de decisión pueden volverse muy complejos y difíciles de interpretar.

No considera interacciones entre características: En ciertos casos, los árboles de decisión pueden no capturar interacciones complejas entre características de manera efectiva.

Conclusión:

Los árboles de decisión son una herramienta valiosa en el arsenal de algoritmos de aprendizaje supervisado. Son especialmente útiles cuando se requiere interpretabilidad y se desea entender cómo se toman las decisiones en un modelo. Sin embargo, es importante tener en cuenta sus limitaciones y considerar estrategias como la poda y la validación cruzada para obtener un modelo más robusto y generalizable. En casos donde la complejidad del modelo es crítica, también se pueden explorar métodos de ensamblaje como bosques aleatorios o gradient boosting.


Comentarios

Entradas populares de este blog

Aplicación Práctica: Regresión Lineal (Aprendizaje Supervisado)

Aplicación Práctica: Naive Bayes (Aprendizaje Supervisado)