Réduction de dimensionnalité de série pour la classification Input

8

Je cherche à construire un modèle prédictif où la variable de résultat est binaire et l'entrée est une série temporelle. Pour le rendre plus concret, le modèle prédira si un client se désiste (a quitté l'entreprise; codé 1 ou 0) en fonction du montant qu'il a dépensé avec l'entreprise au cours des 60 derniers jours. Ainsi, les données sont un client par ligne et les colonnes sont un facteur de résultat (1 ou 0) et 60 colonnes supplémentaires pour le montant dépensé dans le temps t-1, t-2 .... t-60.

Voici quelques exemples de données:

#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)

Le modèle réel peut avoir plusieurs de ces séries pour chaque client, donc je dois réduire la dimensionnalité des données pour la série, par exemple au lieu d'utiliser 60 valeurs, je dois réduire cela à une poignée. Bien sûr, je peux utiliser la moyenne, min, max, etc. de la série, mais j'ai lu sur l'utilisation de la transformée de Fourier discrète.

Des questions:

  1. Le DFFT dans R est-il une méthode appropriée à utiliser dans mon but? Toute information sur son fonctionnement serait appréciée.

  2. En supposant que cette fonction R est correcte, comment extraire uniquement les coefficients les plus significatifs pour obtenir une réduction de dimensionnalité?

ADD: Il semble y avoir un consensus sur le fait que l'utilisation de DFFT pour la réduction de dimension n'est pas un choix judicieux, mais il semble que dans l'exploration de données, cette fonction, DWT et SVD sont toutes couramment utilisées: Time Series Mining à partir de la page 20.

B_Miner
la source
un commentaire rapide que j'aurais est que vous pouvez considérer la FFT comme un autre moyen d'obtenir des fonctionnalités pour chaque client. En supposant que vous disposez d'un vecteur d'entités contenant des statistiques récapitulatives basées sur les séries chronologiques de chaque client et d'autres données, vous pouvez compléter votre vecteur d'entités en ajoutant des entités dérivées d'une FFT. Gardez à l'esprit que cela n'est approprié que si la fenêtre sur laquelle vous parlez la FFT est immobile. Sinon, les caractéristiques temporelles telles que les dérivées 1ère et 2ème peuvent être plus appropriées.
BGreene

Réponses:

12

Je ne suis pas sûr que je classerais une transformée de Fourier comme une technique de réduction de dimensionnalité en soi , bien que vous puissiez certainement l'utiliser de cette façon.

Comme vous le savez probablement, une transformée de Fourier convertit une fonction de domaine temporelf(t)dans une représentation du domaine fréquentielF(ω). Dans la fonction d'origine, letindique généralement le temps: par exemple, f (1) peut désigner le solde du compte de quelqu'un le premier jour, ou le volume du premier échantillon de l'enregistrement d'une chanson, tandis que f (2) indique le solde / la valeur d'échantillon du jour suivant). Cependant, l'argumentω dans F(ω) indique généralement la fréquence: F (10) indique la mesure dans laquelle le signal fluctue à 10 cycles / seconde (ou quelles que soient vos unités temporelles), tandis que F (20) indique la mesure dans laquelle il fluctue deux fois plus vite. La transformée de Fourier "fonctionne" en reconstruisant votre signal d'origine sous la forme d'une somme pondérée de sinusoïdes (vous obtenez en fait un "poids", généralement appelé amplitude, et un "décalage", généralement appelé phase, valeurs pour chaque composante de fréquence). L'article de wikipedia est un peu complexe, mais il existe un tas de tutoriels décents qui flottent sur le Web.

La transformée de Fourier, en soi, ne vous permet pas de réduire la dimensionnalité. Si votre signal est de longueurN, vous obtiendrez N/2 amplitudes et N/2phases de retour (1), ce qui n'est clairement pas une énorme économie. Cependant, pour certains signaux, la plupart de ces amplitudes sont proches de zéro ou sont a priori réputées non pertinentes. Vous pourriez alors éliminer les coefficients de ces fréquences, car vous n'en avez pas besoin pour reconstruire le signal, ce qui peut entraîner des économies d'espace considérables (là encore, selon le signal). C'est ce que le livre lié décrit comme une «réduction de dimensionnalité».

Une représentation de Fourier pourrait être utile si:

  1. Votre signal est périodique, et
  2. Les informations utiles sont codées dans la périodicité du signal.

