Régression à fenêtre déroulante : Une approche simple pour les prédictions de la prochaine valeur des séries temporelles

Srinath Perera
Srinath Perera

Follow

Jun 3, 2016 – 7 min lu

Donné une série temporelle, la prédiction de la prochaine valeur est un problème qui a fasciné beaucoup de programmeurs pendant longtemps. Évidemment, une raison clé de cette attention est les marchés boursiers, qui ont promis des richesses incalculables si vous pouvez le craquer. Cependant, à l’exception de quelques-uns (voir Un entretien rare avec le mathématicien qui a craqué Wall Street), ces richesses se sont révélées insaisissables.

Grâce à l’IoT (Internet des objets), l’analyse des séries temporelles est sur le point de revenir sur le devant de la scène. L’IoT nous permet de placer des capteurs omniprésents partout, de collecter des données et d’agir sur ces données. Les dispositifs IoT collectent des données à travers le temps et les données résultantes sont presque toujours des données de séries temporelles.

Suivant sont quelques cas d’utilisation pour la prédiction de séries temporelles.

  1. Prédiction de la charge électrique
  2. Prédiction de la demande pour les magasins de détail
  3. Services (par ex. comptoirs d’enregistrement des compagnies aériennes, bureaux gouvernementaux) prédiction de la clientèle
  4. Prévision des revenus
  5. Surveillance vitale des soins en USI
  6. Prédiction des rendements et des cultures

Explorons les techniques disponibles pour les prévisions de séries temporelles.

La première question est que « n’est-ce pas la régression ? ». C’est proche, mais ce n’est pas la même chose que la régression. Dans une série temporelle, chaque valeur est affectée par les valeurs qui précèdent juste cette valeur. Par exemple, s’il y a beaucoup de trafic à 4 h 55 à un carrefour, il y a de fortes chances qu’il y ait également du trafic à 4 h 56. C’est ce qu’on appelle l’autocorrélation. Si vous effectuez une régression, vous ne considérerez que x(t) alors qu’en raison de l’autocorrélation, x(t-1), x(t-2), … affecteront également le résultat. Nous pouvons donc considérer les prévisions de séries temporelles comme des régressions qui tiennent compte de l’autocorrélation également.

Pour cette discussion, considérons « l’ensemble de données de consommation électrique des ménages individuels », qui sont des données collectées auprès d’un ménage pendant quatre ans à intervalles d’une minute. Ne considérons que trois champs, et l’ensemble de données ressemblera à ce qui suit.

La première question est de savoir comment mesurer le succès. Nous le faisons via une fonction de perte, où nous essayons de minimiser la fonction de perte. Il existe plusieurs fonctions de perte, et elles ont des avantages et des inconvénients différents.

  1. MAE ( Mean absolute error) – ici toutes les erreurs, grandes et petites, sont traitées de la même manière
  2. Root Mean Square Error (RMSE) – cela pénalise les grandes erreurs en raison du terme au carré. Par exemple, avec des erreurs et , la MSE pour les deux sera de 0,5 alors que la RMSE est de 0,5 et. 0,45.
  3. MAPE (Mean Absolute Percentage Error) – Comme les valeurs #1 et #2 dépendent de la plage de valeurs de la variable cible, elles ne peuvent pas être comparées entre ensembles de données. En revanche, MAPE est un pourcentage, donc relatif. C’est comme la précision dans un problème de classification, où tout le monde sait qu’une précision de 99% est assez bonne.
  4. RMSEP ( Root Mean Square Percentage Error) – C’est un hybride entre #2 et #3.
  5. Taux d’erreur des prédictions presque correctes (AC_errorRate) – le pourcentage de prédictions qui est à moins de %p de pourcentage de la vraie valeur

Si nous essayons de prévoir la prochaine valeur, nous avons plusieurs choix.

L’étalon-or pour ce genre de problèmes est le modèle ARIMA. L’idée centrale derrière ARIMA est de briser la série temporelle en différentes composantes telles que la composante de tendance, la composante de saisonnalité, etc et d’estimer soigneusement un modèle pour chaque composante. Voir Utiliser R pour l’analyse des séries temporelles pour un bon aperçu.

