「今日爆料」如何使用Transformer构建时间序列预测模型
我最近读了一篇非常有趣的论文,名为“时间序列预测的深度变压器模型”:“流感患病率案例”。我认为这可能是一个从头开始实施的有趣项目,可以帮助我了解有关时间序列预测的更多信息。
预测任务
时间序列预测的目标是根据过去的值来预测时间序列的未来值。时间序列预测任务的一些示例是
流感疫情病例预测时间序列预测的深度变换模型流感疫情病例
能源生产预测使用累积非参数贝叶斯方法进行能源消耗预测
天气预报MetNet:用于降水预测的神经气象模型
例如,您可以将一个城市的能源消耗指标存储几个月,然后训练一个可以预测该城市未来能源消耗的模型。这可以用来估计能源需求,因此能源公司可以使用该模型来估计在给定时间应生产的能源值。
模型
我们将使用的模型是编码器-解码器转换器,其中编码器部分将时间序列的历史作为输入,解码器部分以自回归方式预测未来值。
解码器使用注意力机制连接到编码器。通过这种方式,解码器可以学会在进行预测之前“关注”时间序列过去值中最有用的部分。
解码器使用MaskedSelf-Attention来防止网络在训练过程中获取未来值,造成信息泄漏。
编码器
解码器
所有型号
该架构可以通过使用PyTorch构建。
编码器层=nnTransformerEncoderLayerd_model=通道,nhead=8,dropout=selfdropout,dim_feedforward=4通道,decoder_layer=nnTransformerDecoderLayerd_model=通道,nhead=8,dropout=selfdropout,dim_feedforward=4通道,selfencoder=torchnnTransformerEncoderencoder_layer,num_layers=8selfdecoder=torchnnTransformerDecoderdecoder_layer,num_layers=8数据
每当我实现一个新方法时,我喜欢首先在合成数据上尝试它,以使其更容易理解和调试。这降低了数据的复杂性并更加关注实现/算法。
我编写了一个小脚本,可以生成具有各种周期、偏移量和模式的时间序列。
defgenerate_time_seriesdataframe:clip_val=Randomuniform03,1period=RandomchoiceperiodPhase=Randomrandint-1000,1000数据帧[34;]=应用数据帧lambdax:npclipnpcosx[34;]2nppi/period+Phase,-clip_val,clip_valx[34;]]+x[34;],axis=1,+nprandomnormal0,dataframe[34;]absmax/10,size=dataframeshape[0],返回dataframe
然后立即对所有这些时间序列进行模型训练。
结果
现在我们使用这个模型来预测这些时间序列的未来值。但结果有点复杂。
糟糕的例子预测
适配示例
结果并不像预期的那么好,特别是考虑到对合成数据做出良好的预测通常很容易,但它们仍然令人鼓舞。
该模型的预测有些不一致,稍微高估了一些不正确示例的幅度。在一个很好的例子中,预测与现实非常吻合,消除了噪音。
为了获得更好的结果,您可能需要进一步调试代码并优化超参数。
总结
Transformer是目前机器学习应用中非常流行的模型,因此将它们用于时间序列预测是有意义的。转换器不应该是处理时间序列时的首选,但您可以将其用作测试的试用版本。
arxiv上提到的论文200108317
作者尤尼斯曼萨尔
发表评论