python - 使用 statsmodels 进行 Holt-Winters 时间序列预测

标签 python time-series statsmodels forecasting holtwinters

我尝试使用 holt-winters 模型 进行预测,如下所示,但我一直得到的预测与我的预期不一致。我还展示了情节的可视化

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')

我不确定我在这里遗漏了什么。

Here's the plot visualization

预测似乎适合训练数据的较早部分

最佳答案

错误的主要原因是您的开始值和结束值。它预测第十五次之前第一次观察的值。但是,即使您更正了这一点,Holt 也只包含趋势成分,您的预测不会带有季节性影响。相反,使用带有季节性参数的 ExponentialSmoothing

这是您的数据集的一个工作示例:

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')

产生以下图:

forecast results with Holt-Winters

关于python - 使用 statsmodels 进行 Holt-Winters 时间序列预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50785479/

相关文章:

Python MySQLdb escape_string

python - MANOVA 使用统计模型

python - Django:如何在抽象模型类中设置ForeignKey related_name?

python - 我可以将 FUSE 与 Cython 绑定(bind)一起使用吗

c++ - 时间序列 "forecast"来自 C++ 的 R 包

sql - 用时间序列汇总数据填空

python - 我可以只用一次重复进行方差分析吗?

scikit-learn - 将 sklearn RFE 与来自另一个包的估算器一起使用

python - 为什么我可以在 Python 中访问看似任意的内存地址?

sql - 灵活的运行窗口,可对时间范围内的条目进行计数