Cependant, ARIMA a un problème malheureux. Il a besoin d’un expert ( un bon diplôme de statistique ou un étudiant diplômé) pour calibrer les paramètres du modèle. Si vous voulez faire de l’ARIMA multivarié, c’est-à-dire tenir compte de plusieurs champs, alors les choses deviennent encore plus difficiles.

Cependant, R a une fonction appelée auto.arima, qui estime les paramètres du modèle pour vous. J’ai essayé cela.

library("forecast")
....
x_train <- train data set
X-test <- test data set
..
powerTs <- ts(x_train, frequency=525600, start=c(2006,503604))
arimaModel <- auto.arima(powerTs)
powerforecast <- forecast.Arima(arimaModel, h=length(x_test))
accuracy(powerforecast)

Vous pouvez trouver une discussion détaillée sur la façon de faire ARIMA à partir des liens donnés ci-dessus. Je n’ai utilisé que 200k de l’ensemble de données car nous nous concentrons sur les ensembles de données de taille moyenne. Cela a donné un MAPE de 19,5.

Les caractéristiques temporelles

La deuxième approche est de venir avec une liste de caractéristiques qui capture les aspects temporels afin que l’information d’autocorrélation ne soit pas perdue. Par exemple, l’analyse technique boursière utilise des caractéristiques construites à partir des moyennes mobiles. Dans le cas simple, un analyste suivra les moyennes mobiles de 7 jours et de 21 jours et prendra des décisions en fonction des points de croisement entre ces valeurs.

Voici quelques idées de fonctionnalités

  1. collection de moyennes mobiles/ médianes(par ex.par exemple 7, 14, 30, 90 jours)
  2. Temps depuis un certain événement
  3. Temps entre deux événements
  4. Mesures mathématiques telles que l’entropie, les scores Z, etc.
  5. X(t) élevé à des fonctions telles que puissance(X(t),n), cos((X(t)/k)) etc

Une astuce commune que les gens utilisent est d’appliquer ces caractéristiques avec des techniques comme Random Forest et Gradient Boosting, qui peuvent fournir l’importance relative des caractéristiques. Nous pouvons utiliser ces données pour garder les bonnes caractéristiques et abandonner les caractéristiques inefficaces.

