时间序列的深度学习实践与探索
1. 时间序列深度学习仓库概述
在时间序列深度学习领域,有众多的代码仓库可供选择。部分仅实现单一算法的仓库被排除在统计之外,不过在后续的可视化展示中,会包含一些这样的仓库,例如Informer模型和Neural Prophet的仓库。下面是一些时间序列深度学习仓库的受欢迎程度情况:
| 仓库名称 | 受欢迎程度 |
|---|---|
| Gluon - TS | 最受欢迎 |
| Pytorch Forecasting | 实现多种算法的仓库中较受欢迎,近期人气渐涨 |
在后续内容中,我们将聚焦于时间序列深度学习的最新且具有竞争力的方法,详细探讨一些重要的算法。
2. 重要算法介绍
2.1 自编码器(Autoencoders)
自编码器(AEs)是一种人工神经网络,旨在高效地压缩和编码数据,并基于重建误差进行训练。基本的线性AE在功能上与主成分分析(PCA)相当,但在实际应用中,AEs通常会进行正则化处理。
AEs由编码器和解码器两部分组成,其架构如下:
graph LR
A[输入数据] --> B[编码器]
B --> C[编码后数据]
C --> D[解码器]
D --> E[重建数据]
编码器和解码器的架构通常取决于应用领域。例如,在图像处理中,它们可能包含类似LeNet的卷积层;在建模时间依赖关系时,可能会包含因果卷积或循环层。AEs常用于减少噪声,在时间序列异常检测中应用广泛。
2.2 InceptionTime
研究人员对11种深度学习模型进行了系统评估,包括LeNet、全连接网络(FCNs)、Time - CNN和ResNet等。在单变量数据集(UCR/UEA)上,ResNet在85个问题中解决了50个,表现优于全卷积神经网络(FCNN),且在统计上与时间序列分类的顶级模型HIVE - COTE相当。在多变量基准测试中,FCNN获胜,但各网络之间未发现显著的统计差异。
Hassan Ismail Fawaz等人提出了InceptionTime模型。该模型名称借鉴了Google等研究人员提出的Inception模型,其架构由前馈层和卷积层组成。InceptionTime采用具有不同超参数(不同长度的滤波器)的Inception类型模型的集成。实验表明,该模型在UCR存档的85个数据集上显著优于ResNet,且与HIVE - COTE在统计上相当,但训练时间大幅减少。
2.3 DeepAR
DeepAR是亚马逊德国研究中心提出的一种概率预测方法,基于自回归循环网络模型进行训练。研究人员通过对多个实际预测数据集的广泛实证评估,证明该方法比现有技术的准确率提高了约15%。
DeepAR专为需求预测而设计,采用RNN架构,并为无界计数数据引入负二项式似然。在预测时,使用蒙特卡罗采样计算预测范围内所有子范围的分位数估计。当时间序列的幅度差异较大时,还会根据时间序列的均值和网络输出对负二项式似然的均值和方差参数进行缩放。
2.4 N - BEATS
N - BEATS是一种基于前后向残差链接和深度全连接ReLU神经元多层网络的单变量时间序列点预测模型。该模型使用残差块等深度学习基本组件,不使用特定于时间序列的组件,却能超越传统统计方法。
该网络在M3、M4和TOURISM竞赛数据集的基准测试中达到了最先进的性能,并且可以在不显著损失准确性的情况下进行解释,解决了深度学习中常见的缺乏透明度的问题。
2.5 循环神经网络(Recurrent neural networks)
循环神经网络(RNNs),尤其是长短期记忆网络(LSTMs),在多变量电力消耗预测中应用广泛。早期的研究探索了LSTM与扩张、残差连接和注意力机制的结合,为M4竞赛的获胜方法奠定了基础。
获胜者Slawek Smyl将标准指数平滑(ES)模型与LSTM网络相结合,ES方程可有效捕捉序列的主要成分,如季节性和基线水平,而LSTM网络则可对非线性趋势进行建模。
然而,RNNs(包括LSTMs)存在难以并行化的问题,训练时间和计算资源消耗较大。此外,LSTMs在处理长度超过约100个时间步的序列时,难以捕捉长距离依赖关系,性能会下降。
2.6 卷积神经网络(ConvNets)
研究人员比较了通用卷积网络和循环网络(如LSTM/GRU)在序列建模任务中的表现。他们发现,简单的卷积架构——时间卷积网络(TCN)在大量任务中优于传统的循环网络(如LSTMs),且具有更长的有效记忆。
TCN中的卷积具有因果性,即输出仅由当前和过去的输入决定,确保未来信息不会泄露到过去。这种设计的缺点是,为了获得较长的有效历史长度,需要极深的网络或非常大的滤波器。
与RNNs相比,卷积的优势在于可并行化、感受野大小灵活以及梯度稳定,避免了循环网络中常见的梯度消失问题。
2.7 变压器架构(Transformer architectures)
变压器架构由Google Brain和多伦多大学的研究人员提出,旨在避免递归,实现并行计算。它引入了多头注意力和位置嵌入两个构建块,能够将序列作为一个整体进行处理,而不是逐个处理元素。
变压器最初用于机器翻译,表现优于Google的神经机器翻译模型。其核心是两个序列的对齐,通过位置嵌入来编码序列中标记的特定位置信息。
变压器由编码器和解码器模块堆叠而成,可创建大型模型以学习大规模数据集。在自然语言处理领域,变压器取得了显著进展,如OpenAI的GPT - 3和DeepMind的AlphaFold 2等模型均采用了变压器架构。
变压器在处理较长序列时能保持性能,但只能捕捉训练时固定输入大小内的依赖关系。为处理更长的序列,如Transformer - XL等架构通过存储已编码句子的隐藏状态来引入递归。
研究人员还提出了基于注意力的时间融合变压器(TFT)架构,该架构使用循环层进行局部处理,使用可解释的自注意力层处理长期依赖关系,并通过一系列门控层抑制不必要的组件。在多个实际数据集上,TFT的性能显著优于基准集,比亚马逊的DeepAR提高了36% - 69%。
2.8 Informer
变压器架构存在二次时间复杂度和内存使用问题,以及编码器 - 解码器架构的局限性,这给长时间序列预测带来了困难。为解决这些问题,研究人员设计了Informer模型。
Informer采用生成式解码器,通过一次前向操作预测长时间序列,降低了编码器 - 解码器的时间复杂度。它用ProbSparse Self - Attention机制取代了位置嵌入,将时间复杂度和内存使用从$O(L^2)$降低到$O(L log L)$,同时在序列对齐方面保持了相当的性能。
自注意力蒸馏将级联层输入减半,有效处理极长的输入序列,将复杂度从$O(J L^2)$降低到$O((2 - ε)L log L)$。Informer在多个长时间序列预测数据集上显著优于现有方法,在单变量和多变量基准测试中均表现出色。
3. Python实践:飞机乘客预测
3.1 数据集准备
我们将使用经典的飞机乘客时间序列数据集进行预测,该数据集可从指定的GitHub仓库下载,也可直接使用URL通过
pd.read_csv()
读取。
import pandas as pd
passengers = pd.read_csv(
"passengers.csv", parse_dates=["date"]
).set_index("date")
3.2 全连接网络(Fully connected network)
3.2.1 安装库
首先,我们需要安装TensorFlow库,可通过以下命令从终端或Anaconda Navigator进行安装:
pip install -U tensorflow
3.2.2 导入库和设置常量
import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras.layers import Dense, Input, Dropout
DROPOUT_RATIO = 0.2
HIDDEN_NEURONS = 10
callback = tf.keras.callbacks.EarlyStopping(
monitor='loss', patience=3
)
3.2.3 定义模型
def create_model(passengers):
input_layer = Input(len(passengers.columns))
hiden_layer = Dropout(DROPOUT_RATIO)(input_layer)
hiden_layer = Dense(HIDDEN_NEURONS, activation='relu')(hiden_layer)
output_layer = Dropout(DROPOUT_RATIO)(hiden_layer)
output_layer = Dense(1)(output_layer)
model = keras.models.Model(
inputs=input_layer, outputs=output_layer
)
model.compile(
loss='mse',
optimizer=keras.optimizers.Adagrad(),
metrics=[keras.metrics.RootMeanSquaredError(), keras.metrics.MeanAbsoluteError()]
)
return model
3.2.4 数据集划分
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
passengers, passengers.passengers.shift(-1), shuffle=False
)
3.2.5 训练模型
model = create_model(X_train)
model.fit(X_train, y_train, epochs=1000, callbacks=[callback])
3.2.6 模型预测与可视化
predicted = model.predict(X_test)
import matplotlib.pyplot as plt
def show_result(y_test, predicted):
plt.figure(figsize=(16, 6))
plt.plot(y_test.index, predicted, 'o-', label="predicted")
plt.plot(y_test.index, y_test, '.-', label="actual")
plt.ylabel("Passengers")
plt.legend()
show_result(y_test, predicted)
该模型学习到了一些月度变化特征,但存在系统性的低估问题,主要是因为它学习了训练集中1949 - 1958年旅客数量较少时的基线。
3.2.7 改进模型
为了改进模型,我们将年份和月份作为预测变量加入模型。
passengers["month"] = passengers.index.month.values
passengers["year"] = passengers.index.year.values
model = create_model(passengers)
X_train, X_test, y_train, y_test = train_test_split(
passengers, passengers.passengers.shift(-1), shuffle=False
)
model.fit(X_train, y_train, epochs=100, callbacks=[callback])
predicted = model.predict(X_test)
show_result(y_test, predicted)
加入年份特征后,模型学习到了基线,但对月度变化的近似仍不够准确。
3.2.8 进一步改进模型
我们将对模型进行更复杂的改进:
- 添加月份特征的嵌入层
- 将年份作为线性预测器
- 加入前一个月的乘客数量进行预测
- 根据训练数据集的标准差对预测结果进行缩放
from tensorflow.keras.layers.experimental.preprocessing
from tensorflow.keras.layers import Embedding, Flatten, Concatenate
from tensorflow.keras.metrics import (
RootMeanSquaredError, MeanAbsoluteError
)
def create_model(train):
scale = tf.constant(train.passengers.std())
cont_layer = Input(shape=1)
cat_layer = Input(shape=1)
embedded = Embedding(12, 5)(cat_layer)
emb_flat = Flatten()(embedded)
year_input = Input(shape=1)
year_layer = Dense(1)(year_input)
hidden_output = Concatenate(-1)([emb_flat, year_layer, cont_layer])
output_layer = keras.layers.Dense(1)(hidden_output)
output = output_layer * scale + cont_layer
model = keras.models.Model(inputs=[
cont_layer, cat_layer, year_input
], outputs=output)
model.compile(loss='mse', optimizer=keras.optimizers.Adam(),
metrics=[RootMeanSquaredError(), MeanAbsoluteError()])
return model
model = create_model(X_train)
model.fit(
(X_train["passengers"], X_train["year"], X_train["month"]),
y_train, epochs=1000,
callbacks=[callback]
)
predicted = model.predict((X_test["passengers"], X_test["year"], X_test["month"]))
通过这些改进,模型有望更好地捕捉时间序列的特征,提高预测准确性。
4. 模型改进效果分析
4.1 不同模型预测效果对比
我们对上述不同版本的全连接网络模型进行总结对比,以更清晰地了解模型改进的效果:
| 模型版本 | 特征使用 | 预测效果 | 问题分析 |
| — | — | — | — |
| 初始FCN | 仅使用前一个月旅客数量 | 学习到部分月度变化,但系统性低估 | 仅基于少量信息,学习了早期低旅客量基线 |
| 加入年份和月份 | 年份、月份、前一个月旅客数量 | 学习到基线,但月度变化近似不足 | 简单添加特征,未充分挖掘特征关系 |
| 复杂改进版 | 月份嵌入、线性年份预测、前月旅客数量、预测结果缩放 | 有望更好捕捉特征,提高准确性 | 综合考虑特征关系和数据缩放 |
4.2 模型改进关键因素
从上述对比可以看出,模型改进的关键因素主要包括:
-
特征选择与处理
:合理选择特征并进行有效处理,如月份的嵌入层处理,能更好地捕捉特征之间的关系。
-
特征组合
:将不同类型的特征进行组合,如年份的线性预测和前月旅客数量的结合,有助于模型学习到更复杂的模式。
-
数据缩放
:根据训练数据集的标准差对预测结果进行缩放,可使模型更好地适应数据的变化范围。
5. 不同算法适用场景总结
为了帮助读者更好地选择合适的算法,我们对上述介绍的各种时间序列深度学习算法的适用场景进行总结:
| 算法名称 | 适用场景 | 优势 | 劣势 |
| — | — | — | — |
| 自编码器(AEs) | 时间序列异常检测、降噪 | 可有效减少噪声,适用于异常检测 | |
| InceptionTime | 时间序列分类 | 在多个数据集上表现优异,训练时间相对较短 | |
| DeepAR | 需求预测 | 概率预测,考虑数据幅度差异 | |
| N - BEATS | 单变量时间序列点预测 | 不依赖特定时间序列组件,可解释性强 | |
| 循环神经网络(RNNs,如LSTMs) | 多变量电力消耗预测等长序列问题 | 能处理序列中的依赖关系 | 难以并行化,处理长序列性能下降 |
| 卷积神经网络(ConvNets,如TCN) | 序列建模任务 | 可并行化,梯度稳定,有效记忆长 | 需要极深网络或大滤波器获取长历史长度 |
| 变压器架构(Transformer architectures) | 机器翻译、长序列处理 | 并行计算,处理长序列性能好 | 只能捕捉固定输入大小内的依赖关系 |
| Informer | 长时间序列预测 | 降低时间复杂度和内存使用,处理长序列表现优异 | |
6. 时间序列深度学习流程总结
为了让读者对时间序列深度学习有更清晰的整体认识,我们用mermaid格式流程图展示其一般流程:
graph LR
A[数据准备] --> B[选择算法]
B --> C[模型构建]
C --> D[模型训练]
D --> E[模型评估]
E --> F{评估结果是否满意}
F -- 是 --> G[模型应用]
F -- 否 --> H[模型改进]
H --> C
具体流程说明如下:
1.
数据准备
:收集、清洗和预处理时间序列数据,如上述飞机乘客数据集的读取和索引设置。
2.
选择算法
:根据问题的特点和数据的性质,选择合适的深度学习算法,如预测问题可选择DeepAR,分类问题可选择InceptionTime。
3.
模型构建
:根据所选算法构建模型,定义模型的结构和参数,如全连接网络的层数、神经元数量等。
4.
模型训练
:使用训练数据集对模型进行训练,调整模型的参数以最小化损失函数。
5.
模型评估
:使用测试数据集对训练好的模型进行评估,计算评估指标,如均方误差(MSE)、均方根误差(RMSE)等。
6.
评估结果判断
:根据评估指标判断模型的性能是否满意。
7.
模型应用
:如果评估结果满意,将模型应用于实际问题中进行预测或分类。
8.
模型改进
:如果评估结果不满意,对模型进行改进,如调整模型结构、选择不同的特征、优化超参数等,然后重新进行模型构建和训练。
7. 总结与展望
7.1 总结
本文介绍了多种时间序列深度学习算法,包括自编码器、InceptionTime、DeepAR、N - BEATS、循环神经网络、卷积神经网络和变压器架构等,并通过飞机乘客预测的实例展示了全连接网络模型的构建、训练和改进过程。同时,对不同算法的适用场景进行了总结,给出了时间序列深度学习的一般流程。
7.2 展望
时间序列深度学习是一个不断发展的领域,未来有以下几个值得关注的方向:
-
算法融合
:将不同的算法进行融合,发挥各自的优势,以提高模型的性能。
-
可解释性增强
:进一步提高深度学习模型的可解释性,使模型的决策过程更加透明。
-
处理更复杂的数据
:开发能够处理更复杂时间序列数据的算法,如具有不规则间隔、缺失值或多模态数据的时间序列。
-
实时预测
:实现实时的时间序列预测,以满足实际应用中的及时性需求。
希望本文能为读者在时间序列深度学习领域的研究和实践提供有价值的参考。通过不断学习和实践,读者可以更好地掌握这些算法和技术,解决实际中的时间序列问题。
超级会员免费看
7349

被折叠的 条评论
为什么被折叠?



