全文共9000余字,预计阅读时间约18~30分钟 | 满满干货(附代码),建议收藏!

在这里插入图片描述

1. 时间序列数据

1.1 概念

时间序列是一个非常重要的概念,在统计学、经济学、社会科学、物理学等许多领域都有广泛的应用。

从专业定义上来讲:时间序列是按时间顺序排列的数据集合。这些数据可以在任何时间间隔(例如,每秒、每分钟、每小时、每天、每月、每年等)观察和收集。在统计学中,时间序列分析包括了一系列用于分析时间序列数据的方法,目的是提取出数据中的有意义的统计信息并对未来进行预测。

通俗的解释一下:我们可以将时间序列想象成一个有序的“数据日志”。

举个例子,如果你每天在同一时间测量体重并记录下来,那么你就有了一个关于体重的时间序列数据。如果你每天都记录下你走了多少步,那你就有了一个步数的时间序列数据。

这种按照时间顺序收集的数据提供了一个观察和理解事物如何随时间发展和变化的有力工具。比如,通过分析历史的销售数据(时间序列数据),公司可以预测未来的销售趋势,从而做出更明智的商业决策。

为了让大家更好的理解,我生成了一个用于表示月度销售数据的时间序列的表格。这个例子展示了一个假设的公司在一年中每个月的销售额。
在这里插入图片描述

上述表格展示了一个典型的时间序列数据集,其中“月份”是时间戳,“销售额”则是与每个时间戳相对应的值。这个时间序列显示了公司的月销售额随时间的变化趋势。例如,从这个表格中,我们可以观察到在一年中销售额的增长趋势。这类数据分析可以帮助我们理解过去的业务表现,并预测未来可能的销售情况。

值得注意的是,时间序列数据的一个关键特性是其有序性,即数据点之间的顺序非常重要。在此例中,如果我们打乱了月份的顺序,那么就无法从数据中看出销售额的变化趋势了。

到这里大家应该能很好的理解时间序列数据了吧,那我们继续往下探索

1.2 单变量VS多变量时间序列数据

时间序列数据可以分为单变量数据和多变量数据,这取决于我们在每个时间点观察的变量的数量。

单变量时间序列只涉及一个变量随时间的变化。这个变量在每个时间点都有一个观察值。例如,每天的股票价格、每月的销售额、每小时的气温等,这些都是单变量时间序列的例子。如上一节中的例子,我们只能根据公司的月销售额去预测未来的销售额。

在单变量时间序列预测中,我们只依赖一个变量的历史数据来预测该变量的未来值。

有单变量当然也就会有多变量。多变量时间序列涉及到两个或更多的变量随时间的变化。在每个时间点,这些变量都有观察值。例如,一个公司可能会记录每天的销售额、访客数量、广告支出等多个变量,这就构成了一个多变量时间序列。

在多变量时间序列预测中,我们不仅仅使用一个变量的历史数据,还会使用其他变量的历史数据来预测某个变量的未来值。比如,我们可能会使用过去的销售额和广告支出的数据来预测未来的销售额。

在这里插入图片描述

如上表格展示了一个典型的多变量时间序列数据集,其中"月份"是时间戳,而"销售额"、"广告费用"和"产品数量"都是与每个时间戳相对应的值。这个时间序列显示了公司的月销售额、广告费用和产品数量的变化趋势。

从这个表格中,我们可以观察到销售额、广告费用和产品数量都随时间有所增长,但是这三个变量之间的关系并不是一一对应的。也就是说,虽然产品数量和销售额增长了,但广告费用也可能会增加,这可能影响公司的利润。

在处理多变量时间序列数据时,我们需要分析不同变量之间的相互影响,以及这些影响如何随时间变化。例如,我们可能会对广告费用增加是否会导致销售额增加感兴趣,或者是否存在销售额增加但产品数量减少的情况。通过理解这些关系,我们可以更好地预测未来的趋势,并做出更明智的商业决策。

1.3 单变量VS多变量时序数据的区别

在这里插入图片描述

最简单的情况下,时序预测的数据往往由相对确定的时间戳组成(即,每个样本是一个时间点,如上一节中的月份),每个时间点对应一个标签值,时间是影响该标签唯一的自变量,这种最为单纯的数据被称之为单变量时序数据

