Utilisation de Holt-Winters pour la prévision en Python

8

[J'ai d'abord posté cette question sur Stack Overflow ici mais je n'ai reçu aucune réponse, alors j'ai pensé essayer ici. Toutes mes excuses si la rediffusion n'est pas autorisée.]

J'ai essayé d'utiliser cette implémentation de l'algorithme Holt-Winters pour la prévision de séries chronologiques en Python, mais j'ai rencontré un barrage routier ... en gros, pour certaines séries d'entrées (positives), il prévoit parfois des nombres négatifs, ce qui devrait clairement pas le cas. Même si les prévisions ne sont pas négatives, elles sont parfois extrêmement imprécises - des ordres de grandeur supérieurs / inférieurs à ce qu'ils devraient être. Donner à l'algorithme plus de périodes de données avec lesquelles travailler ne semble pas aider et, en fait, aggrave souvent les prévisions.

Les données que j'utilise ont les caractéristiques suivantes, ce qui pourrait être un problème:

  • Très fréquemment échantillonné (un point de données toutes les 15 minutes, par opposition aux données mensuelles comme l'exemple utilise) - mais d'après ce que j'ai lu, l'algorithme Holt-Winters ne devrait pas avoir de problème avec cela. Peut-être que cela indique un problème avec la mise en œuvre?

  • A plusieurs périodicités - il y a des pics quotidiens (c'est-à-dire tous les 96 points de données) ainsi qu'un cycle hebdomadaire de données de week-end étant nettement inférieur aux données de semaine - par exemple, les jours de semaine peuvent culminer autour de 4000 mais les week-ends culminent à 1000 - mais même lorsque je ne donne que les données de la semaine, je rencontre le problème des nombres négatifs.

Y a-t-il quelque chose qui me manque avec l'implémentation ou mon utilisation de l'algorithme Holt-Winters en général? Je ne suis pas un statisticien, j'utilise donc les valeurs «par défaut» d'alpha, bêta et gamma indiquées dans le lien ci-dessus - est-ce susceptible d'être le problème? Quelle est la meilleure façon de calculer ces valeurs?

Ou ... y a-t-il un meilleur algorithme à utiliser ici que Holt-Winters? En fin de compte, je veux juste créer des prévisions raisonnables à partir de données historiques ici. J'ai essayé le lissage exponentiel simple et double mais (pour autant que je sache), ni l'un ni l'autre ne prend en charge la périodicité des données.

J'ai également envisagé d'utiliser le package de prévisions R à la place via rpy2 - cela me donnerait-il de meilleurs résultats? J'imagine que je devrais encore calculer les paramètres et ainsi de suite, donc ce ne serait une bonne idée que si mon problème actuel réside dans la mise en œuvre de l'algorithme ...?

Toute aide / entrée serait grandement appréciée!

Wern
la source

Réponses:

4

Je pense que le package de prévisions R que vous avez mentionné convient mieux à ce problème que d'utiliser simplement Holt-Winters. Les deux fonctions qui vous intéressent sont ets () et auto.arima () . ets () s'adaptera à un modèle de lissage exponentiel, y compris Holt-Winters et plusieurs autres méthodes. Il choisira les paramètres (alpha, bêta et gama) pour une variété de modèles, puis renverra celui avec l'AIC le plus bas (ou BIC si vous préférez). auto.arima () fonctionne de manière similaire.

Cependant, comme l'a souligné IrishStat, ces types de modèles peuvent ne pas convenir à votre analyse. Dans ce cas, essayez de calculer certaines covariables, telles que les variables muettes pour les week-ends, les vacances et leurs interactions. Une fois que vous avez spécifié des covariables qui ont du sens, utilisez auto.arima () pour trouver un modèle ARMAX, puis Forecast () pour faire des prédictions. Vous vous retrouverez probablement avec quelque chose de bien mieux qu'un simple modèle Holt-Winters en python avec des paramètres par défaut.

Vous devez également noter que ets () et auto.arima peuvent s'adapter à des modèles saisonniers, mais vous devez formater vos données sous forme de séries chronologiques saisonnières. Faites-moi savoir si vous avez besoin d'aide à ce sujet.

Vous pouvez en savoir plus sur le package de prévisions ici .

Zach
la source
Comment puis-je procéder pour calculer les covariables?
Wern
@Wern: Il semble que vous ayez besoin d'au moins 2 ensembles de covariables: un ensemble de variables fictives pour l'heure et une variable représentant le week-end par rapport au jour de la semaine. En d'autres termes, vous avez besoin d'une matrice des variables 0/1 suivantes: H1, H2, H3, H4 ... H23, Weekday, où H1 = 1 si hour == 1, et 0 sinon. H2 = 2 si heure == 2, et 0 sinon, etc. Weekday = 1 en semaine et 0 le week-end. En outre, vous pouvez inclure: une interaction entre le jour de la semaine et l'heure, le jour de la semaine, le mois de l'année, les vacances et d'autres interactions. Faites-moi savoir si vous avez besoin d'aide pour le faire dans R. Commencez par les variables horaires et les jours fériés.
Zach
@Wern: Après avoir relu votre question, il semble que vous ayez des données de 15 minutes, donc plutôt que de calculer H1-H23, vous devriez calculer I1-I95, où "intervalle" compte les intervalles de 15 minutes depuis le début de la journée. Assurez-vous également d'omettre 1 variable de cet ensemble de variables, par exemple H24 ou I96. Quel type de données regardez-vous? Trafic Web? Charge d'électricité?
Zach
Hmm, je pense que je sais ce que tu veux dire. Je vais l'essayer et je vous le ferai savoir - merci! Les données sont du trafic Web.
Wern
@Wern si vous aimez ma réponse (ou celle d'IrishStat), n'hésitez pas à en accepter une en cliquant sur la coche verte.
Zach
7

Le problème peut être que Holt-Winters est un modèle spécifique et peut ne pas s'appliquer à vos données. Le modèle HW suppose entre autres les éléments suivants. a) une et une seule tendance b) aucun changement de niveau dans les données, c'est-à-dire aucun changement d'interception 3) que les paramètres saisonniers ne varient pas dans le temps 4) pas de valeurs aberrantes 5) pas de structure autorégressive ou de structure de modèle adaptative 6) erreurs de modèle qui ont une variance constante Et bien sûr 7) que l'histoire cause l'avenir, c'est-à-dire pas d'incorporation de prix / promotions, événements, etc. comme variables d'aide

D'après votre description, il me semble qu'une approche à fréquences mixtes pourrait être nécessaire. J'ai vu des problèmes de séries chronologiques où les effets sur l'heure et les effets sur le jour de la semaine ont des termes d'interaction importants. Vous essayez de forcer vos données dans une structure insuffisante, c'est-à-dire non généralisée. L'estimation des paramètres et le choix à partir d'un petit ensemble de modèles ne remplacent pas l'identification du modèle. Vous voudrez peut-être lire un article sur les différentes approches de la modélisation automatique sur www.autobox.com/pdfs/catchword.pdf. En termes d'approche plus générale, je suggère que vous envisagiez un modèle ARMAX, autrement connu sous le nom de fonction de transfert, qui assouplit les hypothèses susmentionnées.

IrishStat
la source
Hmm vous avez de très bons points ... mes données contiennent également beaucoup de valeurs aberrantes et sont sujettes à des variations importantes sur des événements comme Noël ou le Nouvel An. Mais que voulez-vous dire par «structure de modèle autorégressive ou adaptative»? Je vais essayer ARMAX, merci!
Wern
@Wern Une composante adaptative / autorégressive existe lorsque les "prédicteurs" incluent soit la mémoire (valeurs précédentes) de la série endogène (Y) ou la série exogène OU les valeurs décalées du terme d'erreur. Il est important d'identifier et de modéliser, avec des effets potentiels de plomb, contemporains et de décalage autour de CHACUNE des Fêtes. De plus, il peut y avoir une cause attribuable à certains jours du mois, en fonction du jour de la semaine. Par exemple, le 5 du mois peut être important étant donné que ce n'était pas un week-end. Nous avons réussi à modéliser / identifier automatiquement cette structure.
IrishStat