Necesito ayuda sobre cuál debería ser mi próximo paso en un algoritmo que estoy diseñando.
Debido a los NDA, no puedo revelar mucho, pero intentaré ser genérico y comprensible.
Básicamente, después de varios pasos en los algoritmos, tengo esto:
Para cada cliente que tengo y los eventos que realizan durante un mes, durante los primeros pasos he agrupado los eventos en varias categorías (cada cliente tendrá los eventos separados en categorías que van de 1 a x, siendo x entre 1 a 25, generalmente las primeras categorías tienen más densidad de eventos que las otras).
Para cada categoría y cliente, he creado una serie temporal que agrega los eventos del mes por hora (obteniendo patrones de cuándo se realizan estos eventos). También estoy usando un par de variables de normalización basadas en el número de días durante un mes (30 días) que el chico realiza al menos un evento, y el número de días con al menos un evento sobre el total de días con al menos uno evento (agregando todos los clústeres). El primero me da una relación de cuán activo es el cliente durante el mes, y el segundo compara la categoría con los demás.
La mesa final se ve así
|*Identifier*| *firstCat* | *feature1* | *feature2* | { *(TIME SERIES)* }
CustomerID | ClusterID | DaysOver30 | DaysOverTotal | Events9AM Events10AM ...
xx | 1 | 0,69 | 0,72 | 0,2 0,13 ...
xx | 2 | 0,11 | 0,28 | 0,1 0,45 ...
xy | 1 | 0,23 | 0,88 | 0,00 0,60 ...
xy | 2 | 0,11 | 0,08 | 1,00 0,00 ...
xy | 3 | 0,10 | 0,04 | 0,40 0,60 ...
Las variables de series de tiempo son el porcentaje sobre el total de eventos por día en cada categoría específica (esto significa que por cada fila que suma todas las variables debe ser 1). La razón para hacerlo así es porque, por ejemplo, una serie temporal con eventos 0 0 0 1 0
y 1 1 1 2 1
son completamente diferentes, y la normalización a la normalidad daría resultados similares. Y debido al alto sesgo entre las diferentes categorías, verifico los valores en las series de tiempo independientemente con los demás.
Lo que tengo que hacer ahora es identificar estas categorías (recuerde, pueden ser de 1 a x siendo x cualquier número de 1 a 25) en 3 etiquetas: etiqueta A, etiqueta B y Ninguna de ellas. Al observar estas variables, puedo identificar manualmente a qué etiqueta pertenecen, y la idea es identificarlo manualmente tanto como pueda y usar cualquier algoritmo clasificador para aprender de eso e identificarlos a todos.
Mi idea era usar múltiples regresiones logísticas en la tabla, pero todas las variables de las series de tiempo están correlacionadas (ya que son una combinación lineal entre sí), por lo que pensé que sería mejor usar un algoritmo de agrupación solo en las series de tiempo usando euclidiana. distancia para clasificar los diferentes patrones y usar el resultado y las otras dos variables de normalización en la regresión logística.
La otra preocupación que tengo es que este enfoque toma cada fila independientemente de las demás, y en teoría, para cada cliente debe haber solo 0 o 1 etiqueta A, 0 o 1 etiqueta B y el resto de ellos debe ser Ninguno (otro El consejo es que normalmente las etiquetas A y B se encuentran entre las primeras categorías, ya que depende en gran medida de las características de normalización (si los días sobre el total son altos, existe una alta posibilidad de que la fila sea A o B, dependiendo del patrón de serie temporal) .
Editar: Esto ya no es una preocupación, solo realizaré dos regresiones logísticas diferentes, una para la Etiqueta A u Otra y otra para la Etiqueta B u otra, con las probabilidades de resultado que puedo seleccionar solo lo mejor de cada una.
El conjunto de datos es enorme y el algoritmo final debe aplicarse usando SQL (en Teradata), pero para obtener los coeficientes de la regresión logística, o los centros de agrupamiento, obtengo una muestra y uso R.