许多时候,单变量时序数据的时间戳会呈现等间隔的状况,例如每一天一个值、每一分钟一个值等等。在时序预测中,假设样本与样本之间存在相关性(即之前的时间上的指标会影响之后的时间上的指标),利用历史数据预测未来数据走向就是时间序列预测的本质。

统计学中的时间序列问题大多都从单变量的时序问题出发。在单变量时间序列中,时间或时间相关的变量是影响标签变化的众多因子中唯一可以被获得的因子。因此在建模过程中,标签的变化只与时间这一单一变量有关(例如,在上面的左侧图中,销售额只与时间相关)。这种预测的难度往往很大,且精度很低,投入现实使用相对困难。

相对的,多变量时间序列是现实中更加常见的、更普遍存在的时间序列数据。

机器学习在做时间序列预测时大多使用多变量时序数据。在多变量时间序列中,时间是影响标签变化的因素之一,除了时间之外,往往还有别的决定性因素、或同样重要的因素和时间共同作用、影响着标签。(例如在上面的图中,销售额、广告费用和产品数量都随时间有所增长,但是这三个变量之间的关系并不是一一对应的)。这一类型的预测精度会远远高于单变量时序预测。

2. 时序模型 pk 机器学习

2.1 时间序列 vs 机器学习

如果以单变量时序数据来举例:其数据仅仅由时间和标签两个列组成,这种形态不同于大部分机器学习算法中常见的、拥有大量列的特征矩阵,但时序数据却与理论上最简单的特征矩阵高度相似。如图:
在这里插入图片描述

对于只有一个特征 X X X与标签 y y y的特征矩阵、是机器学习算法最为简单的训练数据。使用机器学习算法在这一数据上建模时,本质就是在寻找X与y之间的函数关系,因此机器学习算法可以接受只含一个特征的数据,并且能够顺利地找到这一唯一的特征与标签之间的关系。当对时间序列进行预测时,其实也是在寻找时间与标签之间的函数关系,从这个角度来看,在普通数据上训练、在时序数据上训练并无差别。哪怕时间序列数据只有一个特征,机器学习也是可以支持建模的,可见特征的数量并不是时序数据和一般机器学习数据的关键差异。那总结了如下:

项目单变量时间序列模型传统机器学习模型
数据的维度基于一个输入特征(X)来预测一个输出(Y)基于一个输入特征(X)来预测一个输出(Y)
模型训练使用历史数据来训练模型使用历史数据来训练模型
数据的依赖性数据点之间存在时间依赖性数据点之间假设相互独立
输入特征的定义输入特征(X)通常是前一步或前几步的值输入特征(X)通常是预定义的,并且与时间无关
数据的划分按时间顺序将数据划分为训练集和测试集随机地划分训练集和测试集

总的来说,单变量时间序列建模与只有一个X和Y的机器学习建模都涉及到使用一个输入特征来预测一个输出,但由于时间序列数据的特性,它们在数据依赖性、输入特征的定义和数据划分方式上存在显著的区别。

所以通过上述的结论,我们也就能明白:为什么会出现一些适合于时间序列数据本身的算法,根本的原因还是在于传统时间序列数据在机器学习模型下的建模结果往往不尽如人意。

2.2 机器学习建模时序数据的问题

