lección 2
Boosting: una cadena de árboles que se corrigen
Árboles en secuencia, cada uno corrigiendo los errores del anterior: XGBoost y LightGBM, las dos que ganan competiciones.
⏱ 50 min
En 1990, un investigador llamado Robert Schapire se hizo una pregunta que parecía de salón: si tengo un predictor que apenas acierta un poco más que lanzar una moneda, ¿puedo combinarlo consigo mismo de alguna forma para construir un predictor casi perfecto? La respuesta, que demostró matemáticamente, fue que sí. Y abrió una de las ideas más fértiles del aprendizaje automático: el boosting, que podríamos traducir como potenciación o refuerzo. No se trata de tener predictores buenos, sino de encadenar predictores débiles de modo que cada uno se concentre en lo que los anteriores no supieron resolver.
Acabas de ver la primera familia de conjunto, el bosque aleatorio, donde muchos árboles votan a la vez. El boosting es la segunda familia, y es la que gana casi todas las competiciones con datos en tablas desde hace más de una década. Las dos usan árboles, las dos agregan muchos predictores mediocres, pero la forma de combinarlos es radicalmente distinta, y esa diferencia lo cambia todo. Entenderla es el objetivo de esta lección.
Que la pregunta de Schapire tuviera respuesta afirmativa no fue un detalle académico. Hasta entonces se asumía que para tener un buen predictor había que construir, de alguna manera, un buen predictor: más datos, mejor algoritmo, más tiempo de cálculo. La idea del boosting le dio la vuelta a eso. Decía que con un predictor apenas mejor que el azar y una forma inteligente de encadenarlo consigo mismo, podías llegar tan arriba como quisieras. Era casi hacer oro con plomo, y durante unos años pareció demasiado bonito para ser cierto. Luego llegaron las implementaciones prácticas, empezaron a ganar competiciones una tras otra, y la comunidad entera se convenció de que la cadena de correctores no solo funcionaba en el papel: funcionaba mejor que casi todo lo demás.
## Paralelo frente a secuencial: la diferencia que lo cambia todo
El bosque entrena sus árboles en paralelo. Cada árbol se construye por su lado, sin saber nada de los demás, sobre su propia muestra al azar de los datos. Cuando llega una fila nueva, todos opinan a la vez y se cuenta el voto mayoritario. Es un jurado popular: cada miembro delibera por su cuenta y al final se cuentan las papeletas. Nadie habla con nadie durante la deliberación.
El boosting entrena sus árboles en secuencia, uno detrás de otro, y cada árbol nuevo mira dónde se equivocó la cadena hasta ese momento y se dedica precisamente a arreglar esos errores. El primer árbol hace una predicción tosca. El segundo no empieza de cero: se fija en qué filas quedaron mal predichas y pone su esfuerzo ahí. El tercero corrige lo que todavía falla después de los dos primeros. Y así sucesivamente. Es una cadena de revisores: el primero escribe un borrador, el segundo corrige sus fallos, el tercero corrige los que aún quedan, y el documento final es la suma del borrador más todas las correcciones.
Merece la pena detenerse en cómo sabe cada árbol dónde están los errores que debe corregir, porque es el corazón del método. Tras entrenar el primer árbol, se mira para cada fila la diferencia entre lo que el árbol predijo y lo que de verdad era: esa diferencia es el error que queda por explicar, y en la jerga se llama el residuo. El segundo árbol no se entrena para predecir la respuesta original, sino para predecir esos residuos, es decir, para capturar justo lo que al primero se le escapó. Al sumar lo que dice el primero más lo que dice el segundo, el error total encoge. Luego se calculan los residuos que quedan después de los dos, y el tercero se entrena sobre ellos. Y así hasta que no queda casi nada por corregir. Cada árbol, en el fondo, responde a la pregunta: de lo que todavía está mal, ¿qué puedo arreglar yo?
La versión moderna de esta idea se llama gradient boosting, potenciación por gradiente, y el término gradiente solo quiere decir que, en lugar de trabajar directamente con los residuos a lo bruto, se usa una medida matemática de en qué dirección hay que mover la predicción para reducir el error lo más rápido posible. No necesitas la matemática para usarlo ni para entenderlo: la imagen de cada árbol corrigiendo lo que dejó mal el anterior es exacta. Pero conviene que el nombre no te asuste cuando lo veas, porque XGBoost y LightGBM, las dos herramientas de esta lección, son las dos implementaciones de gradient boosting que dominan la práctica.
Lo que el diagrama deja ver, y que una lista de propiedades no transmite, es la dirección de las flechas. En el bosque van todas al mismo sitio sin tocarse entre ellas; en el boosting bajan en cadena, cada árbol colgado del anterior. Esa dependencia tiene una consecuencia inmediata: el boosting no se puede entrenar todo a la vez, porque el árbol tres necesita saber qué falló después del árbol dos. Es más lento de construir, pero esa misma secuencia es lo que le da su puntería.
## Por qué el boosting suele ganar
La ventaja del boosting nace de que cada árbol se concentra en lo difícil. En el bosque, todos los árboles reparten su esfuerzo por igual sobre todo el problema, aciertan lo fácil muchas veces y lo difícil se queda sin resolver por nadie en particular. En el boosting, en cambio, lo fácil se resuelve en los primeros árboles y a partir de ahí toda la cadena se vuelca sobre las filas que se resisten. Es como un equipo de estudio que, en vez de repasarlo todo otra vez, dedica cada sesión a los temas que todavía fallan.
Hay otra diferencia de temperamento entre las dos familias que vale la pena nombrar, porque explica cuándo elegir cada una. Los árboles del bosque suelen ser profundos, porque cada uno intenta resolver el problema entero por su cuenta y necesita margen para hacerlo. Los árboles del boosting suelen ser poco profundos, a menudo de apenas unos pocos cortes, porque ninguno tiene que resolver el problema entero: solo tiene que aportar una pequeña corrección, y para eso basta un árbol humilde. La potencia del boosting no viene de que cada árbol sea listo, viene de encadenar muchos árboles tontos de forma que entre todos cubran lo que ninguno abarcaría solo. Es la diferencia entre pedir a unos pocos expertos que respondan por separado y organizar a muchos aprendices en una línea de montaje bien dirigida.
Esa misma virtud es su peligro. Un boosting con demasiados árboles o un ritmo de aprendizaje demasiado agresivo acaba corrigiendo hasta el ruido: aprende de memoria accidentes de los datos de entrenamiento que no se repetirán, y sobreajusta. El bosque es robusto casi de serie; el boosting rinde más pero exige más cuidado al ajustarlo. Guárdalo, porque es la razón de ser del trabajo de ajuste que viene justo después.
## XGBoost y LightGBM: las dos implementaciones estrella
La idea del boosting con árboles tiene dos implementaciones que dominan la práctica. XGBoost (de extreme gradient boosting) apareció en 2014 y arrasó en las competiciones de datos durante años: durante un tiempo fue casi obligatorio en cualquier solución ganadora con datos en tablas. LightGBM, creada por Microsoft poco después, persigue lo mismo con un diseño pensado para ir más rápido y gastar menos memoria con muchos datos. En la práctica las dos dan resultados muy parecidos, y la elección entre ellas suele ser cuestión de velocidad y de costumbre más que de acierto.
Que estas dos herramientas se comieran el mundo de los datos en tablas tiene una lección implícita que conviene retener, porque va a contracorriente del ruido que oirás por ahí. Durante los últimos años, toda la atención pública ha ido hacia las redes neuronales y los modelos enormes que generan texto o imágenes. Son impresionantes para lo suyo, pero cuando el problema es el de siempre (una tabla con filas y columnas, predecir una cifra o una clase), quien gana sigue siendo, casi sin excepción, un boosting bien ajustado. No es la tecnología más vistosa ni la que sale en las noticias, pero es la que resuelve la enorme mayoría de los problemas reales de predicción con datos de empresa. Saber esto te ahorra perseguir modas que no encajan con tu problema.
La buena noticia es que las dos hablan el mismo idioma que ya conoces. Tanto XGBClassifier (de XGBoost) como LGBMClassifier (de LightGBM) siguen el contrato de scikit-learn: creas el modelo, llamas a fit con los datos de entrenamiento y a predict con los nuevos. Cambiar de un bosque a un boosting es, literalmente, cambiar la línea donde creas el modelo. Todo lo demás que sabes (partir en montones, validar con honestidad, medir en prueba) se aplica igual.
Que compartan el mismo contrato fit/predict no es casualidad, y entender por qué te da una llave que vale para casi todo el aprendizaje automático con esta biblioteca. Hace años, el estándar de scikit-learn impuso que todos los modelos se usaran igual: creas el objeto, lo entrenas con fit, predices con predict, y punto, sin importar si por dentro es una regresión, un árbol, un bosque o un boosting. Esa decisión de diseño, aparentemente menor, es la que te permite probar media docena de modelos distintos cambiando una sola línea y comparar sus resultados sin reescribir nada. XGBoost y LightGBM, que son proyectos independientes de scikit-learn, se tomaron la molestia de hablar ese mismo idioma precisamente porque sabían que, si no, nadie se tomaría la molestia de usarlos. La lección para ti es tranquilizadora: lo que aprendiste a hacer con un árbol o un bosque se traslada tal cual, y cambiar de modelo es barato.
Eso sugiere una forma sensata de trabajar que mucha gente con experiencia sigue. Empieza siempre por el bosque: es robusto, pide poco y te da en pocos minutos una referencia honesta de hasta dónde se puede llegar con tus datos. Esa cifra es tu línea de salida. Luego prueba un boosting a ver si la supera, que casi siempre lo hace, pero ahora sabiendo cuánto gana de verdad respecto al bosque y a qué precio de ajuste y de tiempo. Si el boosting mejora el bosque por un margen que a tu problema le importa, perfecto; si lo mejora por una miseria que no cambia ninguna decisión, a lo mejor te quedas con el bosque por simple y por estable. Comparar siempre contra una referencia barata es un hábito que te ahorra perseguir mejoras que no valen lo que cuestan.
Antes de que el boosting te parezca la respuesta a todo, conviene saber dónde no brilla, porque también lo tiene. Con muy pocos datos, su afán de corregir hasta el último error se vuelve en su contra y memoriza con facilidad; ahí un modelo más humilde suele ir mejor. Cuando necesitas explicar con total claridad por qué el modelo decidió lo que decidió, un boosting de cientos de árboles encadenados es una caja difícil de abrir, bastante más que una simple regresión. Y si tu problema no son datos en tablas sino imágenes, sonido o texto largo, el boosting no es la herramienta: ahí mandan otras familias. El boosting es excelente en su terreno, que es enorme (tablas de filas y columnas con una respuesta que predecir), pero no es universal, y confundir una herramienta buena con una herramienta para todo es un error de principiante que conviene no cometer.
Las dos bibliotecas corren dentro del navegador en esta plataforma, así que puedes entrenar un XGBoost o un LightGBM aquí mismo sin instalar nada. La primera vez que una lección las carga tarda unos segundos, porque tu navegador descarga las bibliotecas; a partir de ahí van rápidas. No te asustes si el primer fit se demora un par de segundos: es normal.
Consejo de quien ha puesto muchos boosting en producción: no empieces girando mandos. Entrena primero un boosting con los valores de fábrica y mide; esa cifra ya suele ser muy competitiva, y te dice si merece la pena invertir tiempo en afinar o si el margen de mejora es tan pequeño que no cambia ninguna decisión. Muchas veces el boosting de serie ya resuelve el problema, y el tiempo de ajuste se aprovecha mejor pensando en mejores variables.
No imprimas la versión de XGBoost dentro del navegador. Lo que devuelve no es un número de versión limpio, sino una cadena de desarrollo que no corresponde a ninguna documentación publicada, así que si la lees y te vas a buscar ayuda, acabarás en una página que no existe. Para saber qué versión tienes, consulta la documentación oficial de la plataforma, no el propio paquete.
## El ritmo de aprendizaje, en una frase
Hay un parámetro del boosting que conviene nombrar ya, aunque su ajuste fino lo veas al tratar la búsqueda de hiperparámetros: el ritmo de aprendizaje (en inglés learning_rate). Controla cuánto corrige cada árbol de la cadena. Con un ritmo alto, cada árbol pega una corrección grande y llegas rápido, pero te pasas de frenada y sobreajustas con facilidad. Con un ritmo bajo, cada árbol corrige poquito y necesitas más árboles para llegar, pero el resultado generaliza mejor. Es el acelerador del coche: pisar a fondo te lleva antes y te sales en la curva; ir suave tarda más y llegas entero. La combinación habitual es ritmo bajo y muchos árboles.
Hay una relación entre el ritmo de aprendizaje y el número de árboles que conviene tener en la cabeza, porque los dos tiran del mismo carro. Si bajas el ritmo, cada árbol aporta menos, así que para llegar al mismo sitio necesitas más árboles; si lo subes, cada árbol aporta más y llegas con menos. Por eso no tiene sentido ajustar uno sin pensar en el otro: son dos mandos de la misma cosa. En la práctica, la receta que casi nunca falla es poner un ritmo deliberadamente bajo y compensar con muchos árboles, porque esa combinación suele generalizar mejor que la contraria, aunque tarde más en entrenar. Es la diferencia entre aprender algo a base de muchos repasos suaves o de un par de empolladas intensas: lo primero se asienta mejor.
Y aquí está el peligro concreto del que avisaba antes, dicho con nombres. Como el boosting corrige errores sin descanso, si lo dejas correr demasiado acaba corrigiendo cosas que no eran errores de verdad, sino ruido: casualidades de los datos de entrenamiento que no se repetirán. En ese punto, cada árbol nuevo mejora el acierto sobre el entrenamiento y lo empeora sobre los datos nuevos; la cadena ha empezado a memorizar. Por eso con el boosting la vigilancia del sobreajuste no es opcional como casi lo es con el bosque: hay que medir en un conjunto apartado cuándo deja de mejorar lo que importa y parar la cadena ahí. Esa parada a tiempo es una de las habilidades que separan a quien usa el boosting bien de quien se deja un modelo precioso en el laboratorio que luego decepciona.
## El cierre: dos familias, un mismo problema por delante
Ya tienes las dos grandes familias de conjunto: el bosque que vota en paralelo y el boosting que corrige en cadena. Las dos tienen parámetros que tú eliges (cuántos árboles, qué profundidad, qué ritmo de aprendizaje) y de los que depende si el modelo generaliza o sobreajusta. Hasta ahora los has puesto a ojo o con los valores de fábrica. Elegirlos bien es una búsqueda, y hacer esa búsqueda sin engañarte a ti mismo es más delicado de lo que parece: es muy fácil contaminar la prueba sin darte cuenta. Eso es lo siguiente.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...
Regístrate para guardar tu progreso.