Séptimo artículo de la serie sobre lead nurturing y tercero de la línea de fundamentos técnicos. El anterior terminó a propósito con una pregunta sin responder: si un árbol de decisión entrenado sobre los leads de Aura Commerce pierde contra la regresión logística, ¿cómo puede ganar un grupo de cien árboles igual de mediocres?
La respuesta empieza con un experimento un poco incómodo. Entrené sesenta árboles distintos sobre los mismos 1.600 leads de entrenamiento, cada uno viendo una muestra ligeramente distinta de esos datos. Los sesenta perdieron contra la regresión logística. Los sesenta, sin excepción, ninguno se salvó. Y sin embargo, al promediar lo que decían los trescientos primeros, el resultado superó a la regresión logística por primera vez en toda esta serie. Esa paradoja, que cien perdedores puedan juntos ganar, es el corazón de la comparación random forest vs árbol de decisión, y entenderla importa bastante más que memorizar el nombre del algoritmo.
Por qué un solo árbol tiembla ante un puñado de leads distintos
En el artículo anterior vimos algo que merece la pena recordar antes de seguir. Un árbol de decisión sin límite de profundidad clasificaba a la perfección los 1.600 leads de entrenamiento, con un AUC de 1,000, y cuando le llegaban leads nuevos se hundía hasta 0,617. El árbol de siete niveles que sí sobrevivía a la validación cruzada se quedaba en 67 hojas y en un AUC de test de 0,648, todavía por debajo del 0,683 de la regresión logística.
El diagnóstico de fondo no era que el árbol razonara mal. Cada corte que elegía tenía sentido con los datos que tenía delante. El problema es que esos datos eran pocos, y un árbol construido sobre 1.600 leads concretos depende demasiado de cuáles fueran exactamente esos 1.600 leads. Cámbialos un poco (quita cien, añade otros cien parecidos) y el árbol que sale puede ser bastante distinto, con cortes en sitios distintos y una opinión distinta sobre qué leads van a comprar. A eso se le llama varianza, y es un problema separado de si el modelo es lo bastante listo.
¿Y si cada árbol se equivoca de una forma distinta?
La analogía
Un juez único, por bueno que sea, arrastra sus propios sesgos: si el primer testimonio que escucha le convence, todo lo que oye después lo interpreta a través de ese filtro. Un jurado de doce personas también se equivoca, pero se equivoca de formas distintas y en direcciones distintas, y esos errores particulares tienden a cancelarse cuando se vota. Ningún miembro del jurado necesita ser más listo que el juez. Basta con que sus errores no sean el mismo error.
Esa es la apuesta de un Random Forest: en vez de un árbol entrenado con cuidado sobre todos los datos, entrenar muchos árboles sobre remuestras ligeramente distintas y quedarte con el promedio de lo que opinan. Lo comprobé entrenando sesenta árboles con la misma profundidad de siete niveles, cada uno sobre una remuestra con reemplazo de los 1.600 leads de entrenamiento. Esa técnica de remuestreo se llama bootstrap, y consiste sencillamente en sacar leads al azar permitiendo que el mismo lead pueda salir elegido varias veces. El resultado individual fue flojo: un AUC medio de 0,606, con una desviación de 0,027, moviéndose entre 0,524 en el peor caso y 0,660 en el mejor. Ni uno solo de los sesenta superó el 0,683 de la regresión logística.
Pero mira qué pasa cuando, en lugar de fiarte de uno, promedias lo que dicen varios a la vez.
Cada punto es un árbol más sumado al promedio. Ninguno por separado gana, pero la curva cruza a la regresión logística alrededor de los sesenta árboles y sigue subiendo.
Con sesenta árboles el promedio empata a la regresión logística. Con trescientos la supera, con un AUC de 0,691. Ningún árbol individual del conjunto sabe esto: cada uno sigue siendo, por su cuenta, peor que el modelo lineal. Lo que cambia el resultado es que sus errores no apuntan todos en la misma dirección, así que al promediar se van cancelando y sobrevive la señal que sí comparten.
Cómo construye scikit-learn un Random Forest, en la práctica
El experimento anterior usaba solo la mitad de la receta: remuestrear los leads con bootstrap. Un Random Forest añade una segunda capa de aleatoriedad que el bootstrap por sí solo no tiene, y esa segunda capa resulta ser la que más rinde.
Python · qué hace RandomForestClassifier que el bootstrap manual no hacía
from sklearn.ensemble import RandomForestClassifier bosque = RandomForestClassifier( n_estimators=300, # cuántos árboles promediar max_depth=7, # misma profundidad que usamos en el artículo anterior max_features="sqrt", # en cada corte, solo puede mirar una raíz cuadrada # de las variables disponibles, elegidas al azar bootstrap=True, # y cada árbol entrena sobre una remuestra distinta random_state=42, ) bosque.fit(X_train, y_train)
El parámetro que marca la diferencia es max_features. Con quince variables disponibles tras el one-hot encoding, cada corte del árbol solo puede elegir entre una raíz cuadrada de ellas, unas cuatro, sorteadas de nuevo en cada división. Un árbol que no puede ver todas las variables a la vez toma, casi por definición, decisiones distintas de otro árbol al que le tocó ver un subconjunto diferente. Es una debilidad impuesta a propósito en cada árbol individual, precisamente para que el conjunto gane en diversidad lo que cada miembro pierde en potencia.
El efecto se nota incluso en el caso extremo de un bosque de un solo árbol. Entrenar un RandomForestClassifier con n_estimators=1 da un AUC de 0,558, peor que el 0,606 medio de los árboles con bootstrap puro del apartado anterior, y peor todavía que el 0,648 de un árbol completo sin restricción de variables. Ese único árbol del bosque está deliberadamente debilitado dos veces: ve menos leads y ve menos variables por corte. Solo cuando se suman cientos de esas versiones debilitadas, cada una equivocándose por su lado, el conjunto empieza a rendir.
Cada árbol del bosque entrena sobre una remuestra distinta de leads y solo puede mirar un subconjunto sorteado de variables en cada corte. El voto final promedia trescientas opiniones que se equivocaron de formas distintas.
¿Por qué no basta con remuestrear los leads?
Para aislar lo que aporta exactamente ese sorteo de variables, entrené dos conjuntos de árboles sobre el mismo dataset: un bagging clásico, que solo remuestrea leads, y un Random Forest completo, que además sortea variables en cada corte. Si el sorteo de variables no aportara nada, los dos deberían rendir igual.
Mundo con umbrales · n=2.000 · correlación media entre pares de árboles del conjunto
El bagging se estanca alrededor de 0,700 por muchos árboles que le añadas, mientras que el Random Forest sigue subiendo hasta 0,733. La correlación media entre pares de árboles del bagging ronda 0,21-0,23; la de los árboles del Random Forest baja a 0,13-0,16. Menos correlación significa que los árboles se equivocan en sitios más distintos entre sí, y esa es la materia prima que el promedio necesita para funcionar: si todos los árboles cometieran el mismo error, promediarlos no arreglaría nada. El sorteo de variables no es un detalle menor de implementación: constituye la mitad del mecanismo que hace funcionar todo el conjunto.
El experimento completo sobre Aura Commerce
El hilo de Aura Commerce
Repito el montaje del artículo anterior: los mismos 2.000 leads, los mismos dos mundos generadores. Uno donde cada variable suma su efecto por separado (el que asumía implícitamente el primer artículo de la línea técnica), y otro con la ventana de maduración, el umbral de páginas visitadas y las dos combinaciones de canal y cargo que ya conocemos. La pregunta ahora es qué hace un Random Forest completo, con hasta quinientos árboles, en cada uno de los dos mundos.
En el mundo aditivo el bosque nunca llega a cruzar a la regresión logística, por muchos árboles que le añadas: sube de 0,552 con un solo árbol hasta 0,743 con quinientos, y se queda a cuatro milésimas del 0,747 de la logística sin llegar a superarlo. Es la misma historia que ya contamos con el árbol individual, ahora confirmada también para el conjunto: cuando las relaciones son aditivas y monótonas, ni un árbol ni trescientos árboles inventan patrones que no existen.
En el mundo con umbrales la historia se invierte pronto. Con solo diez árboles el bosque ya marca 0,708 y supera el 0,683 de la logística. La ganancia se estabiliza sobre 0,73 a partir de cien árboles, y añadir más allá de trescientos apenas mueve la aguja: 0,733 con trescientos, 0,734 con quinientos. El experimento confirma algo práctico y ahorra dinero en computación: no hace falta perseguir bosques enormes, con un par de cientos de árboles el conjunto ya ha entregado casi todo lo que tiene que dar.
La ventaja es mayor justo cuando menos datos tienes
Aquí aparece el resultado que menos esperaba, y va en contra de la intuición habitual de que los métodos de conjunto necesitan mucho volumen para lucirse.
Mundo con umbrales · árbol de siete niveles vs bosque de 300, a distintos volúmenes
Con los 2.000 leads que Aura Commerce tiene hoy, el bosque le saca ocho centésimas y media de AUC al árbol individual. Con diez mil leads la ventaja se reduce a poco más de una centésima, y con cincuenta mil apenas se mueve. Cuantos más datos le das a un árbol individual, menos depende de qué leads concretos le tocaron, así que menos necesita el promediado que aporta el bosque. La ventaja del Random Forest no crece con el volumen, se diluye. Eso significa que precisamente en el punto en el que está hoy Aura Commerce, con datos históricos limitados, es donde subir a un conjunto de árboles compensa más, no menos.
El precio que no sale en la diapositiva de resultados
Todo lo anterior compara AUC contra AUC, y con esa única vara de medir el bosque gana con claridad en el mundo que más se parece al comportamiento real de compra. Pero el AUC no es la única cosa que le importa al negocio, y aquí es donde conviene ser honesto con lo que cuesta subir de complejidad.
Lo que pierdes al pasar de un árbol a un bosque
La regresión logística se explica con 15 coeficientes y una ecuación que cabe en una diapositiva. El árbol de siete niveles del artículo anterior tiene 67 hojas: son 67 reglas que un comercial puede leer y entender una por una. El Random Forest de 300 árboles de este artículo acumula 19.734 hojas en total, repartidas entre 300 árboles distintos que votan en paralelo. Ninguna regla individual explica ya la decisión final: para saber por qué un lead concreto sacó la puntuación que sacó hace falta promediar el voto de los 300, no leer una tabla.
El coste no es solo de interpretabilidad. Sobre los mismos 400 leads de test, predecir con la regresión logística tarda de media 0,112 milisegundos; con el árbol, 0,892 milisegundos; con el bosque de 300 árboles, 56,472 milisegundos. El bosque es 502 veces más lento que la regresión logística en el momento de puntuar un lead. Para un scoring que corre una vez al día sobre unos miles de leads eso es irrelevante. Para un scoring que se ejecuta en tiempo real en cada visita a la web, deja de serlo.
Cuándo subir a un bosque, con números
Framework de decisión
Quédate en la regresión logística o en un árbol único si necesitas que cada decisión de scoring se pueda explicar en una frase al equipo comercial, o si el scoring corre en tiempo real y una latencia de 56 milisegundos por lead es inasumible en tu infraestructura.
Sube a un Random Forest si ya confirmaste, como hicimos en el artículo anterior, que tus datos tienen ventanas, umbrales o combinaciones que un modelo lineal no puede capturar, y puedes asumir la caja negra a cambio de entre tres y ocho centésimas más de AUC.
No esperes a tener más datos para dar el salto. La ventaja del bosque sobre el árbol individual fue mayor con 2.000 leads (+0,085) que con 50.000 (+0,012). Si tu volumen histórico es limitado, como el de Aura Commerce, es precisamente cuando el conjunto más aporta.
No persigas bosques cada vez más grandes. Entre cien y trescientos árboles se captura casi toda la ganancia disponible; de trescientos a quinientos el AUC se mueve una milésima. Más árboles después de ese punto solo añaden coste de cómputo.
Aplicado a Aura Commerce, este experimento afina la conclusión del artículo anterior más de lo que la contradice. Si el equipo comercial necesita seguir viendo por qué un lead puntúa alto, la regresión logística con las variables bien construidas sigue siendo la opción a operar. Pero si lo que importa es exprimir hasta la última centésima de AUC y se puede vivir con un modelo que nadie puede leer entero, el Random Forest ya está listo para entrar en producción con los datos que hay hoy, sin esperar a acumular más leads.
La pregunta que abre el siguiente artículo
Los trescientos árboles de este bosque no saben nada unos de otros. Se entrenan todos a la vez, en paralelo, cada uno ciego a lo que hicieron los demás, y solo se ponen de acuerdo al final, votando. Funciona, como hemos visto, pero deja una pregunta abierta: ¿qué pasaría si en vez de entrenar trescientos árboles ciegos entre sí, cada árbol nuevo se entrenara mirando en qué leads concretos se equivocó el árbol anterior, y se dedicara solo a corregir ese error? Serían árboles corrigiéndose en cadena, uno detrás de otro, en vez de árboles votando todos a la vez. Esa idea tiene nombre, y es la que abre la siguiente pieza de esta serie.
¿Te ha resultado útil?
¿Tienes un problema que
los datos podrían resolver?
Sin formularios largos. Una conversación de 30 minutos para ver si tiene sentido.
Hablamos