Processing math: 100%

7 votos

La agregación correcta de características para este complicado problema de compra

Considere el siguiente problema, que se planteó en una entrevista en la que estuve (pero no iba dirigida a mí). Parece engañosamente sencillo, pero luego resulta ser realmente difícil de responder bien:

Cada semana i un servicio de entrega de comida en línea tiene un cierto conjunto Pi de productos seleccionados entre su amplio surtido que necesita vender, antes de que caduquen.
Para motivar a la gente a comprar esos alimentos, la tienda puede enviar correos electrónicos al principio de la semana. Pero los clientes se molestan si reciben esos correos, así que el número de clientes que reciben un correo electrónico tiene que ser lo más bajo posible. Encuentre sólo a los clientes que cree que son propensos a comprar los productos seleccionados.
Los datos de los que dispone:
1) un amplio historial de compras de cada cliente en cada momento
2) todos los correos electrónicos anteriores que se enviaron aleatoriamente a un subconjunto de clientes
3) algunos datos generales sobre él como persona, encontrar tales clientes.

¿Cuál habría sido una buena solución para esto?

Ya he pasado horas pensando en esto, pero sólo he podido encontrar una solución trivial:
Considérelo como un problema de clasificación binaria sin ningún componente temporal (así que considere los datos de todas las semanas juntos como un único gran conjunto de datos) [esto es porque no conozco las series temporales]. Así, dados nuestros productos seleccionados P queremos saber qué tipo de clientes lo comprarán. Separamos los datos en un conjunto de entrenamiento-validación-prueba. A continuación, organizamos los datos de la siguiente manera: Codificar todos los datos categóricos con una codificación de un solo golpe. Utilizar los siguientes conjuntos de características (=columnas en el marco de datos que contiene todos los datos):

  • La información disponible sobre cada cliente de 3)
  • definir una clase (=característica=columna), que denote con 1 o 0 si ese cliente ha comprado ese producto en la semana después de que se le haya enviado un correo electrónico al principio de la semana (esto significa que para un mismo cliente tendremos tantas observaciones (=filas) como semanas haya). Por lo tanto, no utilizo ninguna información de su historial general de compras, sino sólo la forma en que los clientes han cambiado sus compras inmediatas debido al correo electrónico.

Por último, utilice su clasificador binario favorito y juegue hasta maximizar la precisión de la predicción.


Creo que un modelo así para resolver este problema habría sido realmente horrible. He aquí una crítica al modelo ilustrando algunos de los puntos esenciales que creo que no tendría en cuenta:

a) los clientes cambian su reacción a los correos electrónicos en términos de comportamiento de compra con el tiempo [¿hay alguna manera de ocuparse de esto sin usar series temporales? porque no sé casi nada sobre ellas].

b) el comportamiento de compra de los clientes individuales:
-a los clientes que nunca compraron lo que estaba en el correo electrónico, se les debe asignar una baja probabilidad de tener una respuesta de compra al nuevo correo electrónico
-No estoy seguro de que con este modelo incluso las personas que siempre compraron algunas de las cosas que se anunciaron en el correo electrónico tengan una alta probabilidad de comprar cosas nuevas. ¡Estos dos puntos me parecen esenciales para que el modelo los capte!
-algunos clientes pueden tener preferencias por determinados productos, lo que indicaría que si los productos que generalmente prefieren están en P definitivamente deberían recibir un correo electrónico, para motivarlos a comprar más de eso

c) No tengo en cuenta la influencia a largo plazo del correo electrónico: Actualmente utilizo implícitamente un límite para determinar la utilidad de la información que el cliente compró uno de los productos del correo electrónico: Si compró alguno de esos productos en la semana en la que se envió el correo electrónico, se supone que esa información es 100% útil (ya que se refleja en la característica que construyo), si lo compra en cualquier momento posterior se supone que esa información es 0% útil (ya que la ignoro en las características). En lugar de utilizar implícitamente dicha función de corte, creo que sería mejor si de alguna manera pudiera hacer esto explícito (pero no sé cómo) y utilizar alguna otra función que tenga un valor más bajo cuanto más tarden los clientes en comprar cosas del correo, para modelar la utilidad decreciente de esta información con el tiempo. Esto capturaría situaciones en las que algunos clientes compraron ese producto sólo, digamos, 2 semanas después de haber recibido el correo.

1 votos

Nota al margen: conoces la regresión lineal simple, ¿verdad? Pues bien, entonces conoce esencialmente las series temporales, porque los modelos más sencillos de la TSA son los siguientes: Suponga que tiene los mismos valores objetivo y1,...,yn entonces, en cada momento t, se utilizan las variables "retardadas yt1,yt2,...,ytk como tú k -vector de características de entrada y luego hacer una regresión lineal. En ese sentido, puede mezclar inteligentemente la TSA con su modelo de "surfear en la ola del AHORA", simplemente incoporando características "habituales" o "retardadas". Ejemplos: ...

1 votos

