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.
Google Colaboratory
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 |
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)]
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.
Vous devez penser au prochain plan d'amélioration.
Recommended Posts