Verwenden von Holt-Winters für Prognosen in Python

8

[Ich stellte zunächst diese Frage zu Stack Overflow hier aber nicht bekam keine Antworten, so dass ich dachte , ich würde hier versuchen , über. Entschuldigung, wenn Reposting nicht erlaubt ist.]

Ich habe versucht, diese Implementierung des Holt-Winters-Algorithmus für die Vorhersage von Zeitreihen in Python zu verwenden, bin aber auf eine Straßensperre gestoßen ... Grundsätzlich werden für einige Reihen von (positiven) Eingaben manchmal negative Zahlen vorhergesagt, was eindeutig sein sollte nicht der Fall sein. Selbst wenn die Prognosen nicht negativ sind, sind sie manchmal sehr ungenau - Größenordnungen höher / niedriger als sie sein sollten. Es scheint nicht hilfreich zu sein, dem Algorithmus mehr Datenperioden zur Verfügung zu stellen, mit denen er arbeiten kann, und verschlechtert die Prognose häufig.

Die von mir verwendeten Daten weisen die folgenden Merkmale auf, die Probleme verursachen können:

  • Sehr häufig abgetastet (ein Datenpunkt alle 15 Minuten im Gegensatz zu monatlichen Daten, wie im Beispiel verwendet) - aber nach dem, was ich gelesen habe, sollte der Holt-Winters-Algorithmus damit kein Problem haben. Vielleicht deutet das auf ein Problem mit der Implementierung hin?

  • Hat mehrere Periodizitäten - es gibt tägliche Spitzen (dh alle 96 Datenpunkte) sowie einen wöchentlichen Zyklus von Wochenenddaten, der deutlich unter den Wochentagsdaten liegt - zum Beispiel können Wochentage Spitzenwerte um 4000, Wochenenden Spitzenwerte bei 1000 erreichen - aber selbst wenn ich nur gebe Bei Wochentagsdaten stoße ich auf das Problem der negativen Zahlen.

Fehlt mir etwas bei der Implementierung oder der Verwendung des Holt-Winters-Algorithmus im Allgemeinen? Ich bin kein Statistiker und verwende daher die im obigen Link angegebenen Standardwerte für Alpha, Beta und Gamma. Ist dies wahrscheinlich das Problem? Was ist ein besserer Weg, um diese Werte zu berechnen?

Oder ... gibt es hier einen besseren Algorithmus als Holt-Winters? Letztendlich möchte ich hier nur sinnvolle Prognosen aus historischen Daten erstellen. Ich habe versucht, einfach und doppelt exponentiell zu glätten, aber (soweit ich weiß) unterstützt keine Periodizität in Daten.

Ich habe auch versucht , das R- Prognosepaket stattdessen über rpy2 zu verwenden - würde das mir bessere Ergebnisse bringen? Ich stelle mir vor, ich müsste noch die Parameter berechnen und so weiter, also wäre es nur eine gute Idee, wenn mein aktuelles Problem in der Implementierung des Algorithmus liegt ...?

Jede Hilfe / Eingabe wäre sehr dankbar!

Wern
quelle

Antworten:

4

Ich denke, das von Ihnen erwähnte R-Prognosepaket passt besser zu diesem Problem als nur die Verwendung von Holt-Winters. Die beiden Funktionen, an denen Sie interessiert sind, sind ets () und auto.arima () . ets () passt zu einem exponentiellen Glättungsmodell, einschließlich Holt-Winters und mehreren anderen Methoden. Es werden Parameter (Alpha, Beta und Gama) für eine Vielzahl von Modellen ausgewählt und dann der mit dem niedrigsten AIC (oder BIC, wenn Sie dies bevorzugen) zurückgegeben. auto.arima () funktioniert ähnlich.

Wie IrishStat jedoch betonte, sind diese Modelle möglicherweise nicht für Ihre Analyse geeignet. Versuchen Sie in diesem Fall, einige Kovariaten zu berechnen, z. B. Dummy-Variablen für Wochenenden, Feiertage und deren Wechselwirkungen. Wenn Sie sinnvolle Kovariaten angegeben haben, verwenden Sie auto.arima (), um ein ARMAX-Modell zu finden, und prognostizieren Sie () , um Vorhersagen zu treffen. Sie werden wahrscheinlich etwas viel Besseres als ein einfaches Holt-Winters-Modell in Python mit Standardparametern erhalten.

Sie sollten auch beachten, dass sowohl ets () als auch auto.arima für saisonale Modelle geeignet sind. Sie müssen Ihre Daten jedoch als saisonale Zeitreihen formatieren. Lassen Sie mich wissen, wenn Sie dabei Hilfe benötigen.

Weitere Informationen zum Prognosepaket finden Sie hier .

