Octavo artículo de la serie sobre lead nurturing y cuarto de la línea de fundamentos técnicos. El anterior terminó con una pregunta sin cerrar: ¿y si en vez de trescientos árboles votando a la vez, cada árbol nuevo se dedicara solo a corregir el error del anterior?

Ya tengo la respuesta, y no es la que esperaba escribir. Entrené el modelo que corrige en cadena, el que en teoría concentra su esfuerzo exactamente donde el conjunto anterior se equivoca, sobre los mismos 2.000 leads de Aura Commerce. Y con los datos que hay hoy, pierde contra el bosque del artículo anterior. La comparación entre gradient boosting vs random forest no tiene un ganador fijo: depende de cuántos leads históricos tengas, de si tu scoring corre una vez al día o en cada visita a la web, y de si alguien tiene que poder explicar por qué un lead concreto puntuó como puntuó.

Antes de entrenar nada conviene ser honesto con la pregunta que dejamos abierta. Corregir en cadena suena, sobre el papel, estrictamente mejor que votar a la vez: un árbol que ve dónde se equivocó el anterior debería aprender más rápido que trescientos árboles ciegos entre sí. La intuición es razonable. También lo era la intuición de que un árbol individual ganaría al modelo lineal en el mundo con umbrales, y en el artículo anterior ese árbol perdía. Cada vez que la serie ha comprobado una intuición razonable contra el experimento, el experimento ha tenido matices que la intuición no traía. Esta vez no iba a ser distinto.

¿Gana de verdad corregir en cadena, o es otro caso de "depende"?

El random forest del artículo anterior funciona por votación: trescientos árboles entrenan en paralelo, cada uno sobre una remuestra distinta de leads y viendo solo un subconjunto de variables, y al final se promedia lo que opinan. Ningún árbol sabe nada de los demás mientras entrena. El gradient boosting cambia esa regla de raíz: entrena un árbol pequeño, mira en qué leads concretos se ha equivocado, y entrena el siguiente árbol para corregir justo ese error residual, no para predecir el resultado desde cero. El tercer árbol corrige lo que el segundo todavía dejó pasar, y así sucesivamente. Cada árbol es deliberadamente simple, a veces de apenas tres niveles, porque no tiene que resolver el problema entero: solo tiene que arreglar lo que quedó sin resolver.

El hilo de Aura Commerce

Mismo dataset de siempre: 2.000 leads del ecommerce B2B, los mismos dos mundos generadores de las dos piezas anteriores de esta línea. En el mundo con umbrales, el que más se parece a cómo compra de verdad un lead B2B, la regresión logística marca 0,683 de AUC, el árbol individual 0,648, y el bosque de trescientos árboles del artículo anterior llega a 0,733. Esa última cifra es la que el gradient boosting tiene que batir para justificar el salto.

Corregir en cadena, no votar a la vez

✏️

La analogía

Un comité de trescientos correctores que leen el mismo texto por separado y votan qué errores marcar se parece al bosque: cada uno se equivoca a su manera, y el consenso final compensa esos errores individuales. Una cadena de correctores es otra cosa. El primero lee el texto entero y marca lo que ve. El segundo no vuelve a leerlo entero: solo repasa lo que el primero dejó pasar, y marca lo que a él se le escapó. El tercero repite el proceso sobre lo que los dos anteriores no cogieron. Cada corrector de la cadena es más flojo que el comité en su conjunto, pero está enfocado exactamente donde hace falta.

La diferencia mecánica tiene una consecuencia que conviene ver dibujada antes de entrenar nada. El bosque del artículo anterior combina trescientos árboles independientes que nunca se comunican entre sí; el boosting encadena árboles donde cada uno depende exactamente del error acumulado por todos los anteriores. Esa dependencia es lo que le permite, en teoría, concentrar esfuerzo con más precisión. También es lo que lo hace más frágil: si un árbol de la cadena se equivoca de forma sistemática, el siguiente hereda ese sesgo en vez de compensarlo por votación.

Voto en paralelo del bosque frente a corrección en cadena del boosting En el panel superior, trescientos árboles del bosque entrenan en paralelo sobre los mismos leads y sus resultados se promedian al final. En el panel inferior, los árboles del boosting se entrenan en cadena: cada árbol nuevo se entrena sobre el error residual que dejó la suma de los árboles anteriores, y la predicción final es la suma acumulada de todos los árboles de la cadena. Random Forest — voto en paralelo 2.000 leads Árbol 1Árbol 2Árbol 300 ⋯ voto promedio Gradient Boosting — corrección en cadena Árbol 1: predice Árbol 2: corrige el error de 1 Árbol 3: corrige lo que queda ⋯

