J'ai essayé de prévoir avec holt-winters model
comme indiqué ci-dessous, mais je continue d'obtenir une prédiction qui ne correspond pas à ce que j'attends. J'ai également montré une visualisation de l'intrigue
Train = Airline[:130]
Test = Airline[129:]
from statsmodels.tsa.holtwinters import Holt
y_hat_avg = Test.copy()
fit1 = Holt(np.asarray(Train['Passengers'])).fit()
y_hat_avg['Holt_Winter'] = fit1.predict(start=1,end=15)
plt.figure(figsize=(16,8))
plt.plot(Train.index, Train['Passengers'], label='Train')
plt.plot(Test.index,Test['Passengers'], label='Test')
plt.plot(y_hat_avg.index,y_hat_avg['Holt_Winter'], label='Holt_Winter')
plt.legend(loc='best')
plt.savefig('Holt_Winters.jpg')
Je ne suis pas sûr de ce qui me manque ici.
La prédiction semble être ajustée à la première partie des données de formation
La principale raison de l'erreur est vos valeurs de début et de fin. Il prévoit la valeur de la première observation jusqu'au quinzième. Cependant, même si vous corrigez cela, Holt inclut uniquement la composante tendance et vos prévisions ne porteront pas les effets saisonniers. Utilisez plutôt ExponentialSmoothing
avec des paramètres saisonniers.
Voici un exemple de travail pour votre jeu de données:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
df = pd.read_csv('/home/ayhan/international-airline-passengers.csv',
parse_dates=['Month'],
index_col='Month'
)
df.index.freq = 'MS'
train, test = df.iloc[:130, 0], df.iloc[130:, 0]
model = ExponentialSmoothing(train, seasonal='mul', seasonal_periods=12).fit()
pred = model.predict(start=test.index[0], end=test.index[-1])
plt.plot(train.index, train, label='Train')
plt.plot(test.index, test, label='Test')
plt.plot(pred.index, pred, label='Holt-Winters')
plt.legend(loc='best')
ce qui donne le tracé suivant: