21 · Poda de árboles: pre-poda, post-poda y ccp_alpha
Detén o recorta el árbol antes de que memorice el ruido — la poda es el mecanismo de regularización de los árboles de decisión.
Detén o recorta el árbol antes de que memorice el ruido — la poda es el mecanismo de regularización de los árboles de decisión.
Sin esto:
Sin poda, un solo árbol se ajusta perfectamente a los datos de entrenamiento y falla en cualquier cosa nueva.
Cada árbol de decisión que hemos crecido hasta ahora eventualmente sobreajusta a menos que lo detengamos. Existen dos estrategias: pre-poda (parar temprano durante el crecimiento) y post-poda (crecer el árbol completo, luego eliminar ramas).
Pre-poda: hiperparámetros de parada temprana
Se aplican durante la construcción del árbol e impiden que los nodos sigan dividiéndose:
| Parámetro | Efecto | |---|---| | max_depth | Profundidad máxima desde la raíz hasta la hoja más profunda — la perilla más simple | | min_samples_split | Mínimo de muestras en un nodo padre ANTES de que se le permita dividir | | min_samples_leaf | Mínimo de muestras requerido en CADA hoja hija resultante | | max_leaf_nodes | Límite en el número total de nodos hoja |
Establecer cualquiera de estos actúa como un criterio de parada duro.
Post-poda: poda por complejidad de costo (ccp_alpha)
Sklearn implementa la Poda de Mínima Complejidad de Costo. La idea: crecer el árbol completo T₀, luego medir cuánta precisión se sacrifica al colapsar (podar) un subárbol a una hoja. Si el sacrificio de precisión es menor que el presupuesto de regularización α, se poda.
Formalmente, minimizar el costo penalizado:
R(T) + α · |hojas(T)|
donde R(T) es el error de entrenamiento y |hojas(T)| es el conteo de hojas. α más grande → penalización más fuerte por conteo de hojas → poda más agresiva.
cost_complexity_pruning_path() de sklearn devuelve la secuencia completa de valores (α, impureza) desde el árbol completo (α=0) hasta la raíz (α=máximo). Eliges el mejor α por validación cruzada.
La analogía con la regularización L1/L2
Ridge añade λ·||w||² a la pérdida — penalizando la complejidad (pesos grandes). La poda CCP añade α·|hojas(T)| a la pérdida — penalizando la complejidad (muchas hojas). El mecanismo es diferente pero el principio es idéntico.
Python (in browser)
El árbol completamente crecido alcanza 100% de precisión de entrenamiento en 300 muestras — memorizó el conjunto de entrenamiento creciendo lo suficientemente profundo para crear una hoja para cada región de entrenamiento. El árbol de profundidad 3 acepta ~5-10% menor precisión de entrenamiento a cambio de una puntuación de prueba notablemente mejor.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`cost_complexity_pruning_path` devuelve cada alpha en el que se podaría una rama, desde 0 (árbol completo) hasta un valor grande (solo la raíz). Ajustar un árbol por alpha y graficar la precisión train/test revela el arco clásico de regularización: la precisión de entrenamiento disminuye monótonamente mientras la precisión de prueba primero sube (reduciendo sobreajuste) luego cae (demasiado subajuste).
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
En producción no necesitas graficar la curva de alpha manualmente — envuelve `DecisionTreeClassifier` en un `GridSearchCV` sobre los valores de alpha de `cost_complexity_pruning_path`. La búsqueda en cuadrícula usa internamente validación cruzada de k-folds en el conjunto de entrenamiento para estimar el rendimiento de generalización de cada alpha.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
El esquema de tres niveles va de menor a mayor complejidad: `max_depth` es un solo número y fácil de explicar a las partes interesadas; `min_samples_leaf` agrega robustez sin cambiar la profundidad interpretable; `ccp_alpha` es la opción fundamentada cuando quieres la poda óptima con una base teórica clara.
Establecer `max_depth=1` produce un árbol con ¿cuántos nodos de split internos?
- La pre-poda (max_depth, min_samples_split, min_samples_leaf, max_leaf_nodes) detiene el crecimiento del árbol cuando se activa una restricción. Es simple, rápida e interpretable.
- La post-poda (ccp_alpha) crece primero el árbol completo, luego elimina ramas cuyo sacrificio de precisión está por debajo del presupuesto α. El α óptimo se encuentra por validación cruzada.
- La poda por complejidad de costo minimiza R(T) + α·|hojas(T)| — una analogía directa a la regularización L2 que minimiza el error de entrenamiento + λ·||w||².
- min_samples_split requiere N en el PADRE antes de considerar un split. min_samples_leaf requiere N en CADA hijo resultante. La restricción de hoja es más estricta — prefierela cuando tengas dudas.
- Un árbol max_depth=1 se llama 'decision stump' — un split, dos hojas. Es el aprendiz base de AdaBoost y el árbol no trivial más simple.
Todo árbol de random forest y gradient boosting está podado mediante max_depth (5–8 es típico). El max_depth de XGBoost, el num_leaves de LightGBM — los mismos hiperparámetros de poda con diferentes nombres.
Si lo quitas: Los árboles sobreajustarían perfectamente en todo problema — inútiles sin sus perillas de regularización.