[PYTHON] Herausforderung für die zukünftige Umsatzprognose: ③ Optimierung der PyFlux-Parameter

Einführung

Letztes Mal haben wir in "Herausforderung für zukünftige Umsatzprognosen: ② Zeitreihenanalyse mit PyFlux" ein Modell von ARIMA und ARIMAX mit PyFlux erstellt. Ich tat.

Die Genauigkeit war jedoch nicht sehr gut. Ich habe nach Parametern wie der Anzahl der Dimensionen von AR und MA gesucht, aber war das nicht der Fall? "Statistisch gesehen ist das gut!" Ist jedoch eine hohe Hürde für mich (Schweiß).

Also suchte ich nach etwas wie GridSearch von scicit-learn. Dann "[Vorhersage des Übergangs der TV-Asahi-Anzeigerate mit dem SARIMA-Modell](https://qiita.com/mshinoda88/items/749131478bfefc9bf365#sarima%E3%83%A2%E3%83%87%E3%" 83% AB% E5% AD% A3% E7% AF% 80% E8% 87% AA% E5% B7% B1% E5% 9B% 9E% E5% B8% B0% E5% 92% 8C% E5% 88% 86% E7% A7% BB% E5% 8B% 95% E5% B9% B3% E5% 9D% 87% E3% 83% A2% E3% 83% 87% E3% 83% AB) ", Statistikmodelle Da die Parametereinstellung der Zeitreihenanalyse mit implementiert wurde, habe ich diesbezüglich darauf hingewiesen.

Analyseumgebung

Google Colaboratory

Zieldaten

Letztes Mal In ähnlicher Weise verwenden die Daten den täglichen Umsatz und die Temperatur (Durchschnitt, Maximum, Minimum) als erklärende Variablen.

Datum Verkaufszahlen Durchschnittstemperatur Höchste Temperatur Niedrigste Temperatur
2018-01-01 7,400,000 4.9 7.3 2.2
2018-01-02 6,800,000 4.0 8.0 0.0
2018-01-03 5,000,000 3.6 4.5 2.7
2018-01-04 7,800,000 5.6 10.0 2.6

Parametereinstellung

Das folgende ist das Programm von Last time. Die Parameter sind ar, ma und integ.

import pyflux as pf

model = pf.ARIMA(data=df, ar=5, ma=5, integ=1, target='Verkaufszahlen', family=pf.Normal())
x = model.fit('MLE')

Bisher habe ich gesagt, dass die Parameteroptimierung großartig ist, aber im Grunde genommen nimmt jeder Parameter eine Ganzzahl an, sodass der numerische Wert in einer Schleife gedreht wird.


def optimisation_arima(df, target):

  import pyflux as pf

  df_optimisations = pd.DataFrame(columns=['p','d','q','aic'])

  max_p=4
  max_d=4
  max_q=4

  for p in range(0, max_p):
    for d in range(0, max_d):
      for q in range(0, max_q):

        model = pf.ARIMA(data=df, ar=p, ma=q, integ=d, target=target, family=pf.Normal())
        x = model.fit('MLE')

        print("AR:",p, " I:",d, " MA:",q, " AIC:", x.aic)

        tmp = pd.Series([p,d,q,x.aic],index=df_optimisations.columns)
        df_optimisations = df_optimisations.append( tmp, ignore_index=True )

  return df_optimisations

Nun, wenn Sie es so nennen

df_output = optimisation_arima(df, "Verkaufszahlen")

Das Ergebnis wird angezeigt. Es gibt verschiedene Bewertungskriterien für PyFlux, aber wir verwenden AIC (kleiner ist besseres Modell).

AR: 0  I: 0  MA: 0  AIC: 11356.163772323638
AR: 0  I: 0  MA: 1  AIC: 11262.28357561013
AR: 0  I: 0  MA: 2  AIC: 11218.453940684196
AR: 0  I: 0  MA: 3  AIC: 11171.121950637687
AR: 0  I: 1  MA: 0  AIC: 11462.586538415879

Daher kann die AR / I / MA-Kombination mit dem kleinsten AIC als optimaler Parameter ausgewählt werden.

df_optimisations[df_optimisations.aic == min(df_optimisations.aic)]

abschließend

Da die Genauigkeit von Vorheriger eine schreckliche Niederlage war, haben wir eine Round-Robin-Parameteroptimierung durchgeführt.

Die Ergebnisse zeigten jedoch keine Verbesserung der Genauigkeit. ダウンロード.png

Sie müssen über den nächsten Verbesserungsplan nachdenken.

Recommended Posts

Herausforderung für die zukünftige Umsatzprognose: ③ Optimierung der PyFlux-Parameter
Herausforderung für die zukünftige Umsatzprognose: ② Zeitreihenanalyse mit PyFlux
Herausforderung für die zukünftige Umsatzprognose: ⑤ Zeitreihenanalyse von Prophet
Herausforderung für die zukünftige Umsatzprognose: ④ Zeitreihenanalyse unter Berücksichtigung der Saisonalität nach Statistikmodellen