时间序列的7种预测模型 预测模型有哪些

我最近读了一篇非常有趣的论文,名为《时间序列预测的深度转换模型:有影响力的预防案例》 。我觉得这可能是一个很有意思的项目,它的实现是从零开始的,可以帮助你学习更多的时间序列预测 。
预测任务在时间序列预测中,目标是用给定的历史值来预测时间序列的未来值 。时间序列预测任务的一些示例如下:
流感疫情预测:时间序列预测的深度变形模型:流感疫情
能源生产预测:能源消费预测采用堆叠式非参数贝叶斯方法 。
天气预报:MetNet:降水预报的神经天气模型
例如,我们可以存储一个城市几个月的能源消耗指标,然后训练一个能够预测该城市未来能源消耗的模型 。这可以用于估计能源需求,因此能源公司可以使用该模型来估计在任何给定时间需要生产的能源的最佳价值 。
模型我们将使用的模型是编码器-解码器转换器,其中编码器部分以时间序列的历史作为输入,解码器部分以自回归的方式预测未来值 。
解码器使用注意机制与编码器连接 。通过这种方式,解码器可以在进行预测之前了解时间序列的历史值中最有用的部分 。
解码器采用掩蔽自关注,这样网络在训练时不会得到未来值,不会导致信息泄露 。
编码器:
【时间序列的7种预测模型 预测模型有哪些】解码器:
所有型号:
可以通过以下方式使用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
然后,模型将一次训练所有这些时间序列:
结果现在我们用这个模型来预测这些时间序列的未来值 。但是结果有些复杂:
不合适的预测例子
装配示例:
结果不如我预期的好,特别是考虑到通常很容易对合成数据做出好的预测,但它们仍然令人鼓舞 。
模型的预测有些不一致,有些坏例的幅度稍微高估了 。在一个好的例子中,预测与地面事实很好地一致,并且排除了噪声 。
我可能需要对我的代码进行更多的调试,并优化超级参数的工作,然后才能期望获得更好的结果 。
摘要变形金刚是目前机器学习应用中非常流行的模型,所以很自然的会被用于时间序列预测 。但在处理时间序列时,变压器不应是您的首选方法,但可以作为一种尝试进行测试 。
提到的论文arxiv:2001.08317
作者:Youness Mansar

    推荐阅读