最近一直在接触时间序列,所以打算写一些有关时间序列的文章,预测部分会从规则开始、到传统模型、到机器学习、再到深度学习,此外也会介绍一些时间序列的基本概念,包括自相关、平稳性、滞后性、季节性等。
预测是商业中的常见统计任务,它可以为生产、运输和人员安排等决策提供信息,并为长期战略规划提供指导。预测是指在考虑到所有可用信息的前提下,包括历史数据和可以影响预测的任何未来事件的知识,尽可能准确地预言。
而时间序列预测是指按照时间顺序观察事物的变换。通常会利用同一变量的历史值预测未来值,或者也可以加入一些预测因子来预测未来值。前者称为单变量时间序列预测,后者称为多变量时间序列预测。
通常我们指的时间序列预测都是考虑定期观察的时间序列(如每分、每小时、每天、每周等)。比较经典的案例有:降水量预测、销售预测、流量预测等。
时间序列包含很多特征中包含诸多成分,有:
下图展示了一个时间序列被分解的过程,第一张图是所观察的时间序列,第二张图是趋势、第三张图是季节性,第四张图是残差:
(以上序列并不存在周期性,这里只是举个例子)
平稳性分为弱平稳和严平稳,我们分别给出定义:
「弱平稳」:若序列 存在有限二阶矩。且满足
则称序列 为弱平稳序列。
「严平稳」:对于所有可能的 n,所有可能的 ,和所有可能的 k,当 的联合分布与 的联合分布相同时,则序列是强平稳。
值得注意的是,「两种平稳过程并没有包含关系」,即弱平稳不一定是严平稳,严平稳也不一定是弱平稳。(感兴趣的可以自己查资料证明,这里不过多介绍)
由于严平稳的要求过于苛刻,所以我们所说的大部分时间序列预测都是弱平稳的时间序列。
那么我们为什么要关注序列的平稳性呢?
这是因为有些预测统计方法是以平稳序列为假设前提而进行设计的,比如自回归模型。其假设是变量的历史与现状呈现出基本特性,并在未来阶段的一个时间里会维持不变。
更具体的说,自回归预测模型的本质是“利用序列的滞后阶数(lags)作为自变量”的线性回归模型,比如 lags=2 表示使用变量的 t-1 和 t-2 时刻的值作为自变量来预测 t 时刻的值。那么通过在历史序列上训练模型后,得到的这个线性回归模型的各自变量的系数就代表了各滞后时刻的值与下一时刻值的相关性,如果时间序列接近平稳,这些相关性在未来一段时间内都不会有太大的变化,那么预测未来就成为了可能。
对于非平稳时间序列的预测,我们需要将其变换为平稳时间序列,常用的方法有:
一般来说,做个一阶差分就可以得到接近平稳的时间序列了,如果方差随时间变化较大,那么可以先取 log 再做一阶差分。如下图所示:上面两张图为非平稳的时间序列,经过一阶差分后便得到了相对平稳的时间序列。当然,经过二阶差分后,其效果会更好。
判断一个序列是否是平稳的,除了通过肉眼判断和上面提到的定义外,还有两种比较科学的基于单位根检验的方法:
先给出定义:如果算子运算是将一个时间序列的前一期值转化为当期值,则称此算子为滞后算子,记做 L。即对任意时间序列 ,滞后算子满足: 。
类似也可以定义高阶滞后算子,例如二阶滞后算子为 。
高阶滞后算子有: 。
首先,我们先来介绍下相关系数,公式:
根据样本的估计得到公式:
可以看到,相关系数其实就是计算了向量空间中两个向量的夹角,而协方差是去均值后两个向量的内积。
如果两个向量平行,相关系数等于 1 或者 -1,垂直则为 0。
相关系数度量了两个向量的线性相关性,而在平稳时间序列 中,我们有时候很想知道, 与它的过去值 的线性相关性。这时候我们便把相关系数的概念推广到自相关系数。
与 的相关系数称为 的间隔为 l 的自相关系数,通常记为 。具体的:
这里用到了弱平稳序列的性质:
对一个平稳的时间序列的样本 ,1≤t≤T,则间隔为 l 的样本自相关系数的估计为:
则函数 称为 的样本自相关函数(ACF)。
假设现在有这样一个时间序列:
其自相关图为:
如果弱平稳序列额 满足 称 为白噪声序列。
如果随机变量序列 独立且期望和方差不随时间而变,则称 为独立白噪声。
如果独立白噪声还是同分布的,称为独立同分布白噪声。
简单来说“白噪声”是一个对所有时间其自相关系数为零的随机过程。下图展示了白噪声的例子:
其自相关系数为:
对于白噪声而言,我们期望它的自相关值接近 0。但是由于随机扰动的存在,自相关值并不会精确地等于 0。对于一个长度为 T 的白噪声序列而言,我们期望在 0.95 的置信度下,它的自相关值处于 之间。我们可以很容易的画出 ACF 的边界值(图中蓝色虚线)。如果一个序列中有较多的自相关值处于边界之外,那么该序列很可能不是白噪声序列。
在上例中,序列长度 T=50,边界为 。所有的自相关值均落在边界之内,证明序列是白噪声。
在介绍模型之前,我们可以先简单了解一些时间序列的规则,一来可以快速上手作为 baseline,二来规则本身也可以作为模型的特征使用。
可以看到,日均产量图的季节性模式比月均产量图更简洁明了。日均产量图有效消除了不同月份天数不同造成的影响。简单的模式往往更易于建立模型并得出更精确的预测结果。对于交易天数随着月份改变的销售数据,我们可以做相似的调整。在这种情况下,可以用每个交易日的销量而非每月的总销量来建立模型。
Box-cox 变换中的对数变换通常以自然对数 e 为底,因此如果 λ=0,则进行自然对数变换,否则会进行幂变换,然后简单缩放。下图为某一事件序列:
当 时,整个时间序列范围内的周期性变化大小差不多相同,因此会让预测更加简单:
选择好变换后,我们还需要利用逆变换得到原始测度上的预测值,逆 Box-Cox 变换如下表示:
是 h 步预测方差,预测方差越大,均值和中位数之间的差异越大。
简单逆变换和逆变换的均值之间的差异,我们称之为偏差(Bias)。当我们需要用均值而非中位数时,称预测点是经过“偏差调整”(Bias-adjusted)的。下图展示了两者的区别:
其中,蓝线表示预测值中位数,红色线表示预测值均值,
这里主要想着重介绍一下周期因子法。
周期因子法很简单,我们先来看一段数据:
可以看到起明显具有周期性。而预测的核心任务便是尽可能准确的提取这种周期性。所以我们:
做预测时只需要将周期因子乘以一个 base,便可作为下一周的预测。比如我们取最后一周的平均客流量 100 作为 base,那么我们直接乘上周期因子,就得到下一周的预测:
这里只拿了三周来举例。实际应用当然要取更长的时段啦。具体取几周以测试集的效果来确定。
按列提取中位数是一种简单而有效的提取周期因子的方法。中位数十分鲁棒,不受极端值的影响。但中位数损失了很多信息。实践中,可以在此基础上进一步优化。比如可以提取一个均值和一个中位数,然后将均值和中位数融合。融合的比例按照测试集的表现来确定。也可以根据与预测周的时间距离来赋予不同的权重。
除了对周期因子进行优化外,我们还可以针对 Base 进行优化。
直接用最后一周的平均客流量作为base并不一定是最好的方法。也许最后三天或最后五天的均值能更好的反映最新的情况。但是,我们不能直接对最后三天客流量取均值(最后三天是周末,这样取的base就偏大了)。需要去掉周期性因素后,再取平均。具体做法,就是用客流量除以周期因子。
这样我们就可以取最后三天的平均,(108+91.4+120)/3=106.5,作为 base。具体取多少天的,也要通过测试集的表现来确定。当然也可以按某些函数形式来给每天赋予不同的权重。
推荐阅读
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