时间序列预测比赛小结(1)

一.时间序列基础

1.什么是时间序列?

表面上,时间序列就是按照时间的先后顺序排列的一串数值

数学意义上,时间序列是一串随机变量

2.研究时间序列的目的?

①点预测

②区间预测

3.什么样子的时间序列可预测?

①我们知道哪些因素会影响时间序列

②有大量的数据是可用的

③预测不会反向影响我们试图预测的事物

4.什么样子的时间序列可定量建模?

①关于过去的数据是可以用的

②有理由假设过去的一些模式会在未来延续下去

5.传统时间序列建模的三种方式

①回归模型:销量t+1=f(日期t+1,价格t+1,误差t+1)

②自回归模型:销量t+1=f(日期t+1,价格t+1,销量t,销量t-1,销量t-2,误差t+1)

指通过变量的实际观察值进行回归,代表算法:ARIMA

③动态回归模型:销量t+1=f(日期t+1,价格t+1,销量t,销量t-1,销量t-2,误差t+1)

考虑其他外部变量来预测实际观察值,代表算法:ARIMAX

关于传统时间序列建模和机器学习建模:机器学习中的建模一般需要假设样本独立同分布,依托大数定律拟合出参数,而前者需要假设样本平稳遍历性,依托遍历定理拟合出参数

6.名词释义

趋势性:一个时间序列具有长期增长或者长期下降的趋势

季节性:一个时间序列中的数据会受到季节的影响

周期性:一个时间序列存在不固定频率的上升和下降

滞后:当下时刻和前面时刻预测变量之间的关系

自相关:描述的是y(t)和y(t)的滞后之间的关系

偏自相关:只考虑y(t)和y(t-k)之间的关系

平稳性:图不能有周期性和趋势性

白噪声:对所有时间其自相关系数为零的随机过程

二.时间序列数据的成分

1.固有值level:固有值表示的是序列数据本身的数据大小程度,例如商品A是热门商品,其日销量是百万级别的,商品B是冷门商品,其日销量是个位数级别的,这里的级别就是固有值的一种表现,一般可以通过历史数据的中位数或者鲁棒性均值来衡量

2.趋势性:随时间变化的序列的变化模式,可以是线性或者非线性增加或减少的行为

3.季节性:序列数据随时间变化的重复模式或周期性为

4.周期性:周期性的发生频率低于季节性波动。与季节性不同,周期性变化可能没有固定的变化周期。此外,周期性变化的周期通常较大,例如典型的经济周期,跨度长,无规律,而季节性往往是在同一年内观察到的,例如季节,月度,周等

5.噪音:模型无法解释(拟合)的残差

需要注意的地方:

①大部分比赛或者业务中遇到的时间序列数据都有噪声

②并不是所有时间序列数据都有趋势性,周期性,季节性

③对于gbdt这类很强的传统机器学习模型来说,可以很好地学习到季节性的规律,但对于趋势性却难以捕捉,对于LR这样的简单模型或者nn这样的复杂模型可以捕捉到趋势性

④趋势性可以通过经济学模型或者简单线性回归模型等方式来缓解

三.时间序列预测建模前需要思考的问题

在进行时序数据建模之前,进行预测时,明确建模目的很重要

1.拥有多少数据,并且如何将它们汇总在一起?时间序列预测前期的数据处理相对于常规的表格数据比赛来说要麻烦的多,特别是对于供应链中常见的业务场景,例如预测某某电商双十一期间的销量,我们往往有成千上万个商品的序列,这时候海量数据的共同处理和高性能处理就需要好好考虑了

2.所需的预测时间跨度是多少?短期,中期还是长期?较短的时间范围通常更容易以较高的置信度进行预测,时间序列预测的周期越长,其预测的置信度越难以保证;一般来说,排除seq2seq这样对于序列长度不敏感的框架,我们基本需要指定两个时间窗口,一个时间窗口是我们需要指定使用多长的历史数据来预测未来,一个时间窗口是我们需要指定预测多长的未来数据