El bosque promedia trescientas opiniones ciegas entre sí. El boosting encadena árboles donde cada uno se entrena solo sobre el error que dejaron los anteriores, y la predicción final es la suma acumulada de la cadena.

Cómo se entrena esto, en la práctica

El parámetro que gobierna toda esta receta es la tasa de aprendizaje, o learning_rate. En cada ronda, el árbol nuevo no corrige el error residual al cien por cien: lo corrige solo una fracción pequeña, típicamente entre el 2% y el 10%. Esa fracción se llama shrinkage, y existe a propósito para que ningún árbol individual tenga demasiado peso sobre la predicción final. Cuanto más baja la tasa, más rondas hacen falta para llegar al mismo sitio, pero el camino es más prudente.

Python · entrenar el modelo de boosting sobre el dataset de Aura Commerce

from sklearn.ensemble import HistGradientBoostingClassifier

boosting = HistGradientBoostingClassifier(
    max_iter=300,       # rondas de corrección en cadena
    learning_rate=0.05, # cada ronda corrige solo un 5% del error
    max_depth=3,         # árboles deliberadamente simples
    random_state=42,
)
boosting.fit(X_train, y_train)

El resultado incómodo: con los datos de hoy, pierde

Con los 2.000 leads que Aura Commerce tiene hoy, entrenando trescientas rondas a una tasa de aprendizaje del 5%, el boosting marca 0,683 de AUC en test. Es exactamente la misma cifra que la regresión logística, y queda cinco centésimas por debajo del 0,733 del bosque del artículo anterior. La cadena de corrección no le saca ninguna ventaja al voto en paralelo con el volumen que hay hoy. Al contrario, con este mismo dataset pierde contra el modelo del artículo anterior.

AUC-ROC sobre test · mundo con umbrales · mismos leads, distinto volumen

Volumen históricoLogísticaÁrbolBosque (300)Boosting (300)
2.000 (Aura Commerce hoy) 0,6830,6480,7330,683
10.000 0,6370,6740,6870,704
50.000 0,6430,6870,6990,706

El patrón se invierte en cuanto sube el volumen. Con 10.000 leads históricos el boosting ya saca casi dos centésimas al bosque, 0,704 frente a 0,687, y con 50.000 sigue por delante, 0,706 frente a 0,699. La cadena de corrección necesita más ejemplos para que cada ronda tenga una señal fiable sobre la que corregir; con pocos leads, esa señal es ruidosa, y encadenar árboles sobre ruido acumula el error en vez de reducirlo. Es la misma lógica que ya vimos con el árbol individual en el artículo sobre árboles de decisión, aplicada un escalón más arriba: la estructura más sofisticada no falla porque sea peor idea, falla porque necesita un volumen que Aura Commerce todavía no tiene.

Repetí el mismo experimento en el mundo aditivo, donde la lógica ya sabíamos que favorecía al modelo lineal desde el primer artículo de esta línea. Con 2.000 leads la logística marca 0,747 y el boosting se queda en 0,729; con 50.000, 0,718 frente a 0,715. El boosting nunca cruza a la logística en ese mundo, tampoco con más datos: confirma que lo que decide el resultado es la forma de la relación entre las variables, no el nivel de sofisticación del modelo.

¿Por qué hay que frenarlo, si el bosque nunca necesitó freno?

Hay una asimetría entre los dos modelos que merece la pena entender antes de tocar el learning_rate. Añadir más árboles a un bosque nunca lo empeora demasiado: cada árbol nuevo es independiente, así que en el peor caso el promedio simplemente deja de mejorar. Añadir más rondas a un boosting es distinto, porque cada ronda nueva sigue corrigiendo errores del train, incluidos los que son ruido y no señal real. Pasado cierto punto, el modelo deja de aprender el patrón y empieza a memorizar los 1.600 leads concretos de entrenamiento.