En las últimas X semanas, ¿con qué frecuencia compró el cliente el producto? En las últimas X semanas, ¿con qué frecuencia reaccionó el cliente a un correo electrónico publicitario que anunciaba este producto? Aquí, X es una especie de hiperparámetro con el que hay que jugar... Sin embargo, en su caso, supongo que puede seleccionar una X muy alta, ya que la afinidad general por la pizza o el atún no va y viene, sino que se mantiene durante toda la vida: o te gusta o no te gusta :-)

0 votos

¡¡@FabianWerner Gracias, esta es una buena información!! ¿Cómo se llaman estos modelos sencillos de TSA que no son más que una regresión lineal disfrazada? Actualizaré mi modelo en los próximos días (a menos que alguien ofrezca una respuesta antes) después de leer un poco sobre esos modelos. Además, con "jugar" supongo que te refieres a "utilizar la validación cruzada (o algo similar) hasta encontrar su mínimo".

3voto

ChicksDigTrig Puntos 6

0) y 2) Modelos de medias móviles. Supongamos que nos dan nada más que los siguientes datos de series temporales

     time          y
  1:    0 -12.070657
  2:    1   4.658008
  3:    2  14.604409
  4:    3 -17.835538
  5:    4  11.751944
  ...

que se ve así:

enter image description here

para el propósito de este ejemplo de juguete es esencialmente sin(tiempo) + perturbación (puedes encontrar el código R abajo). ¿A qué me refiero con esta extraña media móvil o modelo de serie temporal más simple? Hablo de añadir los valores pasados de y como nuevas columnas. Tomemos k=3 por ejemplo, entonces en cada momento t añadimos yt1,yt2,yt3 como nuevas columnas:

    time          y   y_past_1   y_past_2   y_past_3
 1:    0 -12.070657         NA         NA         NA
 2:    1   4.658008 -12.070657         NA         NA
 3:    2  14.604409   4.658008 -12.070657         NA
 4:    3 -17.835538  14.604409   4.658008 -12.070657
 5:    4  11.751944 -17.835538  14.604409   4.658008
 6:    5  14.331069  11.751944 -17.835538  14.604409

considere t=3 . Para esto, t1=2 y el valor de y_past_1 (el valor de y en el punto en el tiempo justo antes del actual t=3 ) es el valor yt1=y2=14.604409 . Análogamente, t2=1 y el valor de y_past_2 (el valor de y dos pasos de tiempo antes del actual t=3 ) es yt2=y1=4.658008 .

