CART paso a paso
En simple: lee esto primero
CART es la receta para construir el árbol: en cada paso prueba todas las preguntas posibles y se queda con la que mejor separa.
Como ordenar un armario: primero separas por tipo de prenda (la división que más ordena), luego cada montón por color, y así… hasta que cada cajón queda ordenado o ya no vale la pena seguir.
- Para cada variable solo hay que probar los cortes entre valores vecinos (no infinitos).
- Al árbol no le importa la escala de los datos, solo el orden: no hace falta escalar.
- Se para cuando el grupo es puro, muy pequeño o el árbol ya es muy profundo.
- umbral
- el valor de corte de una pregunta («¿edad > 30?»).
- codicioso (greedy)
- elige la mejor pregunta ahora, sin pensar en las siguientes.
- profundidad
- cuántas preguntas seguidas puede hacer el árbol.
- pre-poda
- reglas para dejar de crecer antes (profundidad máxima, mínimo de ejemplos…).
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.
Solo importan n − 1 umbrales
Sección titulada «Solo importan n − 1 umbrales»El umbral es continuo, así que hay infinitos splits candidatos… pero solo finitas particiones distintas: dos umbrales entre el mismo par de valores ordenados dan el mismo split. Receta: ordena la feature y prueba los puntos medios entre valores consecutivos distintos: a lo más candidatos. La ganancia es una función escalonada de , no una curva suave: no hay nada que derivar, se enumera.
En el ejemplo: 9 candidatos en y 9 en . Gana con ganancia ; segundo, con 0.1800; dos candidatos de dan exactamente 0.
Costo: ordenar cada feature una vez cuesta ; luego cada nodo barre sus puntos en actualizando conteos. Un árbol balanceado cuesta ≈ en total.
Un árbol solo ve el orden de cada feature
Sección titulada «Un árbol solo ve el orden de cada feature»Cambia por : el orden no cambia, así que el árbol es idéntico (solo cambia el número impreso del umbral). Por eso los árboles no necesitan estandarizar, a diferencia de todos los modelos de las sesiones 02–07.
Pero una rotación no es una transformación monótona de una feature: rotar los mismos diez puntos 30° obliga al árbol a pasar de 4 hojas a más. Los ejes importan.
Features categóricas
Sección titulada «Features categóricas»Una feature con categorías podría partirse por cualquier subconjunto: posibilidades. Atajo de Breiman: ordena las categorías por su tasa de clase 1 y prueba solo los cortes contiguos (probado óptimo para clasificación binaria). Ojo: scikit-learn no implementa splits categóricos (hay que codificar), y una categoría con muchos niveles tiene muchos cortes con los que «tener suerte».
El algoritmo CART
Sección titulada «El algoritmo CART»BuildTree(nodo con puntos ):
- Si se activa un criterio de parada, es hoja: clase mayoritaria (o media ). Fin.
- Para cada feature y cada punto medio de los valores de , calcula .
- Quédate con el mejor . Si no mejora, es hoja.
- Parte en , y recursa en ambos.
Es codicioso: el paso 3 se compromete con el mejor split ahora y nunca lo reconsidera. Encontrar el árbol globalmente óptimo es NP-difícil; CART es una heurística excelente con un modo de falla famoso (XOR, abajo).
Creciendo el ejemplo
Sección titulada «Creciendo el ejemplo»- Raíz: , ganancia → accuracy 0.8.
- En B: , ganancia → 0.9.
- En D: , ganancia → 1.0.
Las ganancias no decrecen necesariamente: el split más profundo tiene la mayor, porque actúa sobre un nodo chico y muy mezclado.
Construye el árbol tú mismo
Elige una hoja (en el diagrama de flujo), mira la ganancia de cada umbral candidato (los puntos medios entre valores ordenados) y haz clic en una barra para aplicar ese split. O deja que CART elija de forma codiciosa. Clic en un punto cambia su clase.
- 🍃 hoja · n=10 · [5, 5] · Gini=0.500 → predice ¿empate?
¿Cuándo parar? (pre-poda)
Sección titulada «¿Cuándo parar? (pre-poda)»Un nodo es hoja si: es puro; tiene muy pocos puntos (min_samples_split, min_samples_leaf); se alcanzó la profundidad (max_depth); la mejor ganancia está bajo un piso (min_impurity_decrease); o se agotó el presupuesto de hojas (max_leaf_nodes). Sin ninguno, el árbol crece hasta que cada hoja es pura: accuracy de entrenamiento 1.0 y overfitting fuerte.
El modo de falla: XOR
Sección titulada «El modo de falla: XOR»En XOR todo candidato de la raíz tiene ganancia exactamente 0 (cada mitad sigue 50/50)… y sin embargo el árbol de profundidad 2 « y luego » es 100% correcto. Un split que parece inútil es el que hace perfecto al siguiente. Con min_impurity_decrease = 0.01 el árbol se detiene en la raíz: 1 hoja, 50%. Por eso se crece primero y se poda después. (Prueba el modo XOR en el simulador.)
El otro límite: cortes paralelos a los ejes
Sección titulada «El otro límite: cortes paralelos a los ejes»Una frontera diagonal limpia le cuesta al árbol una escalera: profundidad 2 → 86.9%, 4 → 94.8%, 8 → 95.4%, siempre aproximando. Rota los mismos datos 45° y un solo split da 99.9%. Es el sesgo inductivo del árbol, como la suavidad lo era del RBF: un modelo se define tanto por lo que no puede expresar como por lo que puede.
Árboles de regresión
Sección titulada «Árboles de regresión». La hoja predice la media ; la impureza pasa a ser la suma de errores cuadrados ; se elige que minimiza . Mismo algoritmo: cambia «mayoría» por «media» y «Gini» por «SSE». Un árbol de regresión es una escalera: no puede inclinarse, solo escalonar.
Ocho departamentos (área 1..8 decenas de m², alquiler 2, 3, 4, 5, 10, 11, 12, 13 centenas de €): una hoja predice 7.5 con SSE = 138. El mejor corte, área ≤ 4.5, predice 3.5 y 11.5 con SSE 5 + 5 = 10: ganancia 128. Los umbrales barridos dejan 103.43, 71.33, 40.80, 10.00, 40.80, 71.33, 103.43. Profundidad 2 llega a SSE 2; profundidad 3, a 0 (un escalón por punto).
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).
Ejercicio
Sección titulada «Ejercicio»Barre los umbrales de área para los 8 departamentos y verifica el SSE del corte en 4.5.
Ver solución
Izquierda : media 3.5, SSE . Derecha : media 11.5, SSE . Total 10, ganancia . Con el corte en 3.5: izquierda (media 3, SSE 2), derecha (media 10.2, SSE ): total 40.8 ✓.
Autoevaluación
0/5 correctas · 0 respondidasEn código
Sección titulada «En código»from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor, export_textimport numpy as np
X = np.array([[1,4],[2,1],[3,9],[6,5],[8,3],[4,8],[5,10],[7,2],[9,6],[10,7]])y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) # los 10 puntos de la clase
tree = DecisionTreeClassifier(criterion='gini', random_state=0).fit(X, y)print(export_text(tree, feature_names=['x1', 'x2']))# |--- x1 <= 3.50 → clase 0 ; |--- x1 > 3.50 → x2 <= 5.50 → x2 <= 2.50 ...print(tree.get_n_leaves(), tree.get_depth()) # 4 hojas, profundidad 3
reg = DecisionTreeRegressor(max_depth=5).fit(x.reshape(-1, 1), y_reg) # escaleraPara profundizar
Sección titulada «Para profundizar»Fuente ·ML_Course_Decision_Trees.pdf (slides 28–41)