8 votos

Reducción de la dimensionalidad de las series para la clasificación Entrada

Quiero construir un modelo predictivo en el que la variable de resultado sea binaria y la entrada sean series temporales. Para hacerlo más concreto, el modelo predecirá si un cliente abandona la empresa (codificado como 1 o 0) en función de la cantidad que gastó con la empresa en los 60 días anteriores. Por tanto, los datos son un cliente por fila y las columnas son un factor de resultado (1 ó 0) y 60 columnas adicionales para la cantidad gastada en el tiempo t-1, t-2....t-60.

He aquí algunos datos de ejemplo:

#create the data a series of length 60 and a class ID
sc <- read.table("http://kdd.ics.uci.edu/databases/synthetic_control/synthetic_control.data", header=F, sep="")

#binary class lable
classId <- as.factor(c(rep(0,300), rep(1,300)))
newSc <- data.frame(cbind(classId, sc))
newSc$ID<-seq(1,600,1)

El modelo real puede tener muchas de estas series para cada cliente, por lo que necesito reducir la dimensionalidad de los datos para las series, por ejemplo, en lugar de utilizar 60 valores, necesito reducir esto a un puñado. Por supuesto, puedo utilizar la media, el mínimo, el máximo, etc. de las series, pero he estado leyendo sobre el uso de la transformada discreta de Fourier.

Preguntas:

  1. ¿Está el DFFT en R un método adecuado para mi propósito? Agradecería cualquier información sobre su funcionamiento.

  2. Suponiendo que esta función de R sea correcta, ¿cómo se extraen sólo los coeficientes más significativos para lograr una reducción de la dimensionalidad?

ADD: Parece haber un consenso en que el uso de DFFT para la reducción de la dimensión no es una buena elección, pero parece que en la minería de datos, esta función, DWT y SVD se utilizan comúnmente: Minería de series temporales a partir de la página 20.

12voto

Rob Allen Puntos 486

No estoy seguro de clasificar la transformada de Fourier como técnica de reducción de la dimensionalidad. propiamente dicho aunque sí que puedes utilizarlo de esa manera.

Como probablemente sepas, una transformada de Fourier convierte un dominio del tiempo función $f(t)$ en un dominio de frecuencia representación $F(\omega)$ . En la función original, el $t$ normalmente denota tiempo: por ejemplo, f(1) podría denotar el saldo de la cuenta de alguien el primer día, o el volumen de la primera muestra de la grabación de una canción, mientras que f(2) indica el valor del saldo/muestra del día siguiente). Sin embargo, el argumento $\omega$ en $F(\omega$ ) suele indicar la frecuencia: F(10) indica hasta qué punto la señal fluctúa a 10 ciclos/segundo (o cualquiera que sean sus unidades temporales), mientras que F(20) indica hasta qué punto fluctúa el doble de rápido. La transformada de Fourier "funciona" reconstruyendo la señal original como una suma ponderada de sinusoides (para cada componente de frecuencia se obtiene un "peso", normalmente llamado amplitud, y un "desplazamiento", normalmente llamado fase). El artículo de wikipedia es un poco complejo, pero hay un montón de tutoriales decentes dando vueltas por la red.

La transformada de Fourier, por sí sola, no consigue reducir la dimensionalidad. Si su señal es de longitud $N$ obtendrá alrededor de $N/2$ amplitudes y $N/2$ fases de vuelta (1), lo que evidentemente no supone un gran ahorro. Sin embargo, para algunas señales, la mayoría de esas amplitudes son próximas a cero o son a priori se sabe que son irrelevantes. A continuación, se podrían desechar los coeficientes de estas frecuencias, ya que no se necesitan para reconstruir la señal, lo que puede suponer un ahorro considerable de espacio (de nuevo, dependiendo de la señal). Esto es lo que el libro enlazado describe como "reducción de dimensionalidad".

Una representación de Fourier podría ser útil si:

  1. Su señal es periódica, y
  2. La información útil está codificada en la periodicidad de la señal.

Por ejemplo, supongamos que está registrando las constantes vitales de un paciente. La señal eléctrica del electrocardiograma (o el sonido de un estetoscopio) es una señal de alta dimensión (digamos, más de 200 muestras/segundo). Sin embargo, para algunas aplicaciones, podría interesarle más el corazón del sujeto tarifa que probablemente sea la ubicación del pico en la FFT y, por tanto, representable por un solo dígito.

Una limitación importante de la FFT es que considera toda la señal a la vez: no puede localizar cambios en ella. Por ejemplo, supongamos que observa el coeficiente asociado a 10 ciclos/segundo. Obtendrá valores de amplitud similares si

  1. Hay una oscilación consistente, pero de tamaño moderado, de 10 Hz en la señal,
  2. Esa oscilación es dos veces mayor en la primera mitad de la señal, pero totalmente ausente en la segunda mitad, y
  3. La oscilación está totalmente ausente en la primera mitad, pero es dos veces mayor que la nº 1 en la segunda mitad.
  4. (y así sucesivamente)