3.预测模型是否需要随时间推移而经常更新,或者仅仅进行一次建模并保持不变?时间序列预测的分布变化相对于常规的表格数据来说要更加频繁和剧烈,例如疫情,重大财政政策,电商平台的新规等都可能影响到电商的商品销量

4.需要什么时间频率?时间序列比较灵活的一点在于我们可以改变预测的时间粒度,例如假设我们使用过去140天的数据预测未来21天的数据,我们可以将问题的形式转化为使用过去20周的序列数据的均值,中位数或总和来预测未来3周的均值,中位数或者总和,通常来说短周期的数据噪声较多,序列数据的曲线更加不规则,但是数据量更大,对于复杂模型来说更能够从中充分的进行学习,中长期的数据噪声较少,曲线较为平滑,但是数据量相对来说就较少

5.时间序列数据通常需要清理,缩放和转换,我们应该采用怎么处理方式比较合理

6.时间序列数据中的缺失值应该如何处理?适用简单的0值插补?线性插补还是复杂的gan等方法进行插补?

7.对于异常值如何进行处理?仍旧是以电商销量预测为例,有时候,我们的业务目标就是预测双十一期间的销量,而双十一期间的商品销量往往是相对于平常呈现爆发式的增长,因此单纯从数据分析上来看,商品双十一期间的销量数据是异常值,但我们却很难直接对其进行删除或平滑的处理

四.时间序列预测问题的类型

1.标签为单变量

①单变量单步预测

最简单的时间序列预测问题,例如国家人口预测,某个发电站的电力预测等等,其特点是变量只有序列数据本身,并且只需要预测未来的一个时间步,例如使用过去14天的某商品销量数据预测未来1天的该商品的销量数据

②单变量多步预测

相对于单变量单步预测问题,预测的标签由点变成了区间

③多变量单步预测

相对于单变量单步预测问题,我们的序列数据就不仅仅是待预测的标签本身,例如温度预测,我们的序列数据可以是温度,气压,湿度等多种变量

④多变量多步预测

相对于多变量单步预测问题,我们需要预测未来多个时间步的序列数据,这是最常见也相对最复杂的一种问题形式

2.标签为多变量

相对于标签为单变量的情况,标签为多变量的形式更加复杂,例如我们通过某些序列数据来预测未来的两种序列数据,举个例子,我们通过温度,风力,湿度来预测未来的风力和温度,这就涉及到了多输出回归的问题,如果我们简单的对未来的多个序列数据进行单独建模则问题退化为标签为单变量问题

五.时间序列预测的变量类型

1.动态变量

在时间序列预测的问题中,动态变量指的是随着时间变化而变化的序列数据,这类数据可以是离散的也可以是连续的,以电商销量预测为例,商品的销量是典型的动态连续型变量,商品在页面的位置可以是动态离散变量

2.静态变量

在时间序列预测的问题中,静态变量指的是不随着时间变化而变化的数据,例如商品所在的省份,城市,店铺id,商品的类别等

六.时间序列预测比赛建模方案

1.规则建模:规则是通过对数据的EDA观察的结果建立的

①均值法预测

②朴素预测法:用最近的真实值作为后面的预测值

③季节性朴素预测法

④漂移法:朴素预测法的推广

⑤指数平均模型:离得越远,参数越小

2.自回归建模:AR,MA,ARIMA,SARIMA

指数平滑模型针对于数据中的趋势和季节性,自回归模型旨在描绘数据的自回归性,最出名的自回归模型是ARIMA模型

要求时间序列具有平稳性

构建ARIMA模型的三个步骤:序列平稳 → 定阶数 → 求参数

3.趋势拟合:prophet

prophet的方法是将时间序列看成关于t的一个函数,用拟合函数曲线的方法来进行预测,所以这也注定了prophet只能做单预测变量的时间序列回归

prophet模型有着直观的参数进行调整,不像其他模型(ARIMA)需要了解很多模型的机理

①适用的时间序列:商业时间序列

有很强的季节性,可以是多季节性的

存在趋势变化

偶尔有离群点

有假期效应

②模型建模

prophet本质是一个广义的加法模型,即将一个时间序列进行分解

核心公式:y(t) = g(t) + s(t) + h(t) + epsilon(t)

