如何利用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

目录
相关文章
LSTM+Transformer混合模型时间序列预测实战教学
LSTM+Transformer混合模型时间序列预测实战教学
2250 0
|
Python
Python跳动的爱心完整代码
Python跳动的爱心完整代码
2880 0
|
Ubuntu Linux
Linux Ubuntu 20.04 LTS 解决无法输入中文 输入法问题
Linux Ubuntu 20.04 LTS 解决无法输入中文 输入法问题
6353 0
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
8月前
|
人工智能 数据挖掘 API
科研效率提升10倍!OpenClaw(Clawdbot)零技术部署+阿里云百炼API配置+集成科研Skill全家桶,论文/课题成稿全自动!
对科研人而言,80%的时间都消耗在文献检索、综述整理、数据清洗等重复劳动上,真正用于创新思考的时间不足20%。OpenClaw(原Clawdbot)的出现彻底改变了这一现状——它并非传统的聊天AI,而是能主动“动手干活”的科研自动化平台,搭配ClawHub上5700+科研专属Skill,可实现文献检索、综述撰写、课题申报、数据分析、论文成稿的全流程自动化,让科研人从“搬砖工”升级为“监工”,效率提升5-20倍。
3706 3
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1566 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
机器学习/深度学习 算法 搜索推荐
从零开始构建图注意力网络:GAT算法原理与数值实现详解
本文详细解析了图注意力网络(GAT)的算法原理和实现过程。GAT通过引入注意力机制解决了图卷积网络(GCN)中所有邻居节点贡献相等的局限性,让模型能够自动学习不同邻居的重要性权重。
1882 0
从零开始构建图注意力网络:GAT算法原理与数值实现详解
|
人工智能 自然语言处理 算法
DeepSeek:国产AI新势力,普通人如何用它赚钱?
DeepSeek 是一款由中国团队开发的大型语言模型,以其强大的自然语言处理能力迅速崛起,成为ChatGPT等国外大模型的强劲对手。它支持智能写作、代码生成、内容创作等多种功能,广泛应用于自媒体、编程、商业分析等领域。DeepSeek不仅免费且部分开源,用户可以直接访问官网体验,无需科学上网。其长文本处理能力和编程辅助功能尤为突出,适合长文写作和代码优化。DeepSeek还提供了多种变现途径,如自媒体写作、AI编程服务、课程咨询等,帮助用户在AI时代创造额外收入。掌握DeepSeek,开启AI变现之旅! 注:关注微信公众号“飞川”,发送“deepseek”获取丰富的资料包。
1726 73
|
机器学习/深度学习 自然语言处理 PyTorch
使用Transformer 模型进行时间序列预测的Pytorch代码示例
时间序列预测是一个经久不衰的主题,受自然语言处理领域的成功启发,transformer模型也在时间序列预测有了很大的发展。本文可以作为学习使用Transformer 模型的时间序列预测的一个起点。
1689 2

热门文章

最新文章