深度学习实战案例:构建基于 Transformer 建立时间序列预测模型(附完整代码)

我最近读了一篇非常有趣的论文,名为Deep Transformer Models for Time Series Forecasting: The Influenza Prevalence Case

我认为从头开始实施类似的东西以了解有关时间序列预测的更多信息可能是一个有趣的项目。

技术提升

技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

完整代码、数据、技术交流提升, 均可加入知识星球交流群获取,群友已超过2000人,添加时切记的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自 CSDN + Transformer时序
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:资料

预测任务

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

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

模型

我们将使用的模型是编码器-解码器 Transformer,其中编码器部分将时间序列的历史作为输入,而解码器部分以自回归方式预测未来值。
解码器使用注意力机制与编码器链接。这样,解码器就可以在做出预测之前学会“关注”时间序列历史值中最有用的部分。
解码器使用掩蔽的自注意力,这样网络就不会通过向前看并使用未来值来预测过去值来在训练过程中作弊。
编码器子网:
image.png
解码器子网:
image.png
完整模型:
image.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)

数据

每次我实施一种新方法时,我都喜欢先在合成数据上进行尝试,这样更容易理解和调试。这降低了数据的复杂性,并更加关注实现/算法。
我写了一个小脚本,可以生成具有不同周期、偏移量和模式的非平凡时间序列。

def generate_time_series(dataframe):

 clip_val = random.uniform(0.3, 1)

 period = random.choice(periods)

 phase = random.randint(-1000, 1000)

 dataframe["views"] = dataframe.apply(
 lambda x: 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],)
 )

 return dataframe

image.png
image.png
image.png
image.png
然后立即在所有这些时间序列上训练模型:
image.png

结果

我们现在使用该模型对这些时间序列的未来值进行预测。结果有些复杂:
坏处:
image.png
好处:
image.png
结果不如我预期的好,特别是考虑到通常可以很容易地对合成数据做出良好的预测,但它们仍然令人鼓舞。
该模型的预测有些不同步,对一些不良示例的振幅略有高估。在好的例子中,预测非常符合真实情况,排除了噪音。
在我期望获得更好的结果之前,我可能需要更多地调试我的代码并努力优化超参数。

结论

Transformer 目前是众多机器学习应用程序中非常流行的模型,因此将它们用于时间序列预测是很自然的。
在处理时间序列时,Transformers 可能不是您的首选方法,因为它们可能很繁重且需要大量数据,但考虑到它们的多功能性和广泛的应用范围,从它们的第一次介绍开始,它们很适合您的机器学习工具包在 NLP 中,涉及音频处理、计算机视觉和时间序列。
如果您有任何问题或建议,请随时发表评论。

猜你喜欢

转载自blog.csdn.net/weixin_38037405/article/details/130464108