时间序列相关
🎽

时间序列相关

Property
notion image
在实际的企业实践中,数据往往是连贯具有时间特征的,因此如果想要做出比较好的预测,特别需要注意时序数据的处理。那么,什么是时序数据,又应该怎么处理,显然需要特别关注。

1. 什么是时序数据

时序数据是指时间序列数据。是按照时间顺序记录的数据列,在同一数据列中的数据必须是同口径的,要求具有可比性。时序数据可以是时期数,也可以是时点数。
比如运满满的经历中,划分数据的时间粒度是天,属于时期数。时点数是指按照记录生成的记录时间,也就是实际时间。
其往往含有下面的特征(这些特征并不需要记住,只需要理解之后,在构造特征的时候可加以考虑):
  1. 数据是时序的,一定带有时间戳;
  1. 数据是结构化的,也可能是多模态的;
  1. 数据可能有更新操作;
  1. 数据源并不唯一;
  1. 用户关心的是一段时间后的趋势(或者一段时间后的值);
  1. 数据存在保留时限(更新时限,即过于早的时间序列数据并不需要);
  1. 数据可能会较为平稳,也可能存在突变;
  1. 数据量通常巨大;
基于以上几点原因,我们在处理时序类特征的时候,需要考虑的方面就会比较多。

2. 时序构造特征

2.1 时间序列基本规则法 - 周期因子法

  • 如果时间序列周期性比较强,可以尝试计算周期因子,计算base,通过base*周期因子的方式来预测;
  • base怎么计算?我觉得可以用平均值、中位数都可以;

2.2 时间特征建模

  • 提取时间的周期性特征作为特征,此时无需滑窗截取训练样本。常见方式使用one hot编码:
    • 将星期转换为0-1变量,从周一至周天,共七个变量;
    • 将节假日转化为0-1变量,可简单分为有或者无,也可以根据具体的节日去构造不同编码值;
    • 将月初、月中转换为0-1变量;
    • 视具体问题而定,控制时间粒度,改为月、星期、天、小时;
  • 更加常见的是,通过时间周期进行滑动窗口动态构造训练集与测试集,例如时间序列的波动呈现明显的周情况,那么可以考虑聚合前一周的特征,然后使用当周期的实际值作为预测值;

2.3 传统时序建模方法,ARMA/ARIMA等线性差分模型

  • 不属于我们这里讨论的范畴;

2.4 时间序列分解

  • 拆分为长期趋势变动T、季节变动S(显式周期,固定幅度、长度的周期波动)、循环变动C(隐式周期,周期长不具有严格规则的波动)和不规则变动I,参考链接:
