如何在Python中拟合Holt Winter的模型并预测未来的结果?



我有一个4年的销售数据集,并试图预测未来5年的销售情况。我把数据集分成了36个月的训练集和12个月的测试集。我选择了Holt Winter的方法,并编写了以下代码来测试模型。

from statsmodels.tsa.api import ExponentialSmoothing
holt_winter = ExponentialSmoothing(np.asarray(train_data['Sales']), seasonal_periods=12, trend='add', seasonal='add')
hw_fit = holt_winter.fit()
hw_forecast = hw_fit.forecast(len(test_data))
plt.figure(figsize=(16,8))
plt.plot(train_data.index, train_data['Sales'], "b.-", label='Train Data')
plt.plot(test_data.index, test_data['Sales'], "ro-", label='Original Test Data')
plt.plot(test_data.index, hw_forecast, "gx-", label='Holt_Winter Forecast Data')
plt.ylabel('Score', fontsize=16)
plt.xlabel('Time', fontsize=16)
plt.legend(loc='best')
plt.title('Holt Winters Forecast', fontsize=20)
plt.show()

看起来代码工作良好,并且可能正确预测测试数据集的结果。然而,如果我想预测未来五年的销售情况,我很难弄清楚如何编写代码。

hw_fit.predict(start, end)

将从stepstart到stepend进行预测,step 0为训练数据的第一个值。
forecast进行样本外预测。所以这两个是等价的:

hw_fit.forecast(steps)
hw_fit.predict(len(train_data), len(train_data)+steps-1)

所以,由于你的模型是按月训练的,如果你想在训练数据的n个月后预测,你可以用步骤=n

调用上面的方法

你也可以尝试ARIMA模型,它通常提供更好的性能,这段代码使不同的ARIMA参数(AR,自回归参数;I,微分参数;MA为移动平均参数;- p,d,q),并通过降低赤池信息标准(AIK)来找到它们的最佳组合,该标准惩罚了参数数量的最大似然(即找到参数数量最少的最佳似然):

from statsmodels.tsa.arima_model import ARIMA
import itertools
# Grid Search
p = d = q = range(0,3) # p, d, and q can be either 0, 1, or 2
pdq = list(itertools.product(p,d,q)) # gets all possible combinations of p, d, and q
combs = {} # stores aic and order pairs
aics = [] # stores aics
# Grid Search continued
for combination in pdq:
try:
model = ARIMA(train_data['Sales'], order=combination) # create all possible models
model = model.fit()
combs.update({model.aic : combination}) # store combinations
aics.append(model.aic)
except:
continue
best_aic = min(aics)

相关内容

最新更新