AUC de entrenamiento y de test según el número de rondas de boosting Con una tasa de aprendizaje del 30% y sin frenar el entrenamiento, el AUC de entrenamiento sube de forma constante desde 0,645 con una ronda hasta 0,974 con trescientas rondas. El AUC de test sube solo hasta la ronda 25, donde alcanza su máximo de 0,676, y a partir de ahí desciende y se mantiene entre 0,639 y 0,670 el resto del recorrido. 0,60 0,70 0,80 0,90 1,00 0,676 · pico en ronda 25 entrenamiento test 15 1025 5075 100150 200300 rondas de boosting (learning_rate = 0,3)

A una tasa de aprendizaje alta (0,3), el entrenamiento nunca deja de mejorar, pero el test toca techo en la ronda 25 y después empeora. La distancia creciente entre las dos líneas es sobreajuste puro, acumulándose ronda a ronda.

Bajar la tasa de aprendizaje cambia esa curva por completo. A una tasa del 30% el hueco entre entrenamiento y test llega a 0,322 tras trescientas rondas sin frenar. A una tasa del 2%, con el mismo número de rondas, el hueco se queda en 0,104 y el AUC de test sube hasta 0,703, el mejor resultado de todo el experimento sin usar ningún mecanismo de parada. El precio es que hacen falta las trescientas rondas completas para llegar ahí: una tasa baja aprende más despacio, pero también se resiste más a memorizar el ruido.

La solución de producción: early stopping

En vez de fijar de antemano cuántas rondas entrenar, se reserva una porción de los datos de entrenamiento como validación y se detiene el entrenamiento en cuanto el AUC de esa validación deja de mejorar durante un número de rondas seguidas. Con learning_rate=0,05, ese mecanismo paró en la ronda 58 por su cuenta, y dio un AUC de test de 0,700, prácticamente el mismo resultado que ajustar la tasa a mano y sin necesidad de decidir de antemano cuántas rondas hacían falta.

Lo que sí gana ya hoy: velocidad

El AUC no es la única cifra que le importa a un sistema de scoring, y aquí es donde el boosting recupera terreno incluso con los 2.000 leads de hoy. El bosque de trescientos árboles del artículo anterior tarda 73,4 milisegundos en puntuar los 400 leads del conjunto de test. El modelo de boosting, con las 58 rondas que eligió el early stopping, tarda 2,0 milisegundos sobre el mismo conjunto. Es 36 veces más rápido, porque en vez de recorrer trescientos árboles independientes solo tiene que recorrer 58, y cada uno de ellos es más simple.

Para un scoring que se recalcula una vez al día sobre el histórico de leads, esa diferencia es irrelevante. Para un scoring que se ejecuta en el momento en que un lead visita la web, cada milisegundo cuenta, y ahí el boosting entrega casi el mismo AUC que la regresión logística con una latencia que ni el árbol individual ni el bosque pueden igualar.

SHAP: recuperar lo que el bosque no podía explicar

El artículo anterior terminaba con una advertencia incómoda: el bosque de trescientos árboles acumulaba casi 20.000 hojas repartidas entre todos ellos, y ninguna regla individual explicaba ya por qué un lead concreto había puntuado como puntuó. El boosting hereda el mismo problema, con menos hojas pero la misma opacidad de fondo. Lo que cambia es que existe una herramienta pensada exactamente para este tipo de modelo: SHAP, que reparte la predicción de cada lead entre sus variables, asignando a cada una la parte de la puntuación que le corresponde a ella y solo a ella.

Python · explicar cada lead individual con SHAP

import numpy as np, shap

explainer = shap.TreeExplainer(boosting)
valores_shap = explainer.shap_values(X_test)

# importancia global: media del valor absoluto por variable
importancia = np.abs(valores_shap).mean(axis=0)

Sobre una muestra de 400 leads de test, las variables que más pesan en conjunto son exactamente las que la serie lleva señalando desde el artículo sobre árboles de decisión: los días desde el primer contacto (peso medio de 0,276) y las páginas visitadas (0,198), por delante del tamaño de empresa, los emails abiertos y el canal de origen. SHAP no descubre variables nuevas; confirma, con una métrica distinta, la misma historia que ya contaban la ventana de maduración y el umbral de páginas.

Lo interesante no es la importancia global, que ya la teníamos de otras formas, sino la explicación lead a lead. Tomo dos leads reales del conjunto de test. El primero, con la puntuación más alta de la muestra, lleva 33 días desde el primer contacto (dentro de la ventana de maduración que se centra en el día 25), ha visitado 13 páginas (por encima del umbral de intención) y ha abierto 7 emails: SHAP reparte su puntuación asignando +0,613 a las páginas visitadas y +0,409 a los días, las dos variables que más empujan hacia arriba. El segundo, con la puntuación más baja, lleva 63 días desde el primer contacto, muy fuera de la ventana, y llegó por un canal de pago siendo una empresa micro, la combinación que ya identificamos antes como la peor de todas: SHAP le asigna −1,571 solo a los días, un peso que por sí solo explica casi toda la caída.