时间序列分解法
时间序列分解法(Time-series Decomposition)   时间序列分解法是数年来一直非常有用的方法,这种方法包括 谱分析、 时间序列分析和 傅立叶级数分析 等。    时间序列y 可以表示为以上四个因素的函数,即: 时间序列分解的方法有很多,较常用的模型有加法模型和乘法模型。 乘法模型为:   (1)运用 移动平均法 剔除长期趋势和周期变化,得到序列TC。然后再用按月(季)平均法求出季节指数S。   (2)做 散点图,选择适合的曲线模型拟合序列的 长期趋势,得到 长期趋势 T。 (3)计算周期因素C。用序列TC除以T即可得到周期变动因素C。 (4)将时间序列的T、S、C分解出来后,剩余的即为不规则变动,即:       时间序列一般包括四类因素,长期趋势因素、季节变动因素、 循环变动因素和不规则变动因素。四种因素的组合形式一般有以下几类, 其中记Xt为时间序列的全变动;Tt为长期趋势;St为季节变动;Ct为 循环变动 ;It为不规则变动,它总是存在着的。   1) 乘法模式,其中, a) 与有相同的量纲,为季节指数,为循环指数,两者皆为比例数;   b)   c) 是独立随机变量序列,服从 正态分布 。 这种形式要求满足条件: a) ,,,,均有相同的量纲;   b) ,k为季节性周期长度; c) 是独立随机变量序列,服从正态分布。   3) 混合模式 a) 与,,有相同的量纲,St是季节指数,为比例数;   b) c) 是独立随机变量序列,服从正态分布。   时间序列分解法试图从时间序列中区分出这四种潜在的因素,特别是长期趋势因素(T)、季节变动因素(S)和循环变动因素(C)。显然,并非每一个 预测 对象中都存在着T、S、C这三种趋势,可能是其中的一种或两种。一个具体的时间序列究竟由哪几类变动组合,采取哪种组合形式,应根据所掌握的资料、时间序列及研究目的来确定。    分解法 的基础是容易理解而且直观的。不过最重要的是它为预测和检验提供了独特和非常有用的资料。我们用一个例题来说明各个因素分解的步骤。   设有某产品十二年(91年-02年)的季度销售额数据。见表4.3中的第二列,共有48个数据。如果将这些数据画在图上(图.1),可以看出有明显的长期趋势和季节变动。利用分解法,假设这48个数据可表示为。这里是这些原始数据,通过分析原始数据X来确定T、C、S(剩下的为I)。    把最初的四个数据(表示91年4个季度的值)相加求平均值得到。这个数是没有季节性的,而且随机性因素也很小甚至没有。因为随机性围绕中间值波动,将四个数相加,正负波动在一定程度上相互抵消了,所以可认为其中已无随机性。同样将第二个至第五个数据相加平均, 也不包含季节性,而且其随机性因素也很小。如此我们可得到45个数据。它们不包含季节性,而且随机性因素很小甚至没有。也就是说它们只包括长期趋势和循环变动两部分(T×C)。这45个数据组成的序列我们称之为移动平均数序列,用MA来表示,MA=T×C。 2.季节性   由于  (1)   因此将观察值除以移动平均数得到的比率值就只包含季节性和随机性,从而这些比率包括了确定季节性因素所需要的信息。如果某个比率的值>100,意味着实际值X比移动平均数(T×C)要大。由于X中包含季节性和随机性,因而当比率值大于100时,就意味着这个季度的季节性和随机性高于 平均数 。反之,如果比率小于100,则表示季节性和随机性低于平均数。 表.2 某产品48个季度的销售数据及数据分解 由式(1)可知,如果能将S×I中的随机性部分去掉,则就得到了季节性指数。要做到这一点,只需注意到随机性指的是偶然性、没有一定模式、围绕中间值0上下波动。因此通过平均就能去掉随机性的影响。将表4.3中"S×I比率"这一栏列成表4.6的形式,将各年同一季度的数据放在同一列之中,求相同各季度的平均值,得第一至第四季度的平均数分别为112.72,109.88,76.28,103.86。由于从1991年至2002年各年中相同季度的数值加以平均消除了大部分随机性,因此这四个平均数仅仅代表了季节性。用代数式表示即为    (2)   其中中上面的横线表示季节平均。 表3 ...
时间序列分解法
  • 循环变动C在短期内不体现,可直接归入趋势变化中;
  • 季节性分析;

2.5 特征工程+机器学习模型

  • 学会构造特征工程,例如一些跟目标值相关的滑窗特征;
  • 学会从不同的角度去训练模型,再进行融合堆叠;
  • Kaggle某次比赛第一名思路:

2.6 深度学习网络

结合CNN+RNN+Attention,作用不同互相配合
  • CNN捕捉短期局部依赖关系;
  • RNN捕捉长期宏观依赖关系;
  • Attention为重要时间段或者变量加权;
  • AR捕捉数据尺度变化;
具体方法:LSTNet、TPA-LSTM

2.7 图像识别方法

将时间序列转换为图像数据,再利用图像模型做分析
  • GAF(Gramian Angular Field),将笛卡尔坐标系下的以为时间序列,转化为极坐标表示,再使用三角函数生成GFA矩阵
    • 优点:通过半径r表示序列的时间依赖性,极坐标保留时间关系的绝对值,每个序列产生唯一的极坐标映射图;可通过GAF矩阵的主对角线,恢复笛卡尔坐标系下的原始时间序列;
    • 缺点:当序列长度为n时,产生的GAF矩阵为n*n,建议分段聚合近似,保留序列趋势,同时减少序列大小;
  • Short Time Fourier Transform(短时傅里叶变换STFT)
    • 通用的语音信号处理工具;

3. 分割训练测试集

从上面一些方法可以看出,时间序列数据集有时候很难做交叉验证,因为模型通常需要学习时间的长期趋势信息,除非将时序信息处理成特征,加入长期趋势特征,否则几乎不能打乱训练和预测数据的相对时序顺序。
  • 按照时间点切割:即随机挑选一个时间点,根据正负样本或者训练、测试样本的数量比,来划分训练测试集;
  • 链式时间点切割:即按照训练集(训练子集、验证集)、测试集的方式来生成训练样本,并且按照训练的时间粒度来一个一个递推向前构造训练集;
参考链接:
我个人认为要么采用链式,要么采用滑动窗口的方式,也就是训练集和测试集的大小不改变,随着时间序列向前滑动。

4. 常用的评价指标

  • 点预测:对于点指标,常见的MSELoss、MAE、GMAE、RMSE等都可以用,也可以用绝对百分比误差;因为MSE、MAE比较常见,就不做具体的介绍,GMAE指的是误差的累积再开方,RMSE是对MSE进行开方;
    • 一般来说,RMSE>MAE>GMAE,也比较清楚地比较了几者的敏感程度;
    • RMSE和MAE对异常值比较敏感;