g(t):趋势项(分为饱和的趋势项和线性的增长项)

s(t):季节项(用傅里叶展开来逼近)

h(t):节假日(不一定具有季节性,且会有一种突然的效应,即不平滑,所以需要单独考虑)

epsilon(t):误差项

③模型训练

训练的过程就是一个拟合的过程。prophet的建模是从概率建模的角度来进行的,模型训练的过程是使用概率编程的思想,通过概率编程工具Stan来求解

prophet对于部分缺失值不会太敏感,但对一些异常值可能会很敏感

很讨巧的是,prophet从概率角度来建模的原因,更多的是为了在预测阶段引入不确定性(因为时间序列的预测不仅仅是要做点预测,更要做区间预测)这种预测阶段的不确定性保证了prophet可以做区间预测

④模型使用

prophet采用的是sklearn的API设计规范,使用fit训练模型,predict预测模型

prophet的输入数据是面板数据dataframe,包含ds,y两列,ds必须是pandas的时间格式,y是数据类型,是我们需要预测的数据

4.机器学习建模

①前置知识

无论是何种决策树,本质思想可以用一句话概括:对训练集进行划分,使得划分后的集合的纯度变得更纯。有这句话可知,对于决策树,三件事很重要:

如何定义集合的纯度?(划分前和划分后)

如何对集合进行划分?(选择哪个特征和阈值)

如何确定叶子节点的值?(决定了预测结果)

1)如何定义纯度?

回归问题:标签连续,使用方差定义纯度

分类问题:标签离散,使用熵和GINI指数定义

注意:划分前后,集合由一个变成了两个,所以需要对纯度进行加权求和

2)如何进行划分?

遍历特征,遍历样本对应的特征值,分别计算纯度和,选择纯度提升最大的那个

3)叶子节点值的确定?

当我们划分到叶子节点后,这个叶子节点对应的预测值,就是训练集落在这个叶子节点的均值(连续标签为均值,类别标签为类别占比)

②从GBDT到LGB

XGB的最底层仍然是前向加法模型,但不同点在于不是简单通过梯度下降来进行优化,而是巧妙引入树的正则项和二阶泰勒展开,使得GBDT在单个树的分裂和叶子节点值确定变得更加简单。虽然公式变简单,但在某中程度上反而更加精确了

③LGB模型

LGB模型在XGB的推导下,进行了进一步的优化,这些优化一方面是要减少计算量,另一方面可能起到防止过拟合的作用(因为原始数据存在噪声,一些粗糙处理可能反而能增加模型的泛化能力)

树模型的计算量主要体现在三个方面:样本数量,特征数量,候选点数量

所以LGB的核心技术就是从这三个维度出发,尽量减少每一个维度的计算量

对应的核心技术就是:

GOSS(梯度单边采样)减少样本数量

EFB(特征绑定技术)减少特征数量

Hist(直方图算法)减少候选点数量

5.深度学习建模

七.时间序列分解

1.步骤

估计趋势:移动平均估计趋势

②减去趋势

③估计季节

2.STL时间序列分解

八.时间序列的转换

常见的log变换,平方根转换,boxcox变换等

九.时间序列预测问题中的特征工程

1.滞后特征

例如我们要预测t时间的序列值,则我们取t-1,t-2,t-3 ... t-n的数据作为特征来预测t,这里t-1 ~ t-n的数据即为构造的滞后特征

2.滑动窗口

例如我们要预测t时间的序列值,则我们取t-1,t-2,t-3 ... t-n的数据作为特征,同时我们可以计算(t-1 ~ t-7)这一大小为7的窗口下的序列值的均值,中位数,最大值,最小值,求和,方差等统计特征来作为滑动窗口特征和滞后特征concat一起来帮助预测t,这里我们的统计值即为构造的滑动窗口特征

3.累计滑动窗口

仍旧是针对上面的例子,我们可以计算(t-1 ~ t-7),(t-1 ~ t-8),(t-1 ~ t-9)... (t-1 ~ t-n)的不同大小窗口内的序列值的各类统计值作为累计滑动窗口特征

