Poda, importancia e inestabilidad
En simple: lee esto primero
Un árbol que crece sin límite memoriza los datos; podarlo (cortarle ramas) lo hace más simple y mejor con datos nuevos.
Como podar una planta: le quitas las ramitas que no aportan para que crezca más sana. Cada rama cuesta algo, y solo se queda si mejora lo suficiente.
- Poda por costo-complejidad: cada hoja tiene un «costo» α; se cortan las ramas que no compensan.
- α se elige con validación cruzada.
- Los árboles son inestables: un pequeño cambio en los datos puede cambiar todo el árbol. Por eso luego se combinan muchos (bosques).
- poda
- quitar ramas del árbol para simplificarlo.
- α (costo de complejidad)
- la multa por cada hoja extra.
- importancia de variables
- cuánto ayudó cada variable a ordenar los datos en todo el árbol.
- ensemble
- combinar muchos modelos (por ejemplo, muchos árboles) para que se corrijan entre sí.
Más abajo viene la versión completa, con fórmulas. Si una palabra aparece subrayada con puntos, pasa el mouse (o tócala) para ver qué significa.
El tamaño del árbol es la perilla de complejidad
Sección titulada «El tamaño del árbol es la perilla de complejidad»Un árbol poco profundo tiene pocas cajas: sesgo alto. Uno crecido al máximo pone una caja alrededor de (casi) cada punto: error de entrenamiento 0, memorizó el ruido. (nº de hojas) juega el papel que λ jugaba en ridge y C, γ en el SVM.
En las lunas de la slide: 4 hojas (train 0.906, CV 0.889, test 0.817), 8 hojas (0.961, CV 0.939, test 0.908), 22 hojas (1.000, 0.906, 0.883). La accuracy de entrenamiento sube monótonamente; la de CV hace una joroba (una U invertida: la misma U de la sesión 03 graficada como accuracy en vez de error).
¿A dónde va el error? A la varianza. 20 árboles sobre 20 re-muestreos bootstrap: los «tocones» (2 hojas) son casi todos la misma recta equivocada (sesgo alto, varianza baja); los árboles completos se dispersan salvajemente (sesgo bajo, varianza alta). Los árboles viven en el extremo de alta varianza: toda la motivación de la sesión 09.
Dos maneras de mantener chico un árbol
Sección titulada «Dos maneras de mantener chico un árbol»| Pre-poda (parar antes) | Post-poda (crecer, luego cortar) |
|---|---|
max_depth, min_samples_leaf, min_impurity_decrease, max_leaf_nodes | crecer completo y colapsar los subárboles que no se ganan su lugar |
| barato: el árbol nunca se construye | ve todo el árbol antes de decidir |
| miope: no ve un split que paga dos niveles abajo (XOR) | es la poda por costo-complejidad |
No son excluyentes: receta común = un max_depth holgado por velocidad + poda por costo-complejidad elegida por CV.
Poda por costo-complejidad
Sección titulada «Poda por costo-complejidad»es el riesgo de entrenamiento (impureza ponderada de las hojas, en unidades de Gini como scikit-learn). es un precio por hoja: conserva todo; enorme colapsa a la raíz. Es el mismo patrón de ridge (pérdida + penalización por complejidad). Una hoja debe comprar su lugar: se conserva solo si baja más que α.
El eslabón más débil
Sección titulada «El eslabón más débil»Colapsar el subárbol bajo el nodo en una sola hoja sube el riesgo en y quita hojas. Vale la pena en cuanto α supera el precio de equilibrio:
Poda del eslabón más débil: colapsar repetidamente el nodo con menor . Traza una secuencia finita y anidada . Aunque α es continuo, solo finitos árboles pueden ser óptimos: se busca en una lista corta.
La ruta completa, a mano, en los diez puntos
Sección titulada «La ruta completa, a mano, en los diez puntos»para 4, 3, 2, 1 hojas. Cada subárbol es una recta ; gana la más baja; se cruzan en , justo lo que devuelve scikit-learn.
Primer quiebre: colapsar D
Antes: E y F son puras ⇒ , . Después: D tiene , Gini , con peso ⇒ .
. Para las dos hojas puras valen su precio; en da igual; por encima se colapsan (4 → 3 hojas). Los otros dos quiebres (16/105 y 3/14) se calculan igual.
α compra hojas: la ruta de poda de los 10 puntos
R(T) es el riesgo de entrenamiento (impureza de Gini ponderada de las hojas). Cada hoja cuesta α. Mueve α y observa qué subárbol tiene el menor costo: solo cuatro pueden ganar.
Elegir α: validación cruzada, no el test
Sección titulada «Elegir α: validación cruzada, no el test»Se puntúa cada subárbol de la ruta con 5-fold CV sobre el entrenamiento. En la slide: α = 0.00708 → 8 hojas, CV 0.9278, test 0.908, frente a 0.867 del árbol completo de 22 hojas. Y la regla de 1 SE: entre los α con CV a menos de un error estándar del mejor, toma el más grande (el árbol más chico estadísticamente indistinguible). Cuando dos modelos empatan, entrega el más chico.
Leer el árbol: interpretabilidad
Sección titulada «Leer el árbol: interpretabilidad»Árbol de profundidad 3 en cáncer de mama (398 biopsias): 8 hojas, test 90.1% (vs 90.6% del árbol de 16 hojas: la mitad de hojas, la misma precisión). La hoja más grande (234 de 398 pacientes) es la regla «worst perimeter ≤ 106.1 y worst concave points ≤ 0.158 y area error ≤ 48.98», 98.7% benigna. Un clínico puede auditarla y cada predicción se explica exactamente, sin modelo sustituto.
Probabilidades: es el de la hoja donde cae : un valor por caja. El mismo punto (5, 4) recibe 0.714 con un tocón, 0.333 con 3 hojas y 0.000 con el árbol completo. Hojas profundas tienen pocos puntos ⇒ probabilidades extremas y mal calibradas.
Importancia de features (MDI): para cada feature, suma sobre los nodos que la usan. En el ejemplo: gana 0.2143 en la raíz; gana 0.1524 + 0.1333 en B y D; suman 0.5 (la impureza de la raíz) y normalizan a 3/7 y 4/7. ¡La feature de la raíz no es la más importante! «Parte primero» y «aporta más» son preguntas distintas.
El problema decisivo: inestabilidad
Sección titulada «El problema decisivo: inestabilidad»Mueve un punto una unidad y el árbol hace otra primera pregunta (en el ejemplo, pasa de a ): toda la estructura de abajo cambia. Causa: el argmax del split; dos candidatos pueden diferir en 0.0001 y un cambio mínimo cambia al ganador. En 50 re-muestreos bootstrap del cáncer, la raíz usa 5 features distintas, pero la accuracy apenas se mueve (media 91.6%, rango 87.1–94.7%). Muchos árboles distintos, todos casi igual de buenos: la firma de la varianza, que es lo único que promediar puede quitar.
| Fortalezas | Límites |
|---|---|
| interpretable: se lee como reglas | alta varianza (el problema decisivo) |
| sin escalar ni centrar: solo importa el orden | cortes alineados a los ejes: diagonales = escalera |
| tipos mixtos; faltantes con splits sustitutos | codicioso: no globalmente óptimo (NP-difícil) |
| captura interacciones sola (un camino es un AND) | no extrapola en regresión |
| predicción rápida: una comparación por nivel | importancias sesgadas; probabilidades mal calibradas si es profundo |
| multiclase gratis | sufre con relaciones suaves y aditivas que un modelo lineal clava |
Un solo árbol rara vez es el mejor predictor. Muchas veces es la mejor explicación.
El puente a la sesión 09: ensembles
Sección titulada «El puente a la sesión 09: ensembles»Un árbol completo: test 0.867. Veinte árboles sobre 20 re-muestreos bootstrap, cada uno dentado y distinto: su promedio da 0.900 con una frontera visiblemente más suave. Promediar estimadores aproximadamente independientes divide la varianza por sin tocar el sesgo. Los árboles son de sesgo bajo y varianza alta: lo ideal para promediar. Eso es bagging, random forests y boosting.
Pruébalo en regresión: sube la profundidad (árboles de alta varianza) y luego el número de árboles promediados.
Un árbol de regresión es una escalera
Cada hoja predice la media de sus puntos. Sube la profundidad y mira el error de test; fíjate en las zonas sombreadas fuera del rango de entrenamiento. Luego sube B: bagging promedia B árboles entrenados con remuestreos bootstrap (el tema siguiente del curso).
En la práctica
Sección titulada «En la práctica»DecisionTreeClassifier(criterion="gini"): la entropía rara vez cambia algo.- Nunca aceptes los defaults: fija
max_depthoccp_alpha. Ajustaccp_alphaconcost_complexity_pruning_path+GridSearchCV. - Fija
random_state(los empates se rompen al azar).class_weight="balanced"si hay desbalance. - Errores típicos: elegir la profundidad con el test, reportar accuracy de entrenamiento (1.0), confiar en MDI con features de alta cardinalidad, esperar extrapolación, sorprenderse de que el árbol cambie al re-entrenar.
En código: poda por costo-complejidad con CV
Sección titulada «En código: poda por costo-complejidad con CV»from sklearn.tree import DecisionTreeClassifierfrom sklearn.model_selection import GridSearchCVfrom sklearn.inspection import permutation_importance
path = DecisionTreeClassifier(random_state=0).cost_complexity_pruning_path(X_tr, y_tr)alphas = path.ccp_alphas[:-1] # la ruta finita de α; el último deja solo la raíz# para los 10 puntos, path.ccp_alphas = [0, 0.1333, 0.1524, 0.2143] = 0, 2/15, 16/105, 3/14
grid = GridSearchCV(DecisionTreeClassifier(random_state=0), {'ccp_alpha': alphas}, cv=5).fit(X_tr, y_tr)best = grid.best_estimator_print(grid.best_params_, best.get_n_leaves(), best.score(X_te, y_te))
imp_mdi = best.feature_importances_ # MDI (sesgada)imp_perm = permutation_importance(best, X_val, y_val).importances_mean # más confiableAutoevaluación
0/5 correctas · 0 respondidasPara profundizar
Sección titulada «Para profundizar»Fuente ·ML_Course_Decision_Trees.pdf (slides 42–63)