最后更新于
最后更新于
使用经典的SARIMAX模型, 借助数据, 详细描述整个时间序列(Time Series)建模的过程. 最后的结果并不是很好, 但关键还是在过程中的各个步骤上.
我们对一个具有季节性的数据, 考虑其季节性进行建模. 并使用外部变量(exog)对建模进行辅助.
使用的数据是经典的 Dataset. 首先我们读入数据.
对分解后的残差继续进行分析:
对残差序列计算ACF
我们认为, 如果分解后的残差更接近白噪声序列, 说明原时间序列更符合这种模型. 这是因为白噪声没有自相关性, 用ACF这种工具来进行评价
对ACF值进行平方处理, 这一步的目的是去除ACF值的符号的影响
对所有lag
对应的ACF值经过上述计算后相加, 然后进行比较, 值更小的模型更符合当前时间序列
可以看到, 当前的时间序列更符合乘法模型. 因此我们继续围绕乘法模型进行处理和建模.
外部变量, 根据是否有提供特征序列, 分为有无两种情况.
有额外的特征序列
有单个或多个特征, 每个特征也是一个序列, 原时间序列中的每个点都对应着一组特征(长度为特征的数量). 因此时间序列与特征序列的长度是相等的
但这些特征并不是外部变量, 而是使用这些特征与原时间序列建模拟合, 预测得到的历史值和未来值组成的时间序列, 才是外部变量
没有额外的特征序列
外部变量的核心就是使用拟合时间序列得到的预测序列作为外部变量. 因此, 只要有生成这种拟合序列的方法即可使用外部变量这种方法
使用LOWESS或其他的线性模型, 拟合时间索引和时间序列, 得到训练好的模型. 使用这个模型给出历史和未来的预测值, 组成的新的序列就是最后的外部变量
使用Weighted moving average对原时间序列进行平滑, 除了得到历史上的平滑结果, 还要使用这种平滑方法对未来序列进行推测, 然后将两者拼接起来, 作为最后的外部变量
需要注意的是, ARIMAX, SARIMAX模型并不会对外部变量进行预测, 因此就需要我们为模型提供外部变量的未来值, 才能使用这种模型对时间序列的未来进行预测. 这就要求我们在拟合模型之前, 首先使用其他的方法对外部变量进行拟合和预测.
由于需要对外部变量进行额外的建模, 对未来进行需要, 就涉及到在建模时对这个模型进行好坏的评价, 因此就需要使用开发集DEV.
此时的核心思想是: 使用时间索引对原时间序列进行拟合建模, 并使用拟合好的模型, 对历史和未来进行预测, 使用这个新的序列作为外部变量.
Locally Weighted Scatterplot Smoothing + Linear Regression, 具体方法为:
使用简单的时间序列索引作为x, 原时间序列作为y
使用LOWESS算法进行拟合, 输出对历史的拟合值, 作为外部变量的历史部分
LOWESS算法是局部的线性拟合, 更适应于时间序列拟合这种场景
对于dev
和test
, 需要使用线性回归模型得到, 即使用时间索引x和LOWESS算法得到的拟合值作为y, 拟合一个线性回归模型, 然后用dev
和test
对应的时间索引, 预测得到未来的值, 作为外部变量的未来值部分
使用鲁棒性的线性模型对时间索引和原时间序列进行拟合, 并使用未来的时间索引, 预测未来的值, 作为外部变量.
需要注意的是, 因为用来dev
和test
的外部变量是通过拟合的模型预测得到的, 那么外部变量的train
(历史部分)也就不能使用原始的时间序列, 也要使用模型预测的历史时间点上的值作为外部变量的train
部分.
如果时间序列比较特殊, 上面的方法都不适用(例如会报错), 则直接使用最简单的Linear Regression
来拟合, 方法与鲁棒性的线性回归是一样的, 但最后效果较差.
也可以不使用时间索引, 不需要通过线性模型拟合这一套操作, 直接使用平滑的方法对时间序列求历史上的均值, 然后再使用平滑方法的特性推算未来值, 将历史和未来结合, 作为最终的外部变量使用.
不同的求移动平均的方法, 推算未来的方法为:
SMA: 使用最后一个窗口计算一个均值, 作为第一个未来值, 然后将这个值加入到窗口中去, 得到新窗口, 然后循环继续
EWMA: EWMA计算均值的时候, 没有使用窗口, 但在推算未来值的时候就需要使用窗口了. 构建一个窗口, 使用EWMA方法计算这个窗口的均值, EWMA的参数为这个窗口大小+1. 推算出来的均值即为未来值. 然后如同SMA中一样的方法进行循环
核心思想为: 特征序列只有历史值, 没有未来值. 需要使用平滑方法得到未来值. 真正的外部变量, 是使用历史特征序列与原时间序列进行拟合, 然后使用用特征序列平滑得到的历史值和未来值, 预测时间序列的train
, dev
和test
, 作为外部变量.
首先生成一些特征序列.
使用平滑方法得到这些特征序列的未来值.
与使用时间索引作为特征序列采用的方法相同.
对时间序列进行EWMA, 得到历史平滑值
对每个特征做序列模型种类判断的处理, 模式有原始, 平滑, 平滑累加三种(平滑累加常常会造成额外的错误, 可以将这种模式去除掉). 除此之外, 还要考虑相应的延迟lag
得到三种模式的特征值的拟合历史值
循环得到每种模式的不同lag
的延迟序列
使用延迟后的特征序列与平滑得到的时间序列计算相关系数, 选出最合适的模式和延迟大小
最后用最优的序列平滑得到未来值
使用上一步得到的所有特征的序列和原时间序列的历史平滑值(第一步得到的)使用线性模型进行拟合, 然后使用平滑得到的未来的特征序列对外部变量的未来值进行拟合
一般延迟的搜索范围为一个季节的长度.
np.corrcoef
计算的是皮尔逊相关系数, 返回的是一个矩阵, 是所有维度之间的相关系数(自己与自己的相关系数为1, 因此矩阵的对角线上的值都为1).
得出使用moving average
, 0lag
的模式, 更适合建模时间序列. 根据得到的结果选择对应的模式和对应的延迟, 进行转换.
再对其他所有特征做同样的处理.
注意这里有一种人工脉冲的特殊情况.
如果这些特征序列的未来值, 我们是知道的, 在使用平滑方法时, 将这种人工脉冲也加入到模型中, 方法为:
对还没有进行延迟操作的最优响应类型特征序列进行以下的操作
将未来值拼接到上面还未进行延迟的最优响应类型特征序列上, 这是当前准确的真实值
然后对整体进行一次平滑, 得到平滑值, 取代原来的值
使用上一步得到的新的序列, 根据最优的延迟lag
, 进行右移延迟操作, 得到的序列记为新的特征序列
然后使用所有特征的最优序列的历史值和时间序列的平滑值拟合一个线性模型, 并使用特征的最优序列的未来值, 预测时间序列的未来, 作为外部变量.
即使使用外部变量, 拟合的仍是SARIMA模型. 整体思路为:
先拟合好SARIMA模型, 使用模型的参数, 然后带入到SARIMAX模型中, 再结合外部变量, 得到最后的模型以及其预测结果
如果使用外部变量, 在拟合SARIMA模型时, 就需要消除外部变量是时间序列的影响, 然后再进行拟合才合理. 使用的外部变量是特征序列对时间序列的拟合, 可以看为:
因为这种拟合得到的新的序列, 完全是由特征序列决定的, 是特征序列的建模, 可以看做是特征序列在时间序列中的成分
所以使用这个拟合而不是原始的特征序列作为最终的外部变量, 也是出于直接使用外部变量在这一步的拟合中, 无法清晰地去除其影响
因此, 消除外部变量对时间序列影响的方法, 即为从时间序列中直接减去外部变量.
开始拟合SARIMA模型.
根据差分阶数的搜索范围, 依次进行差分和平稳性检验, 直到遇到平稳序列为止.
平稳性检验的方法很多, 如常用的ACF. 这里使用的是无参数的KPSS检验方法.
可以看到这里不需要进行差分, 序列就是平稳的.
在得到差分的阶数后, 立即对时间序列进行差分. 因为后面还要使用季节差分:
普通差分之后再进行季节差分阶数的判断
普通差分在季节差分之前进行
当前的时间序列, 是否有季节性, 也是需要通过检验来判断的. 如果没有季节性, 该序列就不需要进行季节差分了. 使用ACF和FFT两种方法对时间序列进行检验:
FFT: 上面检验的是存在性, FFT检验的是合理性, 即以要检验的数值作为季节周期的长度最合适. 如果时间序列是以当前季节长度为周期, 对应的在序列的频谱上应该有表现. 使用FFT由时域转为频域, 找出频域中能量最大的频率, 再计算这个频率对应的周期, 比较这个周期与我们选定的季节长度是否相等(或者这个周期是否是我们选定的季节长度的因子)
检验季节性其实就是检验给定的季节周期的长度是否合适.
一开始要把季节长度初始化为0, 即没有季节性. 不是所有的时间序列都有季节性, 如果对给定的序列, 在季节长度搜索范围中没有找到合适的季节, 就不能使用季节性.
可以看到准确的检验到了长度为12的季节性, 符合序列图中得到的主观印象.
如果上一步得到的季节长度不为0, 则时间序列有季节性, 就需要考虑是否需要进行季节差分. 如果要进行季节差分, 阶数应该为多少.
与普通差分相同, 判断季节性差分阶数的方法也是逐步加大差分的阶数, 直到序列经过差分之后达到季节性平稳为止. 判断季节性平稳的检验方法为Canova-Hansen检验.
其原理也是检验单位根, 但与ADF不同的是, 检验的是季节单位根. 对应的原假设为没有季节单位根, 即时间序列是季节平稳的; 备择假设是有季节单位根, 时间序列不是季节平稳的.
可以看到, 这里不需要进行季节性差分, 序列就是平稳的.
根据初始值, 步长和范围, 逐步搜索p
, q
, P
, Q
参数, 得到SARIMA模型. 然后使用拟合结果中的AIC指标, 选出最优的参数组合.
对未来进行预测, 注意要提供未来的外部变量.
使用开发集dev
对预测结果进行评价, 使用RMSE指标.
如果时间序列是乘法模型, 需要使用函数对序列进行转换, 转换之后就成为了加法模型. 然后继续分析, 建模.
需要注意的是, 如果使用对原时间序列进行了转换, 在最后, 需要将拟合和预测得到的序列使用函数的反函数, 即指数函数进行还原.
使用简单的时间索引, 即作为类似于上面的特征序列
对特征做上面的处理.
ACF: 自相关系数. 如果时间序列有对应长度的季节性, 那个对应lag
的自相关性应当是显著的, 如果相关系数为0则说明没有相关性, 因此需要判断计算得到的在lag
处的相关系数是否为0. 这里使用z检验. 构造z统计量时, 对应的标准差需要除以, 即时间序列长度的开方.
#Passengers
Month
1949-01-01
112
1949-02-01
118
1949-03-01
132
1949-04-01
129
1949-05-01
121