如何利用Transformer建立时间序列预测模型

简介: 如何利用Transformer建立时间序列预测模型

我最近读了一篇非常有趣的论文,叫做 Deep Transformer Models for Time Series Forecasting: The Influenza Prevalence Case。我认为这可能是一个有趣的项目,他的实现是从头开始的,并且可以帮助你了解更多关于时间序列预测。

预测的任务

在时间序列预测中,目标是预测给定历史值的时间序列的未来值。时间序列预测任务的一些例子是:

预测流感流行病例:时间序列预测的深度变形模型:流感流行病例

能源生产预测:能源消耗预测使用堆叠非参数贝叶斯方法

天气预报:MetNet:一个用于降水预报的神经天气模型

例如,我们可以将一个城市的能源消耗指标存储几个月,然后训练一个模型,该模型将能够预测该城市未来的能源消耗。这可以用来估计能源需求,因此能源公司可以使用这个模型来估计任何给定时间需要生产的能源的最佳值。

640.png

模型

我们将使用的模型是一个编码器-解码器的Transformer,其中编码器部分将时间序列的历史作为输入,而解码器部分以自回归的方式预测未来的值。

解码器使用注意力机制与编码器连接。通过这种方式,解码器可以学习在做出预测之前“关注”时间序列历史值中最有用的部分。

解码器使用了掩蔽的自注意力,这样网络就不会在训练期间获取未来的值,不会导致信息的泄露。

编码器:

640.png

解码器:

640.png

全部模型:

640.png

这个架构可以通过以下方式使用PyTorch构建:

encoder_layer=nn.TransformerEncoderLayer(
d_model=channels,
nhead=8,
dropout=self.dropout,
dim_feedforward=4*channels,
)
decoder_layer=nn.TransformerDecoderLayer(
d_model=channels,
nhead=8,
dropout=self.dropout,
dim_feedforward=4*channels,
)
self.encoder=torch.nn.TransformerEncoder(encoder_layer, num_layers=8)
self.decoder=torch.nn.TransformerDecoder(decoder_layer, num_layers=8)

数据

每当我实现一种新方法时,我喜欢首先在合成数据上尝试它,以便更容易理解和调试。这降低了数据的复杂性,并将重点更多地放在实现/算法上。

我编写了一个小脚本,可以生成具有不同周期、偏移量和模式的时间序列。

defgenerate_time_series(dataframe):
clip_val=random.uniform(0.3, 1)
period=random.choice(periods)
phase=random.randint(-1000, 1000)
dataframe["views"] =dataframe.apply(
lambdax: np.clip(
np.cos(x["index"] *2*np.pi/period+phase), -clip_val, clip_val      )
*x["amplitude"]
+x["offset"],
axis=1,
  ) +np.random.normal(
0, dataframe["amplitude"].abs().max() /10, size=(dataframe.shape[0],)
  )
returndataframe

640.png

640.png

640.png

640.png

然后,该模型将一次性对所有这些时间序列进行训练:

640.png

结果

我们现在使用这个模型来预测这些时间序列的未来值。但是结果有些复杂:

预测未拟合的样例

640.png

640.png

拟合样例:

640.png

640.png

640.png

640.png

结果并不像我预期的那么好,特别是考虑到对合成数据做出好的预测通常很容易,但它们仍然令人鼓舞。

模型的预测有些不一致,对一些坏例子的振幅有轻微的过高估计。在好的例子中,预测与地面事实非常吻合,排除了噪声。

我可能需要调试我的代码多一点,并在我可以预期获得更好的结果之前优化超参数的工作。

总结

Transformers是目前在机器学习应用中非常流行的模型,所以它们将被用于时间序列预测是很自然的。但是Transformers应该不是你在处理时间序列时的第一个首选方法,但是可以做为尝试来进行测试。

本文代码:https://github.com/CVxTz/time_series_forecasting

目录
相关文章
|
机器学习/深度学习 算法
【基础回顾】在回归任务中常见的损失函数比较(mse、mae、huber)
【基础回顾】在回归任务中常见的损失函数比较(mse、mae、huber)
2377 0
【基础回顾】在回归任务中常见的损失函数比较(mse、mae、huber)
LSTM+Transformer混合模型时间序列预测实战教学
LSTM+Transformer混合模型时间序列预测实战教学
2127 0
|
4月前
|
人工智能 数据挖掘 API
科研效率提升10倍!OpenClaw(Clawdbot)零技术部署+阿里云百炼API配置+集成科研Skill全家桶,论文/课题成稿全自动!
对科研人而言,80%的时间都消耗在文献检索、综述整理、数据清洗等重复劳动上,真正用于创新思考的时间不足20%。OpenClaw(原Clawdbot)的出现彻底改变了这一现状——它并非传统的聊天AI,而是能主动“动手干活”的科研自动化平台,搭配ClawHub上5700+科研专属Skill,可实现文献检索、综述撰写、课题申报、数据分析、论文成稿的全流程自动化,让科研人从“搬砖工”升级为“监工”,效率提升5-20倍。
3393 3
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1415 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
机器学习/深度学习 自然语言处理 PyTorch
使用Transformer 模型进行时间序列预测的Pytorch代码示例
时间序列预测是一个经久不衰的主题,受自然语言处理领域的成功启发,transformer模型也在时间序列预测有了很大的发展。本文可以作为学习使用Transformer 模型的时间序列预测的一个起点。
1603 2
|
机器学习/深度学习 自然语言处理 搜索推荐
自注意力机制全解析:从原理到计算细节,一文尽览!
自注意力机制(Self-Attention)最早可追溯至20世纪70年代的神经网络研究,但直到2017年Google Brain团队提出Transformer架构后才广泛应用于深度学习。它通过计算序列内部元素间的相关性,捕捉复杂依赖关系,并支持并行化训练,显著提升了处理长文本和序列数据的能力。相比传统的RNN、LSTM和GRU,自注意力机制在自然语言处理(NLP)、计算机视觉、语音识别及推荐系统等领域展现出卓越性能。其核心步骤包括生成查询(Q)、键(K)和值(V)向量,计算缩放点积注意力得分,应用Softmax归一化,以及加权求和生成输出。自注意力机制提高了模型的表达能力,带来了更精准的服务。
14044 46
|
机器学习/深度学习 编解码 测试技术
TimeMOE: 使用稀疏模型实现更大更好的时间序列预测
TimeMOE是一种新型的时间序列预测基础模型,通过稀疏混合专家(MOE)设计,在提高模型能力的同时降低了计算成本。它可以在多种时间尺度上进行预测,并且经过大规模预训练,具备出色的泛化能力。TimeMOE不仅在准确性上超越了现有模型,还在计算效率和灵活性方面表现出色,适用于各种预测任务。该模型已扩展至数十亿参数,展现了时间序列领域的缩放定律。研究结果显示,TimeMOE在多个基准测试中显著优于其他模型,特别是在零样本学习场景下。
2302 64

热门文章

最新文章