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.
Google Colaboratory
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 |
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)]
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.
Sie müssen über den nächsten Verbesserungsplan nachdenken.
Recommended Posts