使用 statsmodels 进行 Holt-Winters 时间序列预测
问题描述
我尝试使用 holt-winters 模型
进行预测,如下所示,但我不断得到一个与我的预期不一致的预测.我还展示了情节的可视化
I tried forecasting with holt-winters model
as shown below but I keep getting a prediction that is not consistent with what I expect. I also showed a visualization of the plot
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')
我不确定我在这里缺少什么.
I am unsure of what I'm missing here.
预测似乎适合训练数据的早期部分
The prediction seems to be fitted to the earlier part of the Training data
解决方案
错误的主要原因是你的起始值和结束值.它预测第一次观察的值,直到第十五次.但是,即使您更正了这一点,Holt 也仅包含趋势部分,您的预测不会带有季节性影响.而是将 ExponentialSmoothing
与季节性参数一起使用.
The main reason for the mistake is your start and end values. It forecasts the value for the first observation until the fifteenth. However, even if you correct that, Holt only includes the trend component and your forecasts will not carry the seasonal effects. Instead, use ExponentialSmoothing
with seasonal parameters.
这是您的数据集的一个工作示例:
Here's a working example for your dataset:
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')
产生以下情节:
相关文章