为什么加上我的外生变量会使我的预测更加准确?

时间:2019-08-08 04:19:34

标签: python-3.x time-series arima

我正在学习时间序列预测,并且能够使用Seasonal ARIMA在每天的时间间隔内创建合理的建筑能耗模型。我有大约3年的数据,原始间隔是每15分钟一次。

enter image description here

由于要查看的数据太多,我决定通过求和将数据每天重新采样。

enter image description here

这是数据框的示例结构:

时间戳|千瓦时

2012-10-08 | 28214.340

2012-10-09 | 28691.520

2012-10-10 | 27549.720

2012-10-11 | 26385.039

2012-10-12 | 25678.180

频率:D,名称:kWh,dtype:float64

这存储在名为daily_kWh的数据框中

然后我使用ADF和KPSS统计测试来检查每日数据的平稳性:

Dickey-Fuller测试结果:

测试统计数据1.228884

p值0.996179

已使用的时滞9.000000

使用的观察数18.000000

临界值(1%)-3.859073

临界值(5%)-3.042046

关键值(10%)-2.660906

KPSS测试结果:

测试统计0.381702

p值0.085042

已使用的时滞9.000000

临界值(10%)0.347000

临界值(5%)0.463000

临界值(2.5%)0.574000

临界值(1%)0.739000

据我了解,ADF测试暗示数据不是平稳的,而KPSS测试暗示数据是“趋势平稳的”。

然后我对数据进行差异化并进行目视检查以确保平稳性。

我想绘制ACF和PACF图,以更好地了解哪些参数(p,d,q)适用于模型。这些图显示在每天的时间序列中。

enter image description here

enter image description here

这是将时间序列偏移(一阶差分)一周后的ACF和PACF图。

enter image description here

enter image description here

我读到AR和MA术语可以基于ACF和PACF图;但是对我来说,如何解释上面这4个图并不清楚。

因此,我最终基于“网格搜索”方法找出了ARIMA模型的参数,该方法将AIC得分降至最低,最终得到了以下参数: p = 1,d = 1,q = 1,P = 1,D = 2,Q = 2,m = 28(季节性)

我在以下方面遇到困难:

1)如何解释原始数据集和差异数据的ACF和PACF图?我能说出要使用的AR和MA术语吗?

2)如何确定m的值?我无法将其包含在“网格搜索”中,因为我的计算机花了太长时间才能执行此操作(也许我的计算机缺少执行此操作的资源)。有没有一种方法可以根据ACF或PACF图确定m?

关于建筑物每日能源使用趋势的有趣之处在于,在给定的一周之内会有起伏不定(例如,办公楼在周末无人居住时能耗较低),此外,在给定的一年之内,您会看到夏季和冬季之间的能耗差异。因此,从本质上讲,每周和每月都有关联的趋势/(季节性?)。

当前,基于模型拟合和绘制样本外预测,我将其设置为28。当保持所有其他p,d,q(和P,D,Q)值恒定时,大约28的值似乎提供了样本预测中的“最佳”。确定m的合适方法是什么?

除上述内容外,我还尝试将同一时间段内的每小时温度数据用作模型的外生变量,以希望有助于样本预测。以下是外生变量的示例:

时间戳|温度(F)

2012-10-01 | 72.756890

2012-10-02 | 76.630573

2012-10-03 | 65.621458

2012-10-04 | 61.138021

2012-10-05 | 62.113156

外界气温存储在名为daily_OAT的数据框中

下面是我用来训练模型并预测30天的kWh值的代码:

    train = daily_kWh[0:-30]
    test = daily_kWh[-30:]
    exog = daily_OAT[0:-30]
    exog_forecast = daily_OAT[-30:]



    mod2 = sm.tsa.statespace.SARIMAX(train,exog=np.asarray(exog),
                                order=(1,1,1),
                                seasonal_order=(1,2,2,28),
                                enforce_stationarity=False,
                                enforce_invertibility=False)
    results2 = mod2.fit()


    pred = results2.get_prediction(start=test.index[0], end=test.index[-1], exog = exog_forecast.values.astype('float64').reshape(30,1), dynamic=False)
    pred_ci = pred.conf_int(alpha = 0.1)
    ax = daily_kWh['2014-12-01':].plot(label='kWh')
    ax
    pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.7, figsize=(20, 10))
    ax.fill_between(pred_ci.index,
                    pred_ci.iloc[:, 0],
                    pred_ci.iloc[:, 1], color='k', alpha=.1)
    ax.set_xlabel('Date')
    ax.set_ylabel('Daily kWh')
    plt.ylim([20000,40000])
    plt.legend()
    plt.show()

以下是模型诊断信息和模型本身:

enter image description here

enter image description here

3)我尝试检查错误,但无法执行。预测的能源使用情况看起来非常好,似乎太好了,难以置信。我在某个地方犯错了吗?

感谢您的阅读和帮助!

0 个答案:

没有答案