[PYTHON] Défi pour les prévisions de ventes futures: tun Réglage des paramètres PyFlux

introduction

La dernière fois, dans "Défi des prévisions de ventes futures: ② Analyse des séries chronologiques à l'aide de PyFlux", nous avons construit un modèle d'ARIMA et d'ARIMAX à l'aide de PyFlux. J'ai fait.

Cependant, la précision n'était pas très bonne. Je cherchais des paramètres tels que le nombre de dimensions de AR et MA, mais n'était-ce pas le cas? Cependant, «statistiquement, c'est bien!» Est un obstacle important pour moi (transpiration).

Alors, j'ai cherché quelque chose comme GridSearch de scicit-learn. Ensuite, "[Prédire la transition du taux de visionnage TV Asahi avec le modèle SARIMA](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) ", modèles statistiques Depuis que le réglage des paramètres de l'analyse des séries chronologiques a été mis en œuvre, je l'ai fait en référence à cela.

Environnement analytique

Google Colaboratory

Données cibles

Dernière fois De même, les données utilisent les ventes quotidiennes et la température (moyenne, maximum, minimum) comme variables explicatives.

Date Montant des ventes Température moyenne Température la plus élevée Température la plus basse
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

Réglage des paramètres

Voici le programme de Dernière fois. Les paramètres sont ar, ma et integ.

import pyflux as pf

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

Jusqu'à présent, j'ai dit que le réglage des paramètres est excellent, mais fondamentalement, chaque paramètre prend un entier, donc la valeur numérique est tournée dans une boucle.


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

Maintenant quand tu l'appelles comme ça

df_output = optimisation_arima(df, "Montant des ventes")

Le résultat s'affiche. Il existe plusieurs critères d'évaluation pour PyFlux, mais nous utilisons l'AIC (le plus petit est le meilleur modèle).

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

Par conséquent, la combinaison AR / I / MA avec le plus petit AIC peut être sélectionnée comme paramètre optimal.

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

en conclusion

Puisque la précision de précédent était une terrible défaite, nous avons effectué le réglage des paramètres à tour de rôle.

Cependant, les résultats obtenus ne se sont pas améliorés en termes de précision. ダウンロード.png

Vous devez penser au prochain plan d'amélioration.

Recommended Posts

Défi pour les prévisions de ventes futures: tun Réglage des paramètres PyFlux
Défi des prévisions de ventes futures: ② Analyse des séries chronologiques à l'aide de PyFlux
Défi des prévisions de ventes futures: ⑤ Analyse des séries chronologiques par Prophet
Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models