时间序列 - ARIMA
我们已经了解到,对于平稳的时间序列,时间为 't' 的变量是先前观测值或残差误差的线性函数。因此,现在是时候将两者结合起来,形成一个自回归移动平均 (ARMA) 模型。
然而,有时时间序列不是平稳的,即序列的统计特性(如均值、方差)会随时间变化。而我们迄今为止研究过的统计模型都假设时间序列是平稳的,因此,我们可以加入一个时间序列差分的前处理步骤来使其平稳。现在,我们需要弄清楚我们正在处理的时间序列是否平稳。
查找时间序列平稳性的各种方法包括:查看时间序列图中的季节性或趋势、检查不同时间段的均值和方差差异、增强 Dickey-Fuller (ADF) 检验、KPSS 检验、Hurst 指数等。
让我们使用 ADF 检验看看我们数据集中的“温度”变量是否是平稳的时间序列。
In [74]
from statsmodels.tsa.stattools import adfuller result = adfuller(train) print('ADF Statistic: %f' % result[0]) print('p-value: %f' % result[1]) print('Critical Values:') for key, value In result[4].items() print('\t%s: %.3f' % (key, value))
ADF 统计量:-10.406056
p 值:0.000000
临界值
1%: -3.431
5%: -2.862
10%: -2.567
现在我们已经运行了 ADF 检验,让我们来解读结果。首先,我们将 ADF 统计量与临界值进行比较,较低的临界值告诉我们该序列很可能是非平稳的。接下来,我们查看 p 值。p 值大于 0.05 也表明时间序列是非平稳的。
或者,p 值小于或等于 0.05,或 ADF 统计量小于临界值表明时间序列是平稳的。
因此,我们正在处理的时间序列已经是平稳的。对于平稳的时间序列,我们将 'd' 参数设置为 0。
我们也可以使用 Hurst 指数确认时间序列的平稳性。
In [75]
import hurst H, c,data = hurst.compute_Hc(train) print("H = {:.4f}, c = {:.4f}".format(H,c))
H = 0.1660,c = 5.0740
H<0.5 的值表示反持久性行为,H>0.5 表示持久性行为或趋势序列。H=0.5 表示随机游走/布朗运动。H<0.5 的值证实了我们的序列是平稳的。
对于非平稳的时间序列,我们将 'd' 参数设置为 1。此外,自回归趋势参数 'p' 和移动平均趋势参数 'q' 的值是在平稳的时间序列上计算的,即通过在时间序列差分后绘制 ACP 和 PACP 来计算。
ARIMA 模型由 3 个参数 (p、d、q) 构成,现在对我们来说已经清楚了,所以让我们对我们的时间序列进行建模并预测未来温度值。
In [156]
from statsmodels.tsa.arima_model import ARIMA model = ARIMA(train.values, order=(5, 0, 2)) model_fit = model.fit(disp=False)
In [157]
predictions = model_fit.predict(len(test)) test_ = pandas.DataFrame(test) test_['predictions'] = predictions[0:1871]
In [158]
plt.plot(df['T']) plt.plot(test_.predictions) plt.show()
In [167]
error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871])) print ('Test RMSE for ARIMA: ', error)
ARIMA 的测试 RMSE:43.21252940234892