Par exemple, supposons que vous enregistrez les signes vitaux d'un patient. Le signal électrique de l'électrocardiogramme (ou le son d'un stéthoscope) est un signal de grande dimension (disons, 200+ échantillons / seconde). Cependant, pour certaines applications, vous pourriez être plus intéressé par la fréquence cardiaque du sujet , qui est probablement l'emplacement du pic dans la FFT, et donc représentable par un seul chiffre.

Une limitation majeure de la FFT est qu'elle prend en compte la totalité du signal à la fois - elle ne peut pas localiser ses changements. Par exemple, supposons que vous regardiez le coefficient associé à 10 cycles / seconde. Vous obtiendrez des valeurs d'amplitude similaires si

  1. Il y a une oscillation constante mais modérée de 10 Hz dans le signal,
  2. Cette oscillation est deux fois plus importante dans la première moitié du signal, mais totalement absente dans la seconde moitié, et
  3. L'oscillation est totalement absente en première mi-temps, mais deux fois plus importante que n ° 1 en 2ème mi-temps.
  4. (etc)

Je ne connais évidemment pas grand-chose de votre entreprise, mais j'imagine que ces fonctionnalités pourraient être très pertinentes. Une autre limitation majeure de la FFT est qu'elle fonctionne sur une seule échelle de temps. Par exemple, supposons qu'un client visite religieusement votre entreprise tous les deux jours: il a une "fréquence" de 0,5 visite / jour (ou une période de 2 jours). Un autre client peut également venir régulièrement pendant deux jours consécutifs, en retirer deux, puis revenir à nouveau pour les deux prochains. Mathématiquement, le deuxième client "oscille" deux fois plus lentement que le premier, mais je parie que ces deux-là sont également susceptibles de se retourner.

Une approche temps-fréquence permet de contourner ces problèmes en localisant les changements de fréquence et de temps. Une approche simple est la FFT de courte durée, qui divise votre signal en petites fenêtres, puis calcule la transformée de Fourier de chaque fenêtre. Cela suppose que le signal est stationnaire dans une fenêtre, mais change à travers eux. L'analyse en ondelettes est une approche plus puissante (et mathématiquement rigoureuse). Il y a beaucoup de tutoriels sur les ondelettes - les ondelettes au nom charmant pour les enfants sont un bon point de départ, même si c'est un peu beaucoup pour tous, mais les enfants les plus intelligents. Il existe plusieurs packages d'ondelettes pour R, mais leur syntaxe est assez simple (voir page 3 du package d'ondelettesdocumentation pour un). Vous devez choisir une ondelette appropriée pour votre application - cela ressemble idéalement à la fluctuation de l'intérêt pour votre signal, mais une ondelette Morlet peut être un point de départ raisonnable. Comme la FFT, la transformée en ondelettes elle-même ne vous donnera pas beaucoup de réduction de dimensionnalité. Au lieu de cela, il représente votre signal d'origine en fonction de deux paramètres ("échelle", qui est analogue à la fréquence, et "translation", qui s'apparente à la position dans le temps). Comme les coefficients FFT, vous pouvez éliminer en toute sécurité les coefficients dont l'amplitude est proche de zéro, ce qui vous permet de réduire efficacement la dimensionnalité.


Enfin, je voudrais conclure en vous demandant si la réduction de la dimensionnalité est vraiment ce que vous voulez ici. Les techniques que vous avez posées sont essentiellement des moyens de réduire la taille des données tout en les préservant le plus fidèlement possible. Cependant, pour obtenir les meilleures performances de classification, nous voulons généralement collecter et transformer les données pour rendre les fonctionnalités pertinentes aussi explicites que possible, tout en éliminant tout le reste.

Parfois, l'analyse de Fourier ou d'ondelettes est exactement ce qui est nécessaire (par exemple, transformer un signal ECG de haute dimension en une seule valeur de fréquence cardiaque); d'autres fois, vous seriez mieux avec des approches complètement différentes (moyennes mobiles, dérivés, etc.). Je vous encourage à avoir une bonne réflexion sur votre problème réel (et peut-être même à réfléchir aux vendeurs / fidélisation des clients pour voir s'ils ont des intuitions) et à utiliser ces idées pour générer des fonctionnalités, au lieu d'essayer aveuglément un tas de transformations.

Matt Krause
la source
Salut Matt. J'ai posté un ajout avec un lien. Il semble que ces techniques soient utilisées pour réduire les dimensions. Savez-vous par hasard comment utiliser la transformée en ondelettes discrète dans R pour réduire les dimensions?
B_Miner
J'ai fait des modifications massives; Je suggérerais cependant de lire le dernier morceau!
Matt Krause
C'est super Matt merci! Je n'ai pas eu l'occasion de lire entièrement votre réponse mais je le ferai sous peu.
B_Miner
@MattKrause, vous semblez avoir une très bonne compréhension de la transformée de Fourier. J'ai un problème similaire, où je (sur la base de votre message ici) pense qu'il est logique de faire de la transformée de Fourier en tant que technique de réduction de dimensionnalité. Cependant, je ne peux pas savoir comment le faire dans la pratique. Pourriez-vous jeter un œil à stats.stackexchange.com/questions/176283/… ?
pir
Merci, @felbo! Je suis flatté mais je ne suis pas sûr d'avoir beaucoup à ajouter.
Matt Krause
2

Comme Matt l'a dit, je ne suis pas sûr que la DFT produira des fonctionnalités pertinentes pour votre application. Mais comme vous le demandez dans cette question , voici un code R à construire pour des fonctionnalités pour les quantiles de la DFT d'un signal 1D x, en utilisant la fonction detrend(par exemple avec le package 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)
Emile
la source
1

Je n'utiliserais pas du tout la FFT ici, sauf si vous avez un modèle qui suggère que c'est la bonne chose à faire, et, d'après les informations que vous avez fournies, je ne vois aucune raison de croire simplement en regardant la FFT de vos données sont appropriées. Je suggère au lieu de regarder la FFT, qui est probablement une impasse, d'envisager d'autres approches.

Des méthodes plus appropriées peuvent être un filtre de moyenne mobile (par exemple, les ventes moyennes au cours des N derniers jours) ou un filtre de moyenne mobile pondéré (identique sauf si plus de poids est accordé aux valeurs considérées comme plus importantes, soit parce que vous avez un modèle / hypothèse qui prend en charge cela, ou des données réelles qui indiquent que c'est comme ça dans le passé. Par exemple, vous pouvez pondérer des chiffres plus récents, ou vous pouvez pondérer des données du lundi parce que vous avez des données qui suggèrent que les ventes du lundi sont prédictives pour quelque raison).

Une autre approche pourrait consister à simplement utiliser la régression (en particulier la régression logistique). Cela peut sembler traditionnel et ennuyeux, mais cela fonctionne.

Bjorn Roche
la source