虽然理论上机器学习模型是可以处理时间序列数据的,尤其在单变量情况下,仿佛没有太大的区别。然而,当我们将时间序列数据投入到机器学习模型进行预测时,我们可能发现模型的效果并不像我们期望的那样。这是为什么呢?主要有以下几个原因:

  1. 忽视时间依赖性:在时间序列数据中,当前的观察结果通常取决于之前的观察结果,这种现象被称为时间依赖性。但是,传统的机器学习模型通常假设数据之间是独立的,这就忽视了时间序列数据的这种重要特性。

  2. 时间不是影响标签的关键因素:大部分时间序列预测中,时间并不是对因变量真正有关键影响的因子,比如真正影响“明天是否会下雨”的因子应当是空气的湿度、洋流的流动、雨云的移动、上旋气流的强度等等,下雨这个客观事实发生在“明天”,并不代表下雨这个客观事实因“明天”而发生。这一点对单变量和多变量时间序列都是如此,但在实际操作中单变量时间序列的预测难度更大,毕竟特征越少、预测的难度会越大。

  3. 缺乏趋势和季节性建模:时间序列数据通常包含趋势和季节性成分,传统的机器学习模型可能无法有效地模拟这些成分。而专门的时间序列模型,如ARIMA和Prophet,可以明确地建模这些成分。时序模型依赖于时间与时间的相关性来进行预测,但普通机器学习模型并不会考虑样本之间的相关性。时间和日期的特性,包括周期性、趋势性和相关性,赋予我们能力从历史数据中提取有价值的信息。比如说,我们可以将日期按照星期、月份、季节、年代等周期性因素进行分割,这些相似的时间单位可能导致一些指标展现出相似的行为模式。再如,如果昨天降雨,那么今天继续降雨的概率就较高。如果连续几天都在下雨,那么明天天晴的可能性就增加了。历史事件的影响可以累积,从而对未来产生作用,这就是时间的“趋势性”特点。正因为存在这种趋势和周期性,时间序列预测认为各个样本间存在着相关性,因此,它专注于理解和学习这种“周期性规律”和“趋势”。然而,传统的机器学习算法通常视各个样本为独立个体,其学习的角度和方法与时间序列模型有着显著的不同。

  4. 最重要的一点:传统的机器学习模型在处理未见过的特征值时存在局限性,而在时间序列预测中,我们总是要预测未来的日期,这是一种永远未曾在历史数据中出现过的特征。举例来说,在机器学习模型中,如果某个特征的训练数据包括[“苹果”, “梨”, “百香果”]三种类别,那么模型学习到的所有规律都将围绕这三个类别。如果测试样本的这个特征值为[“西瓜”],那么机器学习模型将无法有效利用该特征进行预测,因为对于“西瓜”这一类别,模型是一无所知的(这也反映了人类学习的一种模式)。然而,对于时间序列数据,测试集中的时间特征值永远都是未来的、未出现过的日期。比如,如果我们把过去10年的日期按照顺序编码为[1,3650],那么当遇到编码为3655(表示10年后的第5天)的时间特征时,模型仍然会感到困惑。因此,传统的机器学习模型在处理时间序列数据时,往往无法获得满意的预测结果。

2.3 时序模型与机器学习的异同

在处理时间序列数据时,我们通常使用专门的时间序列模型。尽管时间序列模型和传统的机器学习模型在许多方面都相似,比如他们都通过从历史数据中学习模式进行预测,他们都使用平均绝对误差(MAE)、均方根误差(RMSE)、精确度等来衡量模型的表现,他们都需要将数据集拆分为训练集和测试集。然而,由于时间序列数据的特殊性,时间序列模型在数据结构、特征工程、模型类型以及训练/测试拆分方式等方面和传统的机器学习模型有着明显的区别。理解这些区别和共性是构建有效的时间序列预测模型的关键。

项目时间序列模型传统机器学习模型
学习过程通过历史数据学习模式进行预测通过历史数据学习模式进行预测或分类
评估指标平均绝对误差(MAE)、均方根误差(RMSE)、精确度等平均绝对误差(MAE)、均方根误差(RMSE)、精确度等
训练/测试拆分将数据集拆分为训练集和测试集将数据集拆分为训练集和测试集
数据结构数据点之间存在时间依赖性数据点之间假设相互独立
特征工程提取趋势、季节性、周期性成分或使用滞后特征创建新特征、删除不相关特征或对特征进行转换
模型类型包括自回归模型(AR)、移动平均模型(MA)、ARMA、ARIMA、SARIMA等包括随机森林,支持向量机,神经网络等
训练/测试拆分方式按时间顺序拆分数据集随机拆分训练集和测试集

3. 时序建模规范

时序模型的核心思想就是基于过去的信息来预测未来的结果,它并不能进行反向操作。这是因为时间的流动是单向的,从过去向未来,我们无法改变过去的事情,也无法预先知道未来会发生什么。时序模型是根据历史数据学习出一个趋势或模式,然后基于这种趋势或模式预测未来的数据。

我们用一个简单的天气预测例子来说明这个概念。假设我们想要预测明天的天气,我们会参考过去几天或者过去几周的天气模式,比如温度的升高或降低,湿度的变化,风速的变化等等。通过这些信息,我们可以得到一个大概的趋势,比如天气正在变热,或者湿度正在增加。基于这个趋势,我们可以预测明天可能会很热,或者可能会下雨。