4.差分和比例

仍旧是针对上面的例子,我们可以计算(t-1)-(t-2),(t-2)-(t-3),(t-3)-(t-4)... (t-(n-1))-(t-n)...的值或者(t-1)/(t-2),(t-2)/(t-3),(t-3)/(t-4)...(t-(n-1))        /(t-n)的值作为补充特征,当然我们可以扩大差分的时间跨度,例如使用(t-1)-(t-4)等

基于差分/比例的滞后,滑动窗口统计,累计滑动窗口等:我们通过差分得到的实际上是两两时间点的序列值的差值,同样我们可以对这些差值进行上述的各种特征衍生方式

5.趋势

仍旧是针对上面的例子,我们可以计算[(t-1)+(t-2)]/[(t-3)+(t-4)]/2-[(t-3)+(t-4)]/2或者[(t-1)-(t-2)]/2/[(t-3)-(t-4)]/2,即计算两个不同时间区间的均值,总和等统计值并且进行减法或者除法的对比从而将数据变化的趋势表示出来

6.其它

在面临实际的应用问题的时候,我们的数据中往往也存在静态数据,例如商品所在城市,省份等,这类静态数据的处理和常规的表格数据中的处理思路是完全一致的

十.工作中对于时间序列预测常见的处理思路

在实际应用的过程中,我们常常将复杂模型和简单模型进行复合预测,例如使用线性回归拟合趋势,剩下的残差使用nn或者gbdt来拟合,亦或使用移动平均,加权移动平均,中位数,时间序列分解,fbprophet等模型+复杂模型的方式来共同预测

十一.注意事项

1.在构建训练集和标签的时候我们面临的第一个问题就是要使用多长的历史数据来预测未来,如果历史数据取的太短,则训练数据长度不足,无法覆盖历史上所有的序列数据的变化情况,如果数据取太长,太久之前的历史数据其内在规律和近期的历史数据的内在规律有可能存在较大的区别,即分布偏移的问题,会使得训练的模型相对当前的任务有偏,因此常见的方法是截取不同长度的历史数据进行测试,可以将截取的历史数据的长短作为超参数进行调整

2.时间序列的插补实际上是一个非常庞大的学科,包括了传统的0值插补,均值/中位数插补,线性插补和复杂的基于深度学习的gan插补等方式,一般来说,在比赛和实际应用中,比较常见的做法是做0值填充,删除缺失太多的序列等做法

3.交叉验证式的集成:这基本是表格数据比赛的通用方法,一般来说通过交叉验证的方式实现bagging,例如无折交叉验证,实际上每一折都等同于进行了80%的bagging,最后预测的时候五折交叉验证产生5个bagging后的模型,5个模型的预测结果进行简单平均,大部分情况下,这样得到的预测的稳定性和准确性都能得到一定提高

十二.技巧

1.使用中位数而不是平均数,对于波动剧烈的序列数据来说更加可以鲁棒性地反映序列数据整体的平均情况

2.分层标准化:通过将每个序列的log+offset转换后的序列值再减去历史数据的中位数来分别对每一个网页的序列数据进行分层标准化

3.虽然nn号称万能拟合器,理论上能够学习到序列数据中的趋势性,周期性,季节性,然而在实践的时候我们会发现,nn对于趋势性特征的拟合并不像预期那么好,主要原因在于:①普通人很难设计出合理的网络结构去拟合趋势性②即使设计出很好的网络结构,nn训练中的各种鞍点,局部最优等训练困难的问题导致很难得到好的结果

上述思路是将趋势性特征表征成特征,辅助nn去学习,除此之外还有一个比较好的思路,即在业务和比赛中都会用到的复合策略,使用LR或者一些经典的经济学模型,例如ARIMA,SARIMA等来拟合趋势,使用原始的标签减去趋势型模型的预测结果得到残差,剩下的差值数据理论上被削去了趋势性,则剩下的周期性,季节性,残差可以使用GBDT或者nn这类复杂的模型来拟合

上述的方法就是:简单模型+复杂模型的复合策略

你可能感兴趣的:(比赛,kaggle,数据挖掘)