040 — Árboles de decisión y reglas interpretables
Parte: 03 — Machine learning clásico
Nivel: intermedio · Horas estimadas: 6
Laboratorio: ml · Estado: EXECUTABLE_CORE
🎯 Propósito
Comprender árboles de decisión y reglas interpretables dentro de la evolución de la inteligencia artificial, implementar un experimento mínimo verificable y distinguir qué parte constituye evidencia frente a una afirmación todavía no comprobada.
📚 Resultados de aprendizaje
Al finalizar podrás:
- Explicar árboles de decisión y reglas interpretables usando los conceptos
árboles,impureza,poda,reglas. - Ejecutar el laboratorio con una semilla explícita y revisar su contrato JSON.
- Identificar al menos un supuesto, una limitación y un riesgo de aplicación.
- Comparar el enfoque con la etapa anterior de la ruta de aprendizaje.
- Producir una evidencia reproducible y una conclusión que no exceda los datos.
🧩 Conceptos centrales
árboles, impureza, poda, reglas
🗺️ Ubicación en el mapa de la IA
Los árboles de decisión (CART de Breiman et al. 1984; ID3/C4.5 de Quinlan) unen dos tradiciones del programa: heredan de la IA simbólica (parte 01) la representación por reglas legibles, pero las inducen desde datos en lugar de escribirlas a mano. Son el modelo no lineal interpretable de referencia y la pieza básica de los ensembles de la clase siguiente (random forest, boosting), que dominan el ML tabular hasta hoy. Su sesgo inductivo — particiones alineadas a los ejes — explica tanto su legibilidad como sus límites.
📖 Fundamentos
🌳 Qué es un árbol de decisión
Un árbol particiona recursivamente el espacio de features en regiones rectangulares
mediante preguntas binarias del tipo xⱼ ≤ t. Cada hoja predice la clase mayoritaria (o
la media, en regresión) de los ejemplos de entrenamiento que caen en ella. Todo camino
raíz→hoja es una regla legible: SI atrasos ≤ 2 Y antigüedad > 3 ENTONCES aprueba.
🧪 Impureza: qué pregunta elegir
El algoritmo es voraz: en cada nodo prueba todos los splits posibles y elige el que más reduce la impureza de los hijos. Para un nodo con proporciones de clase p₁,…,p_k:
Gini: G = 1 − Σₖ pₖ² (0 = puro; máx 0.5 en binario balanceado)
Entropía: H = −Σₖ pₖ log₂ pₖ (0 = puro; máx 1 bit en binario balanceado)
La ganancia de un split que separa el nodo padre (n ejemplos) en hijos L (n_L) y R (n_R):
Δ = I(padre) − (n_L/n)·I(L) − (n_R/n)·I(R)
Gini y entropía eligen casi siempre el mismo split (Gini es más barata de computar; la entropía penaliza algo más los nodos mixtos). En regresión, la impureza es la varianza del target en el nodo. El algoritmo se detiene por profundidad máxima, mínimo de ejemplos por hoja, o ganancia mínima.
✂️ Sobreajuste y poda
Un árbol sin restricciones crece hasta hojas puras: memoriza el train (accuracy 1.0) y generaliza mal — es un modelo de baja sesgo y alta varianza: cambiar pocos ejemplos puede cambiar el split raíz y con él todo el árbol. Dos remedios:
- Pre-poda (early stopping): limitar
max_depth,min_samples_leaf,min_impurity_decreasedurante la construcción. Barato, pero puede detenerse antes de un split que solo rinde combinado con el siguiente (efecto XOR). - Post-poda por costo-complejidad (CART): crecer el árbol completo y luego minimizar
R_α(T) = R(T) + α·|hojas(T)|, donde R(T) es el error y α ≥ 0 el precio por hoja. Al aumentar α se colapsan primero las ramas que menos aportan; α se elige por validación cruzada. Es la poda deccp_alphaen scikit-learn.
📜 Reglas interpretables y sus condiciones
La interpretabilidad del árbol es real pero condicionada: (a) vale para árboles pequeños (≤ ~7 niveles; con 50 hojas nadie "lee" el modelo); (b) la importancia de features por reducción de impureza está sesgada hacia variables con muchos valores posibles y se reparte arbitrariamente entre features correlacionadas; (c) las reglas son fieles al modelo, no al fenómeno: describen cómo decide el árbol, no por qué ocurre el resultado.
🧮 Ejemplo trabajado
Nodo raíz con 10 solicitudes de crédito: 6 aprobadas (A) y 4 rechazadas (R).
Gini(raíz) = 1 − (0.6² + 0.4²) = 1 − 0.52 = 0.48
Split candidato 1: atrasos ≤ 1 → izquierda: 5 ejemplos (5A, 0R); derecha: 5 (1A, 4R).
Gini(izq) = 1 − (1² + 0²) = 0
Gini(der) = 1 − (0.2² + 0.8²) = 1 − 0.68 = 0.32
Δ₁ = 0.48 − (5/10)·0 − (5/10)·0.32 = 0.48 − 0.16 = 0.32
Split candidato 2: ingreso ≤ 30k → izquierda: 4 (2A, 2R); derecha: 6 (4A, 2R).
Gini(izq) = 1 − (0.5² + 0.5²) = 0.5
Gini(der) = 1 − ((4/6)² + (2/6)²) = 1 − (0.444 + 0.111) = 0.444
Δ₂ = 0.48 − 0.4·0.5 − 0.6·0.444 = 0.48 − 0.2 − 0.267 = 0.013
Gana atrasos ≤ 1 (Δ = 0.32 ≫ 0.013). La rama izquierda ya es pura (hoja "aprueba");
la derecha (1A, 4R) puede volver a dividirse o quedar como hoja "rechaza" con confianza
4/5. Regla resultante: SI atrasos ≤ 1 → aprueba; SI atrasos > 1 → rechaza (80 %).
📊 Propiedades y comparación
| Aspecto | Árbol CART | Regresión logística | k-NN | Reglas a mano (parte 01) |
|---|---|---|---|---|
| Frontera | Cajas alineadas a ejes | Hiperplano | Irregular local | La que el experto escriba |
| No linealidad / interacciones | Automáticas | Manuales | Implícitas | Manuales |
| Preprocesado | No exige escalar | Exige escalar (con L2) | Exige escalar | — |
| Varianza | Alta (inestable) | Baja | Media | Nula (fijas) |
| Interpretación | Reglas si es pequeño | Odds ratio | Ninguna global | Total |
| Fronteras oblicuas | Escalera de splits | Nativas | Aproximadas | — |
flowchart TD
N["Nodo con datos S"] --> C{"¿Criterio de parada?<br/>profundidad, min_samples,<br/>ganancia mínima"}
C -- "Sí" --> H["Hoja: clase mayoritaria<br/>(o media en regresión)"]
C -- "No" --> B["Para cada feature j y corte t:<br/>calcular Δ impureza (Gini/entropía)"]
B --> M["Elegir split con Δ máxima"]
M --> L["Recursión en hijo izquierdo<br/>(xⱼ ≤ t)"]
M --> R["Recursión en hijo derecho<br/>(xⱼ > t)"]
L --> N2["..."]
R --> N3["..."]
H --> P["Post-poda: minimizar<br/>R(T) + α·|hojas| con α por CV"]
⚠️ Errores conceptuales frecuentes
- "El árbol encontró el split óptimo global." El algoritmo es voraz nodo a nodo; el árbol globalmente óptimo es NP-completo. Un split localmente mediocre puede habilitar splits excelentes después (XOR), y el voraz se lo pierde.
- "Accuracy 1.0 en train: el árbol es buenísimo." Es la firma del sobreajuste: sin restricciones el árbol memoriza. La cifra relevante es validación, y la brecha train-val mide la varianza del modelo.
- "La importancia de features del árbol identifica las causas." La importancia por impureza favorece features de alta cardinalidad y se la reparten al azar las features correlacionadas; además describe al modelo, no al fenómeno.
- "Los árboles no necesitan nada de preprocesado." No exigen escalar, pero sí sufren con etiquetas ruidosas, clases desbalanceadas (el split mayoritario domina) y extrapolación: fuera del rango de train predicen la hoja del borde, constante.
- "Poda = perder accuracy." Pierde accuracy de train y suele ganar en validación: la poda cambia varianza por sesgo, exactamente el intercambio correcto en un modelo inestable.
🚀 Del aprendizaje a la operación
Para llevar un árbol a decisiones reales faltan: elegir α (o profundidad) con validación anidada y verificar la estabilidad del árbol ante re-muestreo (si cada bootstrap da reglas distintas, no comuniques "las reglas" como conocimiento), auditar las reglas con expertos del dominio antes de automatizar (una regla legible también puede codificar un sesgo legible), definir el fallback para valores nulos o fuera de rango en producción, y — si la prioridad es exactitud sobre legibilidad — pasar al ensemble de la clase 041, aceptando el costo en interpretabilidad.
🧪 Laboratorio
python lab.py
El laboratorio llama a ai_evolution.labs.run_lab("ml"). Esta
decisión evita 183 implementaciones divergentes: cada clase tiene un entrypoint
propio, pero los motores didácticos se prueban como una biblioteca común.
🔍 Evidencia esperada
- tipo de laboratorio y semilla;
- entradas o decisiones observables;
- resultado estructurado;
- lista
evidencecon hechos que pueden inspeccionarse; - lista
limitationsque impide presentar la demo como producción.
📓 Notebooks
- 📓
notebook.ipynb: recorrido guiado con la materia resumida. - ✍️
notebook_student.ipynb: ejercicios para resolver. - ✅
notebook_solution.ipynb: solución de referencia explicada.
📝 Evaluación
| Criterio | Peso |
|---|---|
| Comprensión conceptual | 25 % |
| Ejecución reproducible | 25 % |
| Interpretación basada en evidencia | 25 % |
| Riesgos, límites y mejora propuesta | 25 % |
Consulta assessment.md para preguntas y criterio de aceptación.
⚠️ Errores comunes
| Síntoma | Causa probable | Corrección |
|---|---|---|
| El código corre, pero no hay conclusión | Se confundió ejecución con aprendizaje | Explica qué demuestra y qué no demuestra |
| El resultado cambia sin explicación | No se registró semilla o configuración | Conserva semilla, versión y parámetros |
| Se promete uso real | Se extrapoló desde una demo educativa | Declara entorno, datos, límites y revisión humana |
| Se copia una métrica aislada | No existe baseline ni costo de error | Añade comparación y criterio de decisión |
❓ Preguntas frecuentes
¿Debo usar una API comercial?
No. El núcleo funciona localmente. Las extensiones LIVE se documentan por separado.
¿El laboratorio representa una implementación industrial?
No por sí solo. Enseña el contrato y el patrón; producción exige integración,
seguridad, observabilidad, pruebas y operación.
¿Dónde profundizo?
Revisa las especializaciones enlazadas en el README raíz y la ruta siguiente.
🔗 Referencias
- Breiman, Friedman, Olshen, Stone — Classification and Regression Trees (1984), el libro de CART. DOI 10.1201/9781315139470 — uso: fuente primaria del mecanismo estudiado
- Quinlan (1986), "Induction of Decision Trees", Machine Learning 1. DOI 10.1007/BF00116251 — uso: fuente primaria del mecanismo estudiado
- Hastie, Tibshirani, Friedman — The Elements of Statistical Learning (2e), §9.2 "Tree-Based Methods", PDF oficial — uso: desarrollo extendido del tema
- James et al. — An Introduction to Statistical Learning (2e), cap. 8 "Tree-Based Methods", PDF oficial — uso: desarrollo extendido del tema
- scikit-learn User Guide — Decision Trees (incluye poda por costo-complejidad) — uso: referencia consultada en su fuente original
📜 Papers que fundamentan esta clase
Bloque generado por
python scripts/link_papers_to_classes.py. La fuente espapers/catalog/papers.json.
| Paper | Año | Qué desbloqueó | Miniatura |
|---|---|---|---|
| P74 · Inducción de árboles de decisión | 1986 | Aprende un modelo que una persona puede leer, eligiendo cada pregunta por cuánta incertidumbre elimina. | notebook |
Cada ficha explica el problema anterior, la matemática mínima, los límites y los errores de atribución más frecuentes. Para leerlas con método: cómo leer un paper de IA · anexos matemáticos.
📚 Bibliografía de apoyo
Bloque generado por
python scripts/link_sources_to_classes.py. Cada obra lleva su localizador verificado ensources/bibliography.json.
Los papers dicen de dónde salió el mecanismo. Estas obras lo desarrollan con el espacio que una clase no tiene: teoría completa, demostraciones y ejercicios.
| Obra | Edición | Localizador | Papel en esta clase |
|---|---|---|---|
| Hastie, Trevor, Tibshirani, Robert y Friedman, Jerome — The Elements of Statistical Learning | 2.ª · 2009 | ISBN 9780387848570 · web de la obra | citada en las referencias de esta clase · obra de referencia de la parte 03 |
| James, Gareth et al. — An Introduction to Statistical Learning | 2021 | ISBN 9783031387470 · web de la obra | citada en las referencias de esta clase · cap. 8 · obra de referencia de la parte 03 |
| Murphy, Kevin P. — Probabilistic Machine Learning | 2022 | ISBN 9780262046824 · web de la obra | obra de referencia de la parte 03 · fundamentos probabilísticos del aprendizaje |
⬅️ Clase anterior
039 — Clasificación logística y umbrales
➡️ Siguiente clase
041 — Random Forest, boosting y ensembles
📝 Evaluación completa
❓ Preguntas
- Define árboles de decisión y reglas interpretables sin usar una marca o framework como definición.
- Explica la relación entre árboles, impureza, poda, reglas.
- Ejecuta
lab.pydos veces con la misma semilla. ¿Qué debe conservarse? - Identifica una afirmación permitida y una afirmación exagerada sobre el resultado.
- Propón una prueba negativa o un caso límite.
🏆 Reto verificable
Amplía el resultado del laboratorio con una clave student_extension que incluya:
- el supuesto que estás probando;
- una medición o comprobación;
- la conclusión;
- una limitación.
✅ Criterio de aceptación
- [ ]
lab.pytermina con código 0. - [ ] El resultado contiene
kind,seed,evidenceylimitations. - [ ] La extensión no modifica el comportamiento de otras clases.
- [ ] La interpretación referencia datos impresos por el laboratorio.
- [ ] Se declara al menos un riesgo o condición de no uso.