Lo que esto le devuelve al equipo comercial

Con el bosque del artículo anterior, la respuesta a "¿por qué este lead puntúa así?" era "porque lo dicen trescientos árboles". Con boosting y SHAP, la respuesta vuelve a ser una frase concreta: este lead puntúa alto porque lleva 33 días en el radar, justo en la ventana donde más convierte, y porque ha visitado más páginas de las que suele visitar quien no tiene intención real. Es la misma explicabilidad que tenía la regresión logística del primer artículo de esta línea, aplicada sobre un modelo que en volúmenes altos rinde más que ella.

Cuándo subir a boosting, con números

Framework de decisión

Quédate en el bosque del artículo anterior si tu volumen histórico está por debajo de los diez mil leads y lo único que te importa es el AUC bruto. En ese rango, el boosting no le gana: con 2.000 leads incluso pierde, 0,683 frente a 0,733.

Sube a boosting por volumen en cuanto superes los diez mil leads históricos. A partir de ahí la cadena de corrección empieza a rendir más que el voto en paralelo, y la ventaja se mantiene al menos hasta los cincuenta mil.

Sube a boosting por latencia, aunque el volumen no lo pida todavía, si el scoring se ejecuta en tiempo real. Es 36 veces más rápido en inferencia que el bosque, con un AUC que en el peor de los casos empata con la regresión logística.

Activa SHAP en cuanto actives boosting. Recupera, lead a lead, la misma explicabilidad que ofrecía la regresión logística del primer artículo de esta línea, algo que el bosque de trescientos árboles ya no podía dar.

Aplicado a Aura Commerce, con sus 2.000 leads históricos, la conclusión no es que el boosting haya llegado a sustituir al bosque del artículo anterior: hoy no lo hace, y cualquier titular que dijera lo contrario estaría maquillando la tabla de resultados. Lo que sí cambia es que, en cuanto el histórico cruce el umbral de los diez mil leads, o en cuanto el scoring necesite responder en el momento en que el lead entra en la web, el modelo que corrige en cadena ya está listo, probado y con la forma de explicarlo lead a lead que el bosque había dejado pendiente.

Preguntas frecuentes sobre gradient boosting y random forest

Preguntas frecuentes

¿Gradient boosting es mejor que random forest?

Depende del volumen de datos. Con 2.000 leads el random forest gana (0,733 de AUC frente a 0,683 del gradient boosting). A partir de 10.000 leads históricos el gradient boosting pasa a ganar en AUC, y la ventaja se mantiene hasta 50.000.

¿Cuántos datos hacen falta para que el gradient boosting compense?

En este experimento, el punto de cruce está entre 2.000 y 10.000 leads históricos. Por debajo de ese rango la corrección en cadena no tiene señal suficiente por ronda y pierde contra el voto en paralelo del bosque; por encima, empieza a ganar.

¿Se puede explicar una predicción de gradient boosting lead a lead?

Sí, con SHAP (TreeExplainer). Reparte la puntuación de cada lead entre sus variables, asignando a cada una su contribución exacta a la subida o bajada del score, y recupera la explicabilidad que un modelo de conjunto no da por sí solo.

¿Es más rápido el gradient boosting que el random forest al predecir?

Sí, de forma notable. Un modelo de boosting con 58 rondas (elegidas por early stopping) tardó 36 veces menos en puntuar el mismo lote de leads que un random forest de 300 árboles.

La pregunta que abre el siguiente artículo

Entre esta pieza y las tres anteriores de esta línea, Aura Commerce ya tiene cuatro formas distintas de puntuar a un lead, y sabe exactamente en qué condiciones conviene cada una. Sabe también, gracias a SHAP, por qué un lead concreto puntúa como puntúa: la ventana de días, las páginas visitadas, el canal de origen. Toda esta serie ha estado resolviendo una única pregunta, "¿qué lead vale la pena?", cada vez con más precisión. Queda la pregunta que de verdad mueve el negocio: sabiendo qué lead vale la pena y por qué, ¿qué hace Aura Commerce con esa información antes de que el lead se enfríe?