Árboles de decisión, random forest y boosting
Un árbol solo sobreajusta y se lee como un diagrama de flujo. Combinar muchos árboles resuelve lo primero y sacrifica lo segundo, y hay dos formas de combinarlos que apuntan a errores distintos.
Para datos tabulares —tablas con columnas heterogéneas, que es la mayoría de los datos de una empresa— los ensambles de árboles siguen ganándole a las redes neuronales. Vale la pena entender por qué, y empieza por entender el árbol solo.
Un árbol parte los datos con preguntas
Un árbol de decisión parte los datos con preguntas sobre un atributo a la vez: “¿el monto supera mil?”. Cada partición separa los datos en dos y el proceso se repite hasta que las hojas son suficientemente puras.
El criterio para elegir la pregunta es cuánto baja la impureza —Gini o entropía en clasificación, varianza en regresión—. Es una búsqueda golosa: se elige la mejor partición local sin mirar las consecuencias futuras, porque el árbol óptimo global es un problema intratable.
Arriba, todos los datos mezclados: 100 transacciones, 20 de ellas fraude.
Antes de seguir, predecí
Lo que un árbol trae gratis
Los árboles tienen propiedades raras y muy convenientes. No les afecta la escala de los atributos, así que no hay que estandarizar. Manejan atributos categóricos y numéricos juntos. Capturan interacciones y no linealidades sin que nadie las declare. Y se leen: un árbol chico se explica a cualquiera.
La contra es que sobreajustan sin límite —un árbol profundo memoriza— y son inestables: cambiar unos pocos datos puede producir un árbol completamente distinto.
Promediar muchos para bajar la varianza
Esa inestabilidad es alta varianza, y la varianza se combate promediando. Bagging entrena muchos árboles sobre muestras aleatorias con reemplazo y promedia sus predicciones.
Random forest agrega una idea más: en cada partición, considerar sólo un subconjunto aleatorio de atributos. Suena contraintuitivo y es la clave, porque decorrelaciona los árboles: si un atributo es muy predictivo, todos los árboles lo usarían primero y quedarían parecidos, y promediar cosas parecidas no reduce nada.
Encadenar débiles para bajar el sesgo
El boosting ataca el otro error. En vez de árboles independientes, entrena en secuencia: cada árbol nuevo se concentra en los errores que dejaron los anteriores. En la versión por gradiente, cada árbol ajusta el gradiente del costo, es decir, lo que falta.
Los árboles son deliberadamente chicos, de pocos niveles, y cada uno aporta una corrección pequeña regulada por la tasa de aprendizaje. Con eso se reduce el sesgo, y por eso boosting suele lograr mayor exactitud que random forest, a cambio de poder sobreajustar si se lo deja correr de más.
Cuál de los dos según el problema
La diferencia práctica ordena la elección. Random forest es difícil de arruinar: pocos hiperparámetros sensibles, paralelizable, más árboles nunca empeora. Es la opción para una línea de base sólida rápido.
Boosting —XGBoost, LightGBM, CatBoost— suele ganar en exactitud y exige más cuidado: tasa de aprendizaje, cantidad de árboles, profundidad y parada temprana interactúan entre sí. Es lo que gana las competencias de datos tabulares, y lo que más mantenimiento pide.
La importancia de atributos y su letra chica
Los ensambles reportan importancia de atributos, y conviene leerla con desconfianza. La importancia por impureza favorece a los atributos con muchos valores distintos, y entre dos atributos correlacionados reparte el crédito de forma arbitraria.
Alternativas más honestas son la importancia por permutación y los valores SHAP, que además explican predicciones individuales. Y una limitación estructural: los árboles predicen por regiones constantes, así que no extrapolan. Fuera del rango visto en entrenamiento devuelven el valor del borde, cosa que un modelo lineal sí extiende.
Los hiperparámetros que importan
from sklearn.ensemble import RandomForestClassifier
import lightgbm as lgb
# Random forest: difícil de arruinar, pocos parámetros sensibles
bosque = RandomForestClassifier(
n_estimators=500, # más árboles nunca empeora: sólo cuesta tiempo
max_features="sqrt", # el parámetro que decorrelaciona, y es el que importa
min_samples_leaf=5, # controla el sobreajuste
n_jobs=-1, # entrena en paralelo: los árboles son independientes
)
# Boosting: más exacto y con parámetros que interactúan entre sí
modelo = lgb.LGBMClassifier(
learning_rate=0.05, # más chico, más árboles hacen falta
n_estimators=2000, # se corta antes con parada temprana
num_leaves=31,
min_child_samples=20,
)
modelo.fit(
X_train, y_train,
eval_set=[(X_val, y_val)],
callbacks=[lgb.early_stopping(50)], # deja de agregar árboles cuando deja de mejorar
)La diferencia práctica está a la vista: el bosque se entrena en paralelo porque cada árbol es independiente, y el boosting es secuencial porque cada árbol corrige lo que dejaron los anteriores. Por eso el bosque escala con núcleos y el boosting no.
La parada temprana no es una optimización: en boosting es el mecanismo principal contra el sobreajuste, porque agregar árboles indefinidamente termina memorizando.
Cuál de los dos, y contra las redes
| Un árbol | Random forest | Boosting | |
|---|---|---|---|
| Qué error ataca | ninguno: es la base | varianza, promediando | sesgo, corrigiendo |
| Entrenamiento | instantáneo | paralelo | secuencial |
| Se puede arruinar | sobreajusta solo | difícil | sí: sobreajusta si se lo deja correr |
| Exactitud típica | baja | buena | la mejor en datos tabulares |
| Mantenimiento | ninguno | poco | los parámetros interactúan |
Cierre
Particiones golosas por impureza: sin escalado, con interacciones gratis y sobreajuste asegurado. Bagging y random forest bajan varianza promediando árboles decorrelacionados; boosting baja sesgo corrigiendo en secuencia. Las importancias engañan y ningún árbol extrapola.
Autoevaluación
¿Lo entendiste?
Práctica