Ahora lo que la gente hace como primera toma es calcular un modelo (lineal) con y como variable objetivo y `y_past_1, ..., y_past_k$ como características de entrada. También se denominan variables "retardadas" porque son las mismas que la variable objetivo, pero con un pequeño retraso en el componente temporal.

Ahora vamos a calcular un modelo lineal. Lo que obtengo es esencialmente

y ~ 0.4320*y_past_1 + 0.2457*y_past_2 + y_past_3*0.2361 + 0.3070

enter image description here

¿Cómo es posible que hayamos calculado un modelo lineal pero el resultado no sea lineal? Esto ocurre porque la función time -> y_time no es lineal, es decir, el modelo lineal se aplica a los "pares de valores no lineales (y_past_1, y_past_2, y_past_3) pero, sin embargo, las suma linealmente.

Eso es lo que quiero decir con el modelo de serie temporal simple: Tomar el pasado de alguna variable como entrada para la predicción del nuevo estado.

NB: No hemos discutido el papel de K . Este parámetro funciona como un factor de suavización, es decir, en términos de series de tiempo determina cuánto la predicción será un llamado filtro de paso alto (K pequeño, no filtrar los movimientos bruscos, es decir, las altas frecuencias, K grande entonces las predicciones sigue la función de pecado más suavemente y no es 'engañado' tanto por los movimientos bruscos de la variable objetivo:

K=1: enter image description here

K=10: enter image description here )

1) Me refiero a lo siguiente. Digamos que consideramos el producto PIZZA. Tenemos dos usuarios, A y B. Durante el último año hemos enviado 20 correos publicitarios de pizza a cada uno de estos usuarios. El usuario A respondió 15 veces comprando una pizza y el usuario B no respondió en absoluto. Ahora digamos que durante el día actual volvemos a ver al usuario A y al usuario B y tenemos el disparador para enviarles un email publicitario. Recorremos todos nuestros productos y llegamos al producto pizza. ¿Debemos enviar a A un anuncio de pizza? ¿Y a B? [por supuesto que deberíamos enviar a A el correo electrónico porque tuvo una alta tasa de respuesta pero probablemente no deberíamos enviar a B un anuncio de pizza porque aparentemente a él/ella simplemente no le gusta nuestro anuncio de pizza o la pizza o tiene alguna otra razón para no responder]. De este modo, para cada momento t debemos incluir el pasado t1,...,tK para cada solicitud y cada usuario. Esto significa que no tenemos un "pasado único" para cada usuario, sino que para el entrenamiento tenemos un nuevo "pasado" único para cada solicitud del conjunto de entrenamiento... como en el ejemplo anterior: para cada t , y_past_1 tiene un valor único, a saber yt1 . Sin embargo, en su ejemplo, no tomamos simplemente yt1,...,ytK en cuenta, sino alguna función de la misma, así:

Para cada solicitud dada por el usuario u en la semana t iteramos sobre cada producto p y para cada producto p volvemos K=52 semanas y comprobar la frecuencia con la que enviamos al usuario u un correo electrónico publicitario para el producto p (número sent ) y contamos cuántas veces u respondieron positivamente comprando el producto anunciado en la semana siguiente a la recepción del correo electrónico (número positiveResponses ) y luego calculamos affinity = positiveResponses/sent e incluirlo como una columna para la solicitud actual. De este modo, el modelo debería establecer una regla del tipo "si la afinidad por este producto es alta, debería enviar un anuncio de este producto".

En ese sentido: no se utiliza una columna para cada semana en el pasado, sino que para cada producto se retrocede 52 semanas.

3) Parece que te preocupa que el modelo no pueda averiguar una determinada regla como "sólo si los valores de la columna X y de la columna Y son altos, entonces predice VERDADERO, si no predice FALSO". Sin embargo, cualquiera que sea el modelo que se elija de la "primera liga de complejidad" (es decir, cualquier cosa que no sean los modelos lineales como las redes neuronales, los métodos de refuerzo de árboles como el bosque aleatorio, el refuerzo de gradiente, los métodos geométricos como SVM, ...) estos modelos pueden averiguar regiones arbitrariamente complicadas si los datos lo indican (¡¡probablemente!!). Por ejemplo: para NN con sólo UNA CAPA OCULTA(!) este [creo] es el célebre teorema de Stone Weierstrass ( https://en.wikipedia.org/wiki/Stone%E2%80%93Weierstrass_theorem Las NN con una sola capa oculta forman un álgebra).

Ejemplo: SVM. Navegue con su navegador por https://www.csie.ntu.edu.tw/~cjlin/libsvm/ . Desplázate hasta el applet de java y coloca dos conjuntos diferentes de puntos coloreados y juega un poco con el hiperparámetro C y g y verás resultados como este:

enter image description here

Eso significa que incluso reglas (¡mucho más complicadas!) como las que has formulado arriba acabarán siendo captadas por el modelo. Esa es la razón por la que no me preocuparía demasiado.

EDIT: Código R:

library(data.table)
set.seed(1234)
dt = data.table(time = 0:250)
dt = dt[, y := sin(time/100*2*pi)*30 + rnorm(dt[, .N], mean=0, sd = 10)]
plot(dt$time, dt$y, type="l")

lag = function(x, k, fillUp = NA) {
  if (length(x) > k) {
    fillUpVector = x[1:k]
    fillUpVector[1:k] = fillUp
    return(c(fillUpVector, head(x, length(x)-k)))
  } else {
    if (length(x) > 0) {
      x[1:length(x)] = fillUp
      return(x)
    } else {
      return(x)
    }
  }
}

K = 3
for (k in 1:K) {
  eval(parse(text=paste0("dt = dt[, y_past_", k, " := lag(y, k)]")))
}
train = copy(dt)
train = train[K:dt[, .N]]
train = train[, time := NULL]
model = lm(y ~ ., data = train)
pred = predict.lm(object = model, newdata = train, se.fit = F)
train = train[, PREDICTION := pred]
plot(dt$time, dt$y, type="l")
train = train[, time := K:dt[, .N]]
lines(train$time, train$PREDICTION, col="red", lwd=2)

Saludos,

FW

0 votos

Sólo puedo decir "¡guau! ¡Qué gran respuesta! Creo que ha sido el +1 más meritorio que he dado. (Me tomará un poco de tiempo escudriñar en ella -ya que tengo otra fecha límite pronto- así que por favor tengan paciencia que me tomará un poco de tiempo hasta que la acepte.

0 votos

Conocía el teorema de Stone-Weierstrass. Pero nunca me habría imaginado que se plantearía en un caso de uso como éste. (* se ha quedado sin aliento *). ¿Puedo preguntarle dónde ha aprendido todo esto? ¿En la universidad, en libros, en algunas páginas web? Parece que en la mayoría de los libros (por ejemplo, el ISLR de Hastie y Tibshirani, pero también otros) no se enseña ninguno de estos aspectos más prácticos...

0 votos

@temo: Para ser honesto: Aunque tengo un Dr (equivalente alemán de phd) en matemáticas no aprendí ninguna de esas cosas en la universidad. Apenas leo libros porque la mayoría son torpes y me interesa sobre todo una parte muy pequeña de lo que se escribe. Por eso leo tanto en stats.se.com y veo vídeos de youtube y demás. Por otro lado: todo el tema de la TSA es muy básico y lo aprendí por experiencia: Queríamos predecir los tiempos de llegada de ciertas conexiones de tren y una función útil era "¿cuánto tarda el tren normalmente?". También me dio cuando...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X