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:
Le DFFT dans R est-il une méthode appropriée à utiliser dans mon but? Toute information sur son fonctionnement serait appréciée.
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.
Réponses:
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, let indique 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/2 phases 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:
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
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.
la source
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 fonctiondetrend
(par exemple avec le package pracma ).la source
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.
la source