Sexto artículo de la serie sobre lead nurturing y segundo de la línea de fundamentos técnicos. En el anterior defendimos la regresión logística como la opción por defecto para casi cualquier scale-up. En este la sometemos al modelo que más la cuestiona, y el marcador final no es el que yo tenía en mente antes de arrancar el experimento.
Pon a dos modelos a mirar exactamente los mismos 2.000 leads de Aura Commerce y hazles la misma pregunta: ¿qué variable pesa más a la hora de saber si un lead va a comprar? La regresión logística responde que los días que lleva el lead en el radar apenas importan, casi ruido de fondo. El árbol de decisión, entrenado sobre esos mismos datos, elige justo esa variable como la más importante de todas. Mismos datos, veredictos opuestos. La comparación entre árbol de decisión vs regresión logística no se resuelve señalando cuál algoritmo es más listo, sino entendiendo qué tipo de patrón sabe buscar cada uno. Como vamos a comprobar, cada modelo solo encuentra las formas que sabe reconocer.
El artículo anterior se quedó con una pregunta en el aire: ¿cómo es un modelo que, en lugar de sumar pesos sobre una fórmula fija, aprende a base de preguntas encadenadas, cortando los datos hasta separar a quien compra de quien no? Ese modelo existe y se llama árbol de decisión. Adelanto el resultado para que no te quedes con la intriga más de lo necesario: con los datos que tiene hoy Aura Commerce, pierde contra la regresión logística. Lo interesante no es ese marcador, sino las condiciones exactas en las que cambia, porque esas condiciones hablan más de tu negocio que del algoritmo que elijas.
¿Qué da por hecho la regresión logística sin que se lo hayas pedido?
Cuando en el artículo anterior entrenamos la regresión logística y leímos sus coeficientes, aceptamos dos reglas del juego sin haberlas puesto sobre la mesa. La primera: cada variable suma su efecto por separado, como si fueran ingredientes independientes de una receta. Un lead que llega por referido aporta su parte, y si además es el propietario de la empresa aporta la suya, y el modelo simplemente las apila. La segunda regla es que si una variable ayuda, ayuda siempre en la misma dirección: más páginas visitadas siempre suma, más días de espera siempre resta, nunca una cosa y después la contraria.
Esas dos reglas son razonables en muchos negocios, y son justo lo que hace que el modelo se mantenga estable con pocos datos. El precio a pagar es que hay patrones enteros que el modelo jamás va a ver, por muchos leads que acumules. Y el comportamiento de compra en B2B está lleno de ese tipo de patrones, porque casi nunca dibuja una línea recta.
El hilo de Aura Commerce
Seguimos con el mismo dataset del artículo anterior: 2.000 leads del ecommerce B2B que vende a retailers, con las mismas nueve columnas, la misma tasa de conversión del 15,8% y el mismo AUC de referencia de 0,730 para la regresión logística. Lo único que cambia en este artículo es que vamos a comparar ese baseline contra un modelo que funciona de una forma radicalmente distinta, y que vamos a generar una segunda versión del dataset donde las relaciones entre variables tienen una forma que la logística no puede representar.
La ventana de maduración: el patrón que se cancela solo
Tomemos la variable que abre este artículo, los días transcurridos desde el primer contacto con el lead. Si agrupamos los leads de Aura Commerce por antigüedad y miramos qué porcentaje acaba convirtiendo en cada tramo, aparece un patrón que cualquier comercial reconoce sin necesidad de un modelo.
La conversión real dibuja una ventana con un máximo claro entre los días 21 y 35. La recta que ajusta la regresión logística atraviesa la curva sin capturar nada, y por eso el coeficiente sale casi cero.
Un lead con menos de diez días de antigüedad convierte al 10,9%, sencillamente porque todavía no ha madurado la decisión. Entre los días 21 y 35 la conversión alcanza el 21,9%, que es el doble. A partir del día 36 se desploma al 11,8%, y por encima de los sesenta días ninguno de los leads del dataset acaba comprando. Existe una ventana de maduración, y fuera de ella el lead no convierte por razones opuestas: al principio porque es pronto y al final porque ya está frío.
La regresión logística tiene que resumir todo eso en un único número. Como el efecto sube durante la primera mitad del recorrido y baja durante la segunda, los dos tramos se cancelan al ajustar una recta y el coeficiente que sale es −0,024, indistinguible de cero. El modelo no está equivocándose en el cálculo: está respondiendo correctamente a la única pregunta que sabe hacer, que es si más días significan más conversión o menos. La respuesta honesta a esa pregunta es que depende, y "depende" no cabe en un coeficiente.
Lo que esto significa en tu CRM
Si tu modelo de scoring está descartando una variable con un coeficiente cercano a cero, hay dos explicaciones posibles y son opuestas: o la variable de verdad no aporta información, o aporta muchísima pero en forma de ventana y el modelo no puede representarla. Distinguir entre las dos no se hace mirando el coeficiente, se hace agrupando los datos por tramos y mirando la tasa de conversión de cada uno. Es una consulta de cinco minutos y decide si tu problema es de datos o de modelo.
Un modelo que no aprende pesos, aprende preguntas
El árbol de decisión ataca el problema desde el otro extremo. En lugar de asignar un peso a cada variable y sumarlos, busca una pregunta que parta los datos en dos grupos lo más distintos posible entre sí en cuanto a conversión. Una vez hecho ese corte, repite el proceso dentro de cada mitad, y vuelve a repetirlo, hasta que los grupos son demasiado pequeños para seguir dividiéndolos o hasta que ya no encuentra ninguna pregunta que mejore la separación.
La analogía
Un modelo lineal razona como una hoja de cálculo que puntúa: tantos puntos por venir de referido, tantos por ser propietario, tantos por número de páginas vistas, y al final suma. Un árbol razona como el comercial veterano que descarta por eliminación: primero mira si el lead ha visto más de cinco páginas, y si no las ha visto ya casi no sigue preguntando; si las ha visto, entonces mira cuántos días lleva; y solo si está dentro de la ventana se molesta en mirar de qué canal viene. No pondera, encadena condiciones.
Esa diferencia de mecánica tiene una consecuencia geométrica que se ve mejor dibujada que explicada. Un modelo lineal solo puede trazar una frontera recta a través del espacio de leads: a un lado los que probablemente convierten, al otro los que no. Un árbol traza cortes perpendiculares a los ejes y puede encerrar una región concreta, lo que le permite aislar una isla que la recta es incapaz de rodear.
Los leads que convierten forman una isla: ni demasiado pronto ni demasiado tarde, y con suficientes páginas vistas. La recta no puede rodear una isla; los cortes del árbol sí.
¿Y cómo sabe el árbol dónde preguntar?
Aquí viene el único tramo del artículo que suena a manual técnico, así que vayamos rápido. El algoritmo prueba, uno por uno, todos los puntos de corte posibles en todas las variables, y se queda con el que deja los dos grupos resultantes lo más "limpios" posible: cada uno con leads que se parecen mucho entre sí en si compran o no compran. A esa limpieza se le llama impureza de Gini (o, en su versión alternativa, entropía), y cuánto mejora un corte respecto a no hacer nada se llama ganancia de información. Puedes olvidar los nombres; quédate con la idea: el árbol busca, corte a corte, la pregunta que más separa a quien va a comprar de quien no.
Si te interesa el desarrollo matemático completo (cuándo Gini y entropía divergen, por qué scikit-learn usa Gini por defecto), lo dejamos aparte en la guía sobre árboles de decisión, Gini y entropía. Para seguir el hilo de este artículo basta con una cosa: el árbol no necesita que nadie le diga que existe una ventana de conversión entre los días 21 y 35. Probando todos los cortes posibles sobre esa variable, la encuentra solo. Descubre la forma del patrón en lugar de tener que asumirla de antemano.
Python · entrenar el árbol sobre el dataset de Aura Commerce
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearchCV # La profundidad se elige por validación cruzada DENTRO de train. # Elegirla mirando el test es la forma más común de publicar # un resultado que luego no se reproduce en producción. grid = {"max_depth": list(range(1, 21)), "min_samples_leaf": [1, 10, 30]} busqueda = GridSearchCV( DecisionTreeClassifier(random_state=42), grid, scoring="roc_auc", # con 16% de conversión, accuracy no sirve cv=5, ) busqueda.fit(X_train, y_train) arbol = busqueda.best_estimator_ print(busqueda.best_params_) # {'max_depth': 4, 'min_samples_leaf': 30}
Fíjate en que medimos con AUC-ROC y no con accuracy, y hay una razón de negocio detrás, la misma que ya contamos al hablar del desbalance de clases: con solo un 16% de conversión, un modelo perezoso que prediga "nunca compra" acierta el 84% de las veces sin haber aprendido absolutamente nada útil.
Dos mundos, el mismo dataset
Antes de comparar hay que evitar una trampa fácil en la que caen muchos benchmarks de este tipo. Si fabrico un dataset donde todo suma de forma lineal, la regresión logística gana antes de empezar, porque estaría jugando en un campo diseñado a su medida. Si lo lleno de umbrales, gana el árbol por la razón contraria. La única comparación que enseña algo de verdad es la que hace correr a los dos modelos sobre dos realidades distintas, cada una favorable a uno de ellos.
El primer mundo replica lo que el artículo anterior daba por hecho: cada variable suma su efecto por separado y siempre en la misma dirección. El segundo mundo tiene la ventana de maduración que acabamos de ver, un umbral en las páginas visitadas por debajo del cual no hay señal, y dos reglas de negocio que solo se cumplen cuando dos condiciones coinciden a la vez. En ese segundo mundo, un lead que llega por recomendación y además tiene poder de decisión sobre el presupuesto convierte al 50,8%. Llegar por recomendación sin ese poder de decisión convierte al 16,3%, y tener el poder de decisión sin la recomendación se queda en el 14,4%. Junta las dos cosas y el resultado supera con creces la simple suma de las partes, y esa diferencia es justo lo que en estadística se llama una interacción.
AUC-ROC sobre el conjunto de test · mismos leads, dos estructuras de datos
En el mundo aditivo el resultado no admite discusión: la regresión logística gana con 2.000 leads por ocho centésimas de AUC y sigue ganando con cincuenta mil. Repitiendo el experimento con quince semillas distintas, el árbol no gana ni una sola vez, en ninguno de los tamaños de muestra. Cuando las relaciones de tu negocio son aditivas y monótonas, cambiar de modelo solo quema tiempo de desarrollo sin devolver nada a cambio.
El resultado incómodo: con tus datos actuales, el árbol pierde igual
Lo que no esperaba encontrar es la tercera fila de la tabla. En el mundo con umbrales, que es precisamente el mundo diseñado para que el árbol brille, con 2.000 leads el árbol sigue perdiendo contra la regresión logística: 0,648 frente a 0,683. Promediando quince semillas, el árbol solo gana el 47% de las veces, que es exactamente lo que se esperaría de lanzar una moneda.
La razón está en cómo se degrada un árbol cuando le falta volumen. Cada corte parte los datos en dos, y cada corte posterior trabaja sobre una fracción cada vez menor. Con 1.600 leads de entrenamiento y una conversión del 16,2%, un árbol de siete niveles termina con 67 hojas, lo que deja unos veinticuatro leads por hoja de los cuales apenas cuatro han convertido. A partir de ahí el modelo ya no aprende patrones, memoriza accidentes del muestreo.
El AUC de entrenamiento sube sin parar hasta clasificar perfectamente los 1.600 leads. El de test toca techo en profundidad 4 y a partir de ahí solo empeora. La distancia entre las dos líneas es la definición visual del sobreajuste.
Un árbol sin podar sobre este dataset termina con 364 hojas para 1.600 leads de entrenamiento, clasifica el conjunto de entrenamiento a la perfección con un AUC de 1,000, y cuando le llegan leads que no ha visto antes se queda en 0,617. Pero el detalle que más me interesa de este gráfico está en la profundidad 4, donde el árbol marca 0,690 en test y supera a la regresión logística por siete milésimas.
Podría haber publicado ese número y titular que el árbol gana. Habría sido tramposo, porque para saber que la profundidad 4 era la buena hace falta haber mirado antes el conjunto de test, y el test solo se mira una vez, al final, para reportar el resultado. El procedimiento honesto, la validación cruzada dentro del propio entrenamiento, elige profundidad 7, y ahí el árbol marca 0,648 y pierde. Esa distancia entre 0,690 y 0,648 tiene menos que ver con qué modelo es mejor y más con la diferencia entre evaluar bien tus resultados y engañarte a ti mismo sin darte cuenta. Es exactamente el motivo por el que tantos modelos que brillan en la presentación se comportan como una moneda al aire en producción.
El techo que más datos no arreglan
Aquí es donde el experimento deja de confirmar lo esperado y empieza a decir algo que no había visto formulado con esta claridad. Si en el mundo con umbrales multiplicamos por veinticinco el volumen de datos, pasando de 2.000 a 50.000 leads, la regresión logística se mueve de 0,683 a 0,643. No mejora: empeora ligeramente y después se estabiliza. Con quince semillas promediadas el patrón es todavía más nítido, porque pasa de 0,628 a 0,640 y ahí se queda clavada.
El árbol, con esos mismos datos, recorre el camino contrario: sube de 0,648 a 0,689, y el porcentaje de veces que gana a la logística pasa del 47% con dos mil leads al 87% con diez mil y al 100% con cincuenta mil. Los dos modelos reciben exactamente la misma información adicional y solo uno la aprovecha.
La distinción que decide tu inversión
Cuando un modelo se estanca hay dos diagnósticos posibles y llevan a decisiones opuestas. Si el problema es de cantidad, más datos lo resuelven y la inversión correcta es instrumentar mejor la captura. Si el problema es de forma, más datos no cambian nada porque el modelo tiene un techo estructural, y la inversión correcta es cambiar el modelo o construir las variables que le faltan. Multiplicar por veinticinco un dataset para ganar doce milésimas de AUC es la señal más cara de haber diagnosticado mal.
La opción que casi nadie prueba antes de cambiar de modelo
Queda una columna de la tabla por explicar, y es la que más me sorprendió al ejecutar el experimento. Si en lugar de cambiar de algoritmo le añadimos a la regresión logística cinco variables construidas a mano (el término cuadrático de los días para capturar la ventana, dos indicadores de umbral para las páginas vistas y dos indicadores para las combinaciones de canal y cargo), el modelo lineal sube de 0,683 a 0,718 con los mismos 2.000 leads. Con cincuenta mil llega a 0,706 y gana a todos los demás, incluido el bosque aleatorio.
Python · las cinco variables que cambian el resultado
# La ventana de maduración: el efecto sube y luego baja, # así que la recta necesita un término cuadrático para curvarse. df["dias_sq"] = df["dias_desde_primer_contacto"] ** 2 # Los umbrales de intención: por debajo de 5 páginas no hay señal. df["pag_umbral_5"] = (df["paginas_visitadas"] >= 5).astype(int) df["pag_umbral_12"] = (df["paginas_visitadas"] >= 12).astype(int) # Las dos interacciones que el negocio ya conocía sin modelo: # recomendación con poder de decisión convierte al 50,8%, # y micro captada por pago convierte al 4,1%. df["ref_x_prop"] = ((df["canal_origen"] == "referido") & (df["cargo"] == "propietario")).astype(int) df["micro_x_paid"] = ((df["empresa_tamano"] == "micro") & (df["canal_origen"] == "paid")).astype(int)
Esto cambia por completo cómo hay que leer la comparación. Piénsalo así: el árbol no compite con la regresión logística por el título de "modelo más listo"; funciona como un buscador automático de cortes, útil precisamente cuando tú todavía no sabes dónde están esos cortes. Si conoces tu negocio lo bastante bien como para nombrar la ventana de maduración y las dos combinaciones que disparan la conversión, se las puedes entregar ya escritas al modelo lineal, y de paso conservas los coeficientes interpretables que hacen que el equipo comercial confíe en el scoring. El conocimiento de negocio, una vez convertido en variables, gana a la sofisticación del algoritmo, y encima con un modelo que cualquiera puede auditar.
La trampa está en que ese conocimiento no siempre existe. Nadie en Aura Commerce habría dicho de entrada que la ventana se cierra en el día 35, ni que el umbral relevante de páginas está en cinco y no en tres o en diez. El árbol sirve exactamente para eso: entrénalo, mira qué cortes ha elegido, y usa esos cortes como hipótesis para construir las variables de tu modelo lineal. El árbol como instrumento de diagnóstico rinde más que el árbol como modelo de producción.
Cuándo subir de complejidad, con números
Framework de decisión
Quédate en la regresión logística si al agrupar tus variables por tramos las tasas de conversión suben o bajan de forma consistente, sin máximos intermedios. En ese escenario el árbol perdió en el 100% de las repeticiones y ningún volumen de datos cambia el resultado.
Construye variables antes de cambiar de modelo si detectas ventanas, umbrales o combinaciones y puedes nombrarlas. Cinco variables añadidas a mano dieron más AUC que cambiar de algoritmo, en los tres volúmenes probados, y mantienen la interpretabilidad intacta.
Usa el árbol como diagnóstico, no como modelo si sospechas que hay estructura pero no sabes dónde. Con menos de cinco mil leads su ventaja es una moneda al aire, pero los cortes que elige son las hipótesis que después conviertes en variables.
Cambia de modelo de verdad cuando superes los diez mil leads históricos y las relaciones sigan siendo condicionales. Ahí el árbol ganó el 87% de las veces, y por encima de cincuenta mil, el 100%.
Aplicado a Aura Commerce, con sus 2.000 leads históricos y un ciclo de decisión de tres a seis semanas que hace que acumular datos sea lento, la conclusión es que el modelo del artículo anterior sigue siendo el que debe operar. Lo que cambia después de este experimento es que ahora sabemos qué mirar para saber cuándo dejará de serlo, y que hay un paso intermedio (construir las variables que codifican la ventana y las dos interacciones) que da más rendimiento que cualquier cambio de algoritmo y no cuesta una migración.
La pregunta que abre el siguiente artículo
Queda un cabo suelto en la tabla que he dejado deliberadamente para el final. En el mundo con umbrales y con solo 2.000 leads, donde el árbol individual gana apenas el 47% de las veces, hay una columna que sí supera a la regresión logística: el bosque aleatorio marca 0,737 frente a 0,683, y gana en el 73% de las repeticiones. Con los mismos datos escasos con los que un árbol es una moneda al aire.
Al árbol nunca le sobró la idea de buscar cortes: le faltaba conformarse con los cortes de un único árbol entrenado sobre una única muestra, donde con pocos datos esa muestra concreta pesa demasiado en la decisión final. ¿Y si en lugar de fiarte de un árbol entrenas cientos, cada uno sobre un trozo distinto de tus datos, y promedias lo que dicen? Los errores individuales se compensan entre sí y sobrevive la señal que todos comparten. Queda por ver cómo un grupo de modelos mediocres, cada uno peor que la regresión logística por separado, puede acabar siendo mejor que cualquiera de ellos por su cuenta.
¿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