目录
本周我阅读了一篇关于时间序列预测的论文,文章中提出了一种新的时间序列学习框架CoST,通过对比学习解开的季节性趋势表示。CoST在实验中始终优于最先进方法,多变量基准上实现了21.3%的MSE改进。其次我还学习了ARIMA的基础知识,ARIMA模型的基本思想是利用数据本身的历史信息来预测未来。
This week, I read a paper on time series forecasting. The paper introduces a novel time series learning framework called CoST, which unveils seasonal trends through contrastive learning. CoST consistently outperforms state-of-the-art methods in experiments, achieving a 21.3% improvement in Mean Squared Error (MSE) on a multivariate benchmark. Additionally, I delved into the fundamentals of ARIMA. The basic idea of the ARIMA model is to use the historical information of the data itself for predicting the future.
题目:COST: CONTRASTIVE LEARNING OF DISENTANGLED SEASONAL-TREND REPRESENTATIONS FOR TIME SERIES FORECASTING
深度学习在时间序列预测中备受关注,采用了基于神经网络的端到端训练。从经典的LSTM/RNN到近期的TCN和Transformer,这些方法不断演进。受到计算机视觉和自然语言处理成功经验的启发,提出了一种新的时间序列学习框架CoST,通过对比学习解开的季节性趋势表示。CoST在实验中始终优于最先进方法,多变量基准上实现了21.3%的MSE改进。CoST对主干编码器和下游回归器的选择也具有鲁棒性。
Deep learning has gained significant attention in the field of time series forecasting, employing end-to-end training based on neural network architectures. From classical LSTM/RNN to recent TCN and Transformer models, these approaches continue to evolve. Inspired by the successful experiences in computer vision and natural language processing, a novel time series learning framework, CoST, is proposed. CoST utilizes contrastive learning to capture the unfolded seasonal trends. Experimental results consistently demonstrate the superiority of CoST over state-of-the-art methods, achieving a 21.3% improvement in MSE on multivariate benchmarks. Furthermore, CoST exhibits robustness in the choice of backbone encoders and downstream regressors.
1.从因果关系的角度展示了通过对比学习学习时间序列预测的分离季节趋势表征的好处。
2.提出了CoST模型,这是一种时间序列表征学习方法,利用模型体系结构中的归纳偏差来学习分离的季节和趋势表示,并结合了一种新的频域对比损失来鼓励区别性的季节表示。
3.与真实世界的基准相比,CoST比现有的最先进的方法高出了相当大的幅度,还分析了每个提出的模块的好处,并通过消融实验研究确定,对于主干编码器和下游回归器的各种选择,CoST都是有很好的鲁棒性。
通过从观测数据端到端地联合学习这些层可能导致模型过度拟合,捕捉到观测数据中不可预测噪声的虚假相关性。当学习到的表示相互纠缠时,尤其是当特征表示的一个维度编码来自数据生成过程的多个本地独立模块的信息时,情况会更加恶化,而本地独立模块经历了分布转移。为了解决这一问题,文章提出了一种回归,旨在学习对时间序列预测更有用的分离的季节趋势表征。
为了实现这一目标,引入了一种新的对比学习框架,即CoST,用于学习长序列时间序列预测任务中的分离季节趋势表征。具体而言,CoST利用模型架构中的归纳偏差,通过引入混合自回归专家来解决回溯窗口选择的问题,经济高效地学习趋势表征。此外,通过引入可学习的傅里叶层,CoST增强了季节表征,该层支持频率内交互。趋势和季节表征都是通过对比损失函数学习的,趋势表征在时域中学习,而季节表征则通过一种新的频域对比损失学习,鼓励区分季节表征并解决了确定数据中存在的季节模式周期的问题。
复杂数据源的丰富交互需要良好的表征来应对结构变化,以确保对复杂性和多样性的鲁棒性。否则,在非独立同分布的数据情境下,可能会捕捉到不良的虚假特征。
为了实现这一目标,引入了时间序列的结构先验,借鉴了贝叶斯结构时间序列模型的思想。因果图显示,观测到的时间序列数据X由误差变量E和无误差的潜变量X生成,而X则由趋势变量T和季节变量S生成。揭示X*有助于最佳预测,取决于T和S。
我们的目标是学习无误差的潜变量X*。
通过独立机制假设,季节和趋势模块相互不影响。分离季节性和趋势性的设计更好地应对非平稳环境。独立学习季节和趋势机制,灵活地重复使用和重新定位。
对E的干预不影响条件分布,允许找到与最优预测稳定关联。受M等人启发,构建了代理对比学习任务。使用数据扩充作为误差E的干预,通过对比学习学习T和S的不变表示。选择了缩放、移位和抖动等三种典型增强,模拟多样误差,有利于学习更好的表示。
?趋势特征表示
提取潜在趋势对于时间序列建模至关重要。自回归滤波是一种广泛使用的方法,因为它能够从过去的观测中捕获时间滞后的因果关系。一个具有挑战性的问题是选择适当的回溯窗口-较小的窗口会导致拟合不足,而较大的模型会导致拟合过度和参数化过度。一个简单的解决方案是通过对训练或验证损失进行网格搜索来优化该超参数,但是这种方法的计算成本太高。因此,建议使用混合自回归专家,可以自适应的选择适当的回溯窗口。
趋势特征分解器(TFD)
如图3b所示,TFD是L+1自回归专家的混合,其中,每个专家被实现为具有d个输入通道和个输出通道的1d因果卷积,其中第i个专家的核大小为。每个专家输出一个矩阵。最后,对输出执行平均池化操作,以获得最终的趋势表示,
时域对比损失我们利用时域中的对比损失来学习有区别的趋势表征。该变体利用动量编码器获得正对的表示,并使用带有队列的动态词典获得负对的表示。在附录A中进一步阐述了对比学习的细节。然后,给定N个样本和K个负样本,时域对比损失为
在给定样本的情况下,我们首先为对比损耗选择一个随机时间步长T,并应用一个投影头(projection head),它是一个单层MLP来获得q,k分别是动量编码器/动态字典中相应样本的增强版本。
季节性特征表示
频域频谱分析已广泛用于季节性检测。因此,我们转向频域来处理季节表示的学习。为此,目标是解决两个问题:i)如何支持频域内交互(特征维度之间),使表征更容易编码周期性信息;ii)学习能够区分不同季节性模式的表征需要什么样的学习信号?标准主干架构无法轻松捕获频率级交互,因此,引入了SFD,它利用了可学习的傅里叶层。然后,为了在没有周期性先验知识的情况下学习这些季节性特征,对每个频域进入频域对比损耗。
季节性特征分离器(SFD)如图3c所示,SFD主要由离散傅里叶变换(DFT)组成,以将中间特征映射到频域,然后是可学习的傅里叶层。我们在附录B中提供了DFT的进一步详细信息和定义。DFT沿时间维度应用,并将时域表示映射到频域。
是频域数,接下来,可学习的傅里叶层通过perelement线性层实现,该层支持频域交互。它在每个频域上应用仿射变换,每个频率都有一组唯一的复数参数,因为不希望该层具有平移不变性。最后,使用逆DFT操作将表示转换回时域。
该层的最终输出矩阵为季节表征,,可以表示输出的第i,k个元素为
其中是每元素线性层的参数。
?
频域对比损耗如图3c所示,频域损耗函数的输入是前iFFT表示,记为。这些是频域中的复数表示。为了学习能够区分不同季节模式的表示,我们引入了频域损失函数。由于我们的数据增加可以解释为对误差变量的干预,季节信息不会改变。因此,频域中的对比损失对应于在给定频率的不同周期模式之间进行区分。为了克服用复数表示法构造损失函数的问题,每个频率可以用其振幅和相位表示法唯一地表示。然后损耗函数表示为
1、数据集
在该研究中,广泛应用了五个真实世界的公共基准数据集进行实验。首先,ETT(电力变压器温度)数据集包含两个小时级数据集(ETTh)和一个15分钟级数据集(ETTm),其中测量了六个电力负荷特征和“油温”作为所选的单变量预测目标值。第二个数据集是电力,记录了321个客户的用电量,将数据集按小时水平转换,并将“MT 320”设置为单变量预测的目标值。第三个数据集是天气,包含美国近1600个地区的11个气候特征,将“湿球计温计”作为单变量预测的目标值。此外,M5数据集也包含在附录J中。
2、参数设置
在评估设置方面,我们进行了多变量和单变量预测的实验,涵盖了所有数据集的不同维度。多变量预测涉及多变量输入和输出,而单变量预测涉及单变量输入和输出,即上述目标值。我们使用MSE和MAE作为评估指标,采用60/20/20的训练/验证/测试集划分,输入进行零均值归一化,同时在不同预测长度上进行评估。标准的超参数设置包括批量大小为256,学习率为1E-3,动量为0.9,重量衰减为1E-4,使用SGD优化器。
3、实验结果
基线中,在主要结果中报告了表征学习技术的性能,包括TS2Vec、TNC和MoCo的时间序列调整。
表1总结了CoST的结果和多变量设置的最佳性能基线的结果,对于端到端预测方法,TCN通常优于基于Transformer的方法Informer和LogTrans。同时,表征学习方法优于端到端预测方法,但确实存在一些情况,例如在单变量设置的某些数据集中,端到端TCN表现出奇地好。而Transformer已作为NLP等其他领域的强大模型,这表明TCN模型仍然是一个强大的基线模型,仍然应该考虑用于时间序列。
总的来说,我们的方法实现了最先进的性能,在多变量和单变量设置下,分别比性能最好的端到端预测方法高出39.3%和18.22%(MSE)。在多变量和单变量设置中,CoST也分别比性能次优的基于特征的方法高21.3%和4.71%(MSE)。这表明CoST通过学习趋势和季节特征的组合来学习更多相关特征,这对于预测任务至关重要。
与时间序列预测的标准端到端监督训练方法相比,将表征学习和下游预测任务分离是一种更具前景的范式。我们以实证的方式证明了这一点,并从因果关系的角度对其进行了解释。根据这一原则,我们提出了CoST,这是一个对比学习框架,用于学习时间序列预测任务的分离趋势表征。大量的实证分析表明,CoST比以前最先进的方法高出了相当大的幅度,并且对各种主干编码器和回归器的选择具有鲁棒性。未来的工作将扩展我们的框架,用于其他时间序列智能任务。
ARIMA模型全称为自回归差分移动平均模型(Autoregressive Integrated Moving Average Model)。ARIMA模型主要由三部分构成,分别为自回归模型(AR)、差分过程(I)和移动平均模型(MA)。
ARIMA模型的基本思想是利用数据本身的历史信息来预测未来。一个时间点上的标签值既受过去一段时间内的标签值影响,也受过去一段时间内的偶然事件的影响,这就是说,ARIMA模型假设:标签值是围绕着时间的大趋势而波动的,其中趋势是受历史标签影响构成的,波动是受一段时间内的偶然事件影响构成的,且大趋势本身不一定是稳定的
简而言之,ARIMA模型就是试图通过数据的自相关性和差分的方式,提取出隐藏在数据背后的时间序列模式,然后用这些模式来预测未来的数据。其中:
1、AR部分用于处理时间序列的自回归部分,它考虑了过去若干时期的观测值对当前值的影响。
2、I部分用于使非平稳时间序列达到平稳,通过一阶或者二阶等差分处理,消除了时间序列中的趋势和季节性因素。
3、MA部分用于处理时间序列的移动平均部分,它考虑了过去的预测误差对当前值的影响。
结合这三部分,ARIMA模型既可以捕捉到数据的趋势变化,又可以处理那些有临时、突发的变化或者噪声较大的数据。所以,ARIMA模型在很多时间序列预测问题中都有很好的表现。
这个公式基本上是将AR模型和MA模型的公式组合在一起:
1、AR部分表示当前值?与它过去的值有关,这个部分的形式与AR模型的公式一致。
2、MA部分表示当前值与它过去的误差项有关,这个部分的形式与MA模型的公式一致。
值得注意的是,MA模型中代表长期趋势的均值并不存在于ARIMA模型的公式当中,因为ARIMA模型中“预测长期趋势”这部分功能由AR模型来执行,因此AR模型替代了原本的。在ARIMA模型中,c可以为0。
另外,这个公式的基础是假设我们正在处理的时间序列是平稳的,这样我们可以直接应用AR和MA模型。如果时间序列是非平稳的,那么我们就需要考虑ARIMA模型中的I部分,也就是进行差分处理。
上述模型被称之为ARIMA(p,d,q)模型,其中p和q的含义与原始MA、AR模型中完全一致,且p和q可以被设置为不同的数值,而d是ARIMA模型需要的差分的阶数。
差分是一种数学操作,用于计算一组数值序列中相邻数据点的差值。在时间序列分析中,差分常用于将非平稳序列转化为平稳序列,也就是减小或消除时间序列的趋势和季节性变化。
当我们对一个序列进行差分运算,就意味着我们会计算该序列中的不同观测值之间的差异
简单地说,如果我们有一个时间序列,那么该序列的一阶差分就可以定义为:
?
这样,我们得到一个新的时间序列,其每一个值都是原时间序列中相邻两个值的差。
让我们以一个简单的例子来具体理解理解差分操作:
假设我们有以下一组时间序列数据:
我们可以看到,这个序列的长度是6。现在,我们希望对这个序列进行一阶差分。
第一步,我们计算第二个数据点和第一个数据点的差,也就是8-4=4。
第二步,我们计算第三个数据点和第二个数据点的差,也就是6-8=-2。
依次类推,我们计算出所有相邻数据点之间的差值,得到一个新的序列:
我们可以看到,差分后的序列比原序列短了一位,因为差分操作实际上计算的是原序列中的相邻数据点之间的差值。同时,差分后的序列相比于原序列,其趋势和季节性变化都得到了一定程度的消除。通常进行一次差分运算,原始的序列会变短1个单位。
在实际进行差分运算时,我们可以改变差分运算的两个相关因子来执行不同的差分:一个是差分的阶数(order),另一个是差分的滞后(lag)。
在上一节,我们介绍了一阶差分。然而,实际上,差分的阶数可以是任何正整数。差分的阶数就是我们需要进行多少次差分操作才能得到一个平稳序列。
具体地说,二阶差分就是对一阶差分后的序列再次进行差分。如果我们有一个时间序列${Y_t}$,那么该序列的二阶差分就可以定义为:
?这样,我们得到一个新的时间序列,其每一个值都是原时间序列中相邻两个值的差的差。
在时间序列分析中,"滞后"是一个非常重要的概念。滞后实际上是描述了时间序列数据点之间的时间差。举个例子,对于一个月度数据的时间序列,?就代表了就代表了?的一个月的滞后。
差分的滞后(lag)与差分的阶数完全不同。正常的一阶差分是滞后为1的差分(lag-1 Differences),这代表在差分运算中,我们让相邻的两个观测值相减,即让间隔为(lag-1)的两个观测值相减。因此,当滞后为2时,则代表我们需要让相隔1个值的两个观测值相减。
在ARIMA模型中,我们经常需要计算滞后d期的时间序列数据。这就意味着我们需要查找在t时刻前d个时间单位的数据。
4、滞后差分(多步差分)
滞后差分(Lag Differences)是在进行差分操作时,不是用相邻的观测值进行相减,而是用相隔一定数量(即滞后数量)的观测值进行相减。这种操作通常在时间序列具有周期性的情况下非常有用,例如,当我们处理的数据随季节有规律地波动或者随一周的时间有规律地波动时。
5、使用差分消除数据波动
在时间序列中,标签往往具备一定的周期性:例如,标签可能随季节有规律地波动(比如在夏季标签值高、在冬季标签值较低等),也可能随一周的时间有规律地波动(比如在周末较高、在工作日较低等)。这种波动可以通过滞后差分来消除,我们生成一个人造的不平稳时间序列,并通过差分使其平稳。我们将利用Numpy和Pandas库生成这个序列,然后用同样的步骤进行检验和可视化。代码如下:
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
# 创建一个函数来检查数据的平稳性
def test_stationarity(timeseries):
# 执行Dickey-Fuller测试
print('Results of Dickey-Fuller Test:')
dftest = adfuller(timeseries, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic', 'p-value', '#Lags Used', 'Number of Observations Used'])
for key, value in dftest[4].items():
dfoutput['Critical Value (%s)' % key] = value
print(dfoutput)
# 生成不平稳的时间序列
np.random.seed(0)
n = 100
x = np.cumsum(np.random.randn(n))
# 把它转换成Pandas的DataFrame格式
df = pd.DataFrame(x, columns=['value'])
# 检查原始数据的平稳性
test_stationarity(df['value'])
# 进行一阶差分
df['first_difference'] = df['value'] - df['value'].shift(1)
# 检查一阶差分后的数据的平稳性
test_stationarity(df['first_difference'].dropna())
# 进行二阶差分
df['second_difference'] = df['first_difference'] - df['first_difference'].shift(1)
# 检查二阶差分后的数据的平稳性
test_stationarity(df['second_difference'].dropna())
# 可视化原始数据和差分后的数据
plt.figure(figsize=(12, 6))
plt.plot(df['value'], label='Original')
plt.plot(df['first_difference'], label='1st Order Difference')
plt.plot(df['second_difference'], label='2nd Order Difference')
plt.legend(loc='best')
plt.title('Original and Differenced Time Series')
plt.show()
运行结果如下:
这段代码首先创建了一个不平稳的时间序列。然后,它对原始数据、一阶差分数据和二阶差分数据进行了平稳性检验。最后,它画出了原始数据以及一阶和二阶差分数据的图形。
在你运行这段代码之后,你应该会看到,原始数据不平稳,一阶差分后的数据仍然不完全平稳,而二阶差分后的数据就已经变得平稳了。
当我们谈论时间序列分析中的"差分"、"滞后差分"和"多步差分"时,我们通常是在谈论同一种基本概念,即比较一个时间序列在不同时间点的值。然而,这些术语的具体含义可能会根据上下文有所不同。让我为你详细解释一下:
1、差分(Differencing):这是一种预处理技术,用于使非平稳时间序列变得平稳。在时间序列中进行一阶差分,就是将每个观察值与其前一步的观察值进行比较,然后取这两个观察值之间的差异。例如,如果我们有一个时间序列 ,那么一阶差分序列将是。
2、滞后差分(Lagged Differencing):这个术语和"差分"非常相似。当我们说"滞后"时,我们是在说比较一个观察值和其"前一步"或"几步前"的观察值。因此,"滞后一阶差分"实际上就是常规的一阶差分,因为我们比较的是每个观察值与其前一步的观察值。如果我们进行的是"滞后k阶差分",那么我们比较的是每个观察值与其k步前的观察值。
3、n阶差分(n-th Order Differencing):n阶差分是差分的一种更一般的形式。一阶差分是比较每个观察值与其前一步的观察值,二阶差分是对一阶差分序列进行再一次的差分(也就是比较一阶差分序列中的每个值与其前一步的值)。更一般地,n阶差分就是连续进行n次一阶差分。
4、多步差分(Multi-step Differencing):这个术语可能根据上下文有不同的含义。它可能指的是n阶差分(即进行多次连续的一阶差分)。也可能指的是滞后差分,比如比较每个观察值与其几步前的观察值。
ARIMA模型的核心思想是利用数据的历史信息来预测未来趋势。对时间序列预测的全面探索让我了解了像CoST这样创新性框架,还为我提供了对传统模型如ARIMA基本原理的深入理解。这些经验的综合使我更全面地理解了时间序列预测,强调了在这一不断发展领域中创新与传统方法的重要性。
?
?
?
?
?
?
?
?
?