Je ne vais pas m’attarder trop longtemps sur ce sujet. Cependant, avec un peu de travail, cette méthode a montré qu’elle donnait de très bons résultats. Par exemple, la plupart des compétitions sont gagnées en utilisant cette méthode (par exemple http://blog.kaggle.com/2016/02/03/rossmann-store-sales-winners-interview-2nd-place-nima-shahbazi /).

L’inconvénient, cependant, est que l’artisanat des caractéristiques est un art noir. Il faut beaucoup de travail et d’expérience pour façonner les caractéristiques.

Rouler la régression basée sur Windows

Maintenant, nous sommes arrivés à la partie intéressante. Il semble qu’il y ait une autre méthode qui donne d’assez bons résultats sans beaucoup de coups de main.

L’idée est de prédire X(t+1), prochaine valeur dans une série temporelle, nous alimentons non seulement X(t), mais X(t-1), X(t-2) etc au modèle. Une idée similaire a été discutée dans Rolling Analysis of Time Series bien qu’elle soit utilisée pour résoudre un problème différent.

Regardons un exemple. Disons que nous avons besoin de prédire x(t+1) étant donné X(t). Alors les variables source et cible ressembleront à ce qui suit.

Le jeu de données ressemblerait à ce qui suit après avoir été transformé avec une fenêtre glissante de trois.

Puis, nous utiliserons l’ensemble de données transformées avec un algorithme de régression bien connu comme la régression linéaire et la régression Random Forest. On s’attend à ce que l’algorithme de régression détermine les coefficients d’autocorrélation de X(t-2) à X(t).

Par exemple, avec l’ensemble de données ci-dessus, l’application de la régression linéaire sur l’ensemble de données transformées en utilisant une fenêtre glissante de 14 points de données a donné les résultats suivants. Ici, AC_errorRate considère que la prévision est correcte si elle est dans les 10% de la valeur réelle.

LR AC_errorRate=44.0 RMSEP=29.4632 MAPE=13.3814 RMSE=0.261307

C’est assez intéressant car cela bat l’auto ARIMA de la bonne manière ( MAPE 0,19 vs 0,13 avec des fenêtres roulantes).

Donc, nous avons seulement essayé la régression linéaire jusqu’à présent. Ensuite, j’ai essayé plusieurs autres méthodes, et les résultats sont donnés ci-dessous.

La régression linéaire fait toujours assez bien, cependant, elle est faible sur le maintien du taux d’erreur dans les 10%. L’apprentissage profond est meilleur sur cet aspect, mais il a fallu le régler sérieusement. Veuillez noter que les tests sont effectués avec 200k points de données, car je me concentre principalement sur de petits ensembles de données.

J’ai obtenu les meilleurs résultats à partir d’un réseau neuronal avec 2 couches cachées de taille 20 unités dans chaque couche avec zéro dropouts ou régularisation, fonction d’activation « relu », et optimiseur Adam(lr=0,001) fonctionnant pendant 500 époques. Le réseau est implémenté avec Keras. Tout en accordant, j’ai trouvé des articles et assez utile.

Puis j’ai essayé la même idée avec quelques ensembles de données supplémentaires.

  1. Données sur la production de lait ( petit < 200 points de données)
  2. Données sur le partage de vélos (environ 18 000 points de données)
  3. Taux de change USD/Euro ( environ 6500 points de données)
  4. Prix des actions Apple (environ 13000 points de données)

Les prévisions sont faites comme des séries temporelles univariées. C’est-à-dire que nous ne considérons que les horodatages et la valeur que nous prévoyons. Toute valeur manquante est imputée en utilisant le padding ( en utilisant la valeur la plus récente). Pour tous les tests, nous avons utilisé une fenêtre de taille 14 pour comme fenêtre glissante.

Les tableaux suivants montrent les résultats. Ici, à l’exception d’Auto.Arima, les autres méthodes utilisant un ensemble de données basé sur une fenêtre roulante.

Il n’y a pas de gagnant clair. Cependant, la méthode de la fenêtre roulante que nous avons discutée couplée à un algorithme de régression semble fonctionner assez bien.

Conclusion

Nous avons discuté de trois méthodes : ARIMA, Utilisation des caractéristiques pour représenter les effets du temps, et Fenêtres roulantes pour faire des prévisions de la valeur suivante de séries temporelles avec des ensembles de données de taille moyenne.

Parmi les trois, la troisième méthode fournit de bons résultats comparables au modèle ARIMA automatique bien qu’elle nécessite une prise en main minimale de la part de l’utilisateur final.

C’est pourquoi nous pensons que la « régression basée sur la fenêtre glissante » est un ajout utile pour le sac d’astuces du prévisionniste !

Cependant, cela ne discrédite pas ARIMA, car avec un réglage expert, il fera beaucoup mieux. Dans le même temps, avec des caractéristiques artisanales, les méthodes deux et trois feront également mieux.

Une considération cruciale est de choisir la taille de la fenêtre pour la méthode de la fenêtre roulante. Souvent, nous pouvons avoir une bonne idée à partir du domaine. L’utilisateur peut également faire une recherche de paramètres sur la taille de la fenêtre.

Suivant, il y a quelques choses qui nécessitent une exploration plus approfondie.

  • Pouvons-nous utiliser RNN et CNN ? J’ai essayé RNN, mais je n’ai pas pu obtenir de bons résultats jusqu’à présent.
  • Il pourrait être utile d’alimenter d’autres caractéristiques telles que l’heure du jour, le jour de la semaine, et aussi les moyennes mobiles de différentes fenêtres de temps.
  1. Un aperçu des algorithmes d’optimisation par descente de gradient
  2. CS231n Réseaux neuronaux convolutifs pour la reconnaissance visuelle

Si vous avez apprécié ce post, vous pourriez également trouver les suivants intéressants.

  • Introduction à la détection des anomalies : Concepts et techniques
  • Chronique du Big Data : Une comédie technique

Aussi, consultez certains de mes billets les plus lus et mes conférences (vidéos). Parlez-moi à @srinath_perera ou trouvez-moi.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.