Zach
quelle
Wie kann ich Kovariaten berechnen?
Wern
@Wern: Es hört sich so an, als ob Sie MINDESTENS 2 Sätze von Kovariaten benötigen: einen Satz von Dummy-Variablen für die Tageszeit und eine Variable, die das Wochenende gegenüber dem Wochentag darstellt. Mit anderen Worten, Sie benötigen eine Matrix der folgenden 0/1-Variablen: H1, H2, H3, H4 ... H23, Wochentag, wobei H1 = 1, wenn Stunde == 1 ist, andernfalls 0 ist. H2 = 2, wenn Stunde == 2, andernfalls 0 usw. Wochentag = 1 an Wochentagen und 0 an Wochenenden. Darüber hinaus können Sie Folgendes einschließen: eine Interaktion zwischen Wochentag und Stunde, Wochentag, Monat des Jahres, Feiertag und anderen Interaktionen. Lassen Sie mich wissen, wenn Sie dabei Hilfe in R benötigen. Beginnen Sie mit Stunden- und Wochentagsattrappen.
Zach
@Wern: Nach dem erneuten Lesen Ihrer Frage scheint es, als hätten Sie 15-Minuten-Daten. Anstatt also H1-H23 zu berechnen, sollten Sie I1-I95 berechnen, wobei "Intervall" die 15-Minuten-Intervalle seit Beginn des Tag. Stellen Sie außerdem sicher, dass 1 Variable in diesem Satz von Dummies weggelassen wird, z. B. H24 oder I96. Welche Art von Daten betrachten Sie? Web-Verkehr? Stromlast?
Zach
Hmm, ich glaube ich weiß was du meinst. Ich werde es ausprobieren und dich wissen lassen - danke! Die Daten sind Web-Verkehr.
Wern
@Wern Wenn Ihnen meine Antwort (oder die von IrishStat) gefällt, können Sie diese gerne durch Klicken auf das grüne Häkchen akzeptieren.
Zach
7

Das Problem könnte sein, dass Holt-Winters eine bestimmte Modellform ist und möglicherweise nicht auf Ihre Daten anwendbar ist. Das HW-Modell geht unter anderem von Folgendem aus. a) ein und nur ein Trend b) keine Pegelverschiebungen in den Daten, dh keine Intercept-Änderungen 3) dass sich die saisonalen Parameter nicht über die Zeit ändern 4) keine Ausreißer 5) keine autoregressive Struktur oder adaptive Modellstruktur 6) Modellfehler mit konstanter Varianz Und natürlich 7) dass die Geschichte die Zukunft verursacht, dh keine Einbeziehung von Preis / Werbeaktionen, Ereignissen usw. als helfende Variablen

Aus Ihrer Beschreibung geht hervor, dass ein Ansatz mit gemischten Frequenzen erforderlich sein könnte. Ich habe Zeitreihenprobleme gesehen, bei denen die Tagesstundeneffekte und die Wochentagseffekte signifikante Interaktionsterme aufweisen. Sie versuchen, Ihre Daten in eine unzureichende, dh nicht verallgemeinerte Struktur zu zwingen. Das Schätzen von Parametern und das Auswählen aus einem kleinen Satz von Modellen ersetzt nicht die Modellidentifikation. Vielleicht möchten Sie unter www.autobox.com/pdfs/catchword.pdf einen Artikel über die verschiedenen Ansätze zur automatischen Modellierung lesen. In Bezug auf einen allgemeineren Ansatz würde ich vorschlagen, dass Sie ein ARMAX-Modell in Betracht ziehen, das auch als Übertragungsfunktion bekannt ist und die oben genannten Annahmen lockert.

IrishStat
quelle
Hmm, Sie haben einige sehr gute Punkte ... meine Daten enthalten auch viele Ausreißer und unterliegen erheblichen Abweichungen bei Ereignissen wie Weihnachten oder Neujahr. Aber was meinen Sie mit "autoregressiver oder adaptiver Modellstruktur"? Ich werde ARMAX eine Chance geben, danke!
Wern
@Wern Eine adaptive / autoregressive Komponente liegt vor, wenn die "Prädiktoren" entweder Speicher (vorherige Werte) der endogenen (Y) Reihe oder exogene Reihe ODER verzögerte Werte des Fehlerterms enthalten. Es ist wichtig, mit JEDEN Feiertagen mögliche Blei-, Zeit- und Verzögerungseffekte zu identifizieren und zu modellieren. Darüber hinaus kann es abhängig vom Wochentag eine bestimmte Ursache für bestimmte Wochentage geben. Zum Beispiel kann der 5. des Monats wichtig sein, GEGEBEN, dass es kein Wochenende war. Wir konnten diese Struktur erfolgreich modellieren / automatisch identifizieren.
IrishStat