然而,我们不能反过来,基于明天的天气来预测今天的天气。因为明天的天气还没有发生,我们无法获取明天的天气信息。即使我们能够知道明天的天气,也无法改变今天已经发生的天气。

这就是为什么时序模型只能用过去的数据来预测未来的数据,不能反向操作的原因。

3.1 划分训练集、测试集原则

在使用时序数据进行建模时,有两个主要的原则需要保证训练集和测试集的划分:

  • 时间顺序: 因为我们的目标是预测未来,所以在构建训练集和测试集时,我们不能使用未来的信息来预测过去。也就是说,我们需要确保训练集的所有数据在时间上都早于测试集的数据。对单变量时序数据而言这是说样本顺序是绝对不能被打乱的,测试集的样本时间永远要晚于训练集

  • 无重叠: 在实际场景中,通常不会有时间既在训练集又在测试集中出现。这就意味着训练集和测试集应该是互斥的,即他们在时间上没有交集。

覆盖日期作用
1月-9月训练集的真实标签
10月-12月测试集的真实标签

3.2 时序模型的训练方式

3.2.1 单步预测

最简单的方式是,将时间数据按照普通回归数据的方式进行训练和预测。即训练集、验证集和测试集是完全分割的三段时间,在训练集上训练、在验证集上调参,在测试集上输出最终预测结果。这种方式被称为“单步预测”。

使用历史数据来预测未来的一个时间步的值。这个“步”可以是任意时间单位,比如分钟、小时、天、月,等等。具体来说,我们只预测未来一个时间步长(例如,下一个小时、下一天、下一年等)的值,而不考虑其后的情况。

以预测每日销售量为例,设想一下我们有一系列的历史销售数据:

日期销售量
1月1日100
1月2日120
1月3日130
1月4日110
1月5日115

如果我们想要对1月6日的销售量进行预测,那么我们可以根据过去几天(例如1月1日到1月5日)的销售数据来预测1月6日的销售量。这就是单步预测,因为我们只预测了一个时间步长(在这个例子中是一天)之后的值。

需要注意的是,在进行单步预测时,我们并不关心在预测点之后的情况。换句话说,我们不关心1月6日之后的销售量如何,只关心1月6日的销售量预测值。这就是单步预测的主要特点。

这种方式执行起来较为简单,但训练难度较大、一个模型需要学习出多种规律。

3.2.2 多步预测

多步预测指的是使用历史数据来预测未来多个时间步的值。与单步预测只预测未来一个时间步长的值不同,多步预测将预测范围扩展到了未来多个时间步长。

例如,假设我们有一系列的历史销售数据,现在我们想要预测未来三天的销售量:

日期销售量
1月1日100
1月2日120
1月3日130
1月4日110
1月5日115

在这种情况下,我们可以根据过去几天(例如1月1日到1月5日)的销售数据来预测1月6日、1月7日和1月8日的销售量。这就是多步预测,因为我们预测了多个时间步长(在这个例子中是三天)之后的值。

在多步预测中,我们对未来的多个时间点的预测结果都感兴趣。也就是说,我们关心的不仅仅是1月6日的销售量预测值,我们还关心1月7日和1月8日的销售量预测值。这就是多步预测的主要特点。

很明显,离现在越远的未来越难预测,因此应该要尽量压缩训练集与测试集之间的时间差,如:
在这里插入图片描述

将测试集上的时间分割为5段,假设t是当前的时间,先使用训练好的模型预测出t+d时间段的结果,将该结果加入训练集、构成全新的训练数据。即是说,我们将预测的值作为真实值加入到训练集中再对下一个单位时间进行预测,这样累加可以让训练数据的时间点与测试数据的时间点尽量接近。

缺陷也是很明显的。多步预测中可能会导致误差累加,如果在最开始预测时就存在很大的误差,那预测效果会变得越来越差且无法挽回。

3.2.3 逐点预测与分布预测

逐点预测是指在每一个特定的未来时间点,预测一个最可能的值。逐点预测是我们最常见的预测形式,例如在天气预测中,我们可能会预测明天的最高气温为27度,这就是一个逐点预测。在金融市场中,我们可能会预测明天的股票价格为$150,这也是逐点预测的一种应用