Obviamente no sé mucho sobre su negocio, pero me imagino que estas podrían ser características muy relevantes. Otra limitación importante de la FFT es que funciona en una única escala temporal. Por ejemplo, supongamos que un cliente visita religiosamente su negocio cada dos días: tiene una "frecuencia" de 0,5 visitas/día (o un periodo de 2 días). Otro cliente también puede venir sistemáticamente dos días seguidos, tomarse dos de descanso y volver a visitarle los dos siguientes. Matemáticamente, el segundo cliente "oscila" el doble de despacio que el primero, pero yo apostaría a que estos dos tienen las mismas probabilidades de darse de baja.

Un enfoque de tiempo-frecuencia ayuda a sortear estos problemas localizando los cambios tanto en frecuencia como en tiempo. Un método sencillo es la FFT en tiempo corto, que divide la señal en pequeñas ventanas y calcula la transformada de Fourier de cada ventana. Esto supone que la señal es estacionaria dentro de una ventana, pero cambia a través de ellas. El análisis de ondículas es un método más potente (y matemáticamente riguroso). Hay muchos tutoriales sobre las ondículas: el encantadoramente llamado Wavelets para niños es un buen punto de partida, aunque sea demasiado para todos los niños, salvo para los más listos. Existen varios paquetes wavelet para R, pero su sintaxis es bastante sencilla (véase la página 3 de paquete wavelet documentación para uno). Lo ideal es que se parezca a la fluctuación de interés de la señal, pero una ondícula Morlet podría ser un punto de partida razonable. Al igual que la FFT, la transformada wavelet en sí misma no reduce mucho la dimensionalidad. En su lugar, representa la señal original como una función de dos parámetros ("escala", que es análoga a la frecuencia, y "traslación", que es similar a la posición en el tiempo). Al igual que los coeficientes de la FFT, se pueden descartar con seguridad los coeficientes cuya amplitud sea cercana a cero, lo que proporciona una reducción efectiva de la dimensionalidad.


Por último, quiero concluir preguntándole si la reducción de la dimensionalidad es realmente lo que quiere aquí. Las técnicas por las que has preguntado son esencialmente formas de reducir el tamaño de los datos conservándolos lo más fielmente posible. Sin embargo, para obtener el mejor rendimiento en la clasificación, normalmente queremos recoger y transformar los datos para que las características relevantes sean lo más explícitas posible, descartando todo lo demás.

A veces, el análisis de Fourier o de Wavelet es exactamente lo que se necesita (por ejemplo, convertir una señal de electrocardiograma de alta dimensionalidad en un único valor de frecuencia cardiaca); otras veces, sería mejor utilizar enfoques completamente distintos (medias móviles, derivadas, etc.). Te animo a que reflexiones sobre tu problema real (e incluso a que hagas una lluvia de ideas con el personal de ventas/retención de clientes para ver si tienen alguna intuición) y utilices esas ideas para generar funciones, en lugar de probar a ciegas un montón de transformaciones.

2voto

John Puntos 151

Como ha dicho Matt, no estoy seguro de que el DFT produzca características relevantes para su aplicación. Pero como preguntas en este pregunta A continuación se muestra un código R para construir las características de los cuantiles de la DFT de una señal 1D x utilizando la función detrend (por ejemplo, con el paquete pracma ).

l <- length(x)
detrended <- detrend(x)
dft <- fft(detrended)/l
amplitude <- 2*abs(dft[1:l/2])
plot(amplitude, type='l')
quantiles <- quantile(amplitude)

1voto

Bjorn Roche Puntos 186

Yo no utilizaría la FFT en este caso a menos que disponga de algún modelo que sugiera que es lo correcto, y, por la información que ha proporcionado, no veo ninguna razón para creer que sea apropiado limitarse a mirar la FFT de sus datos. Le sugiero que en lugar de buscar en la FFT, que es probable que sea un callejón sin salida, considere otros enfoques.

Métodos más apropiados podrían ser un filtro de media móvil (por ejemplo, la media de ventas en los últimos N días) o un filtro de media móvil ponderada (lo mismo, salvo que se da más peso a los valores que se consideran más significativos, ya sea porque se dispone de un modelo/hipótesis que lo respalda o de datos reales que indican que así ha sido en el pasado. Por ejemplo, se pueden ponderar las cifras más recientes, o se pueden ponderar los datos de los lunes porque se tienen datos que sugieren que las ventas de los lunes son predictivas por alguna razón).

Otro enfoque podría ser simplemente utilizar la regresión (especialmente la regresión logística). Puede parecer tradicional y aburrido, pero funciona.

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