分布预测则是预测一个未来时间点的所有可能值的概率分布。相比于逐点预测,分布预测提供了更多的信息,包括预测值的不确定性和风险。例如,对于明天的天气,我们不仅预测最高温度可能为27度,还预测它可能在25-29度之间的概率为90%,可能在23-31度之间的概率为95%,这样的预测就是分布预测。在金融市场中,我们可能会预测明天的股票价格在$145-$155的概率为80%,在$140-$160的概率为90%,这也是分布预测的一种应用。

总的来说,逐点预测为我们提供了一种精确的预测值,而分布预测则给出了更多关于预测不确定性和风险的信息。

4. 时序任务分类

4.1 Forecasting

预测是时间序列分析的最常见任务,主要目标是利用过去的数据来预测未来的数据。也称为"Forecasting",在单变量时间序列分析中,是指预测未来一段时间内连续时间点的值。这种预测主要依赖时间特征,并基于以下几个要求:

  1. 数据样本必须遵循时间顺序排列
  2. 各个样本之间的时间间隔必须保持一致
  3. 数据样本之间存在相互关联性
  4. 过去的样本数据将影响未来的预测值

这类预测要学习的是过去的值、要预测的是“下一个样本”的值,并不关心特征。在实际中,我们使用规则+统计学模型来完成这类预测,但只要遵守“过去预测未来”的铁律,我们也可以使用机器学习模型+多步预测等方式完成Forecasting。

4.2 Time Supervision

时序有监督学习包括时间序列回归和时间序列分类两种有监督学习方法(Time Series Regression/ Time Series Classification),指的是在多变量时间序列上,基于时间或时间相关的数据,完成回归或分类任务,这类任务对样本与样本之间的时间顺序、相关等都没有要求、反而更关注特征之间的关系,因此这类任务要求:

  1. 数据中必须存在除时间之外的其他特征,且特征越多越好
  2. 可以完成“去时序化”处理,将时序数据彻底变为一般机器学习数据,这种方式可以看我的实战: 时间序列分析与异常检测:使用RNN监测Nginx访问量

这一类任务是学习特征值、预测标签值,并不关心样本。

5. 时序算法总结

算法类别算法名称主要原理
经典统计方法AR(自回归模型)基于过去的p个时间点的观测值进行预测。
MA(移动平均模型)基于过去的q个时间点的误差项进行预测。
ARMA(自回归移动平均模型)结合了AR模型和MA模型,基于过去的p个时间点的观测值和过去q个时间点的误差项进行预测。
ARIMA(自回归积分移动平均模型)ARIMA模型是ARMA模型的推广,可以处理非平稳序列预测。
SARIMA(季节性自回归积分移动平均模型)SARIMA模型是ARIMA模型的推广,可以处理带季节性的非平稳序列预测。
Holt-Winters模型一种双指数平滑模型,可以处理具有趋势和季节性的时间序列数据。
机器学习随机森林随机森林是一种集成学习方法,通过集成多个决策树的预测结果来做出最终的预测。
支持向量机支持向量机通过在高维空间中找到最优超平面,实现对数据的分割或预测。
神经网络神经网络通过模拟大脑神经元连接的方式,进行信息处理,可以捕获和学习数据中的复杂模式。
深度学习RNN(循环神经网络)RNN能够处理序列数据,通过隐藏状态来捕获序列中的时间依赖关系。
LSTM(长短期记忆网络)LSTM是RNN的一种,通过增加一个记忆单元,解决了RNN处理长序列时的梯度消失问题。
GRU(门控循环单元)GRU是RNN的一种,结构比LSTM更简单,但在许多任务上的表现与LSTM相近。
TCN(时序卷积网络)TCN通过一维卷积,有效地处理序列数据。
TransformerTransformer通过自注意力机制有效地处理序列数据,广泛应用于NLP领域,也开始用于时序预测任务。

6. 结语

在这篇文章中,讲述了什么是时序数据以及时序模型与传统机器学习在处理这类数据时的差异。通过这篇文章,我希望能帮助大家建立起一个关于时序分析的初步认识,以及理解其相较于常规的机器学习模型的独特之处。

最后,感谢您阅读这篇文章!如果您觉得有所收获,别忘了点赞、收藏并关注我,这是我持续创作的动力。您有任何问题或建议,都可以在评论区留言,我会尽力回答并接受您的反馈。如果您希望了解某个特定主题,也欢迎告诉我,我会乐于创作与之相关的文章。谢谢您的支持,期待与您共同成长!

期待与您在未来的学习中共同成长。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