时间序列预测实战(十九)魔改Informer模型进行滚动长期预测(科研版本,结果可视化)

基础篇-认识时间序列常用数据集 最近在筹备写知识星球的文章,主要想把自己看完论文之后偶然产生的想法idea,以及实验验证过程记录下来。其实平时有挺多想法,但大多没有形成文字,或是跑跑代码就丢掉了,回过头想查资料就很麻烦,特别是知道自己曾经有过灵感,但就想不起来就很急。目前已经完成了一部分,本篇先分享出来,请大家给点意见。 阅读详情
AI摘要

本文围绕Informer模型展开,先指出Transformer和LSTM在长序列时间序列预测中的问题,接着介绍Informer模型的特点与机制原理,分析其性能。还讲解了数据集、项目结构和参数,进行模型训练与结果预测,并说明如何用自己的数据集训练,最后推荐相关时间序列专栏。

 

论文地址-> Informer论文地址PDF点击即可阅读

代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接

个人魔改版本地址-> 魔改版下载地址

一、本文介绍

在之前的文章中我们已经讲过Informer模型了,但是呢官方的预测功能开发的很简陋只能设定固定长度去预测未来固定范围的值,当我们想要发表论文的时候往往这个预测功能是并不能满足的,所以我在官方代码的基础上增添了一个滚动长期预测的功能,这个功能就是指我们可以第一次预测未来24个时间段的值然后我们像模型中填补 24个值再次去预测未来24个时间段的值(填补功能我设置成自动的了无需大家手动填补),这个功能可以说是很实用的,这样我们可以准确的评估固定时间段的值,当我们实际使用时可以设置自动爬取数据从而产生实际效用。本文修改内容完全为本人个人开发,创作不易所以如果能够帮助到大家希望大家给我的文章点点赞,同时可以关注本专栏(免费阅读),本专栏持续复现各种的顶会内容,无论你想发顶会还是其它水平的论文都能够对你有所帮助。

专栏回顾: 时间序列预测专栏——持续复习各种顶会内容——科研必备

Informer讲解回顾:  时间序列预测模型实战案例(八)(Informer)个人数据集、详细参数、代码实战讲解

连续滚动预测结果评估:

同时我将滚动预测结果生成了csv文件方便大家对比和评估,以下是我生成的csv文件可以说是非常的直观。

 我们可以利用其进行画图从而评估结果-> 

目录

一、本文介绍

二、Informer论文笔记

2.1、论文首先提出了Transformer模型的问题

2.2、LSTM技术的缺陷

2.3、Informer模型的提出 

2.4、图解Informer的机制原理

2.5、结果分析

三、数据集介绍

四、项目结构和详细参数讲解 

4.1、项目结构

4.2、模型参数讲解以及Bug修复

4.2.1、参数讲解

4.2.2、Bug修复 

五、模型训练

六、结果预测

七、如何训练你自己的数据集

八、全文总结 


二、Informer论文笔记

2.1、论文首先提出了Transformer模型的问题

时间序列预测在许多领域都是关键要素,在这些场景中,我们可以利用大量的时间序列历史数据来进行长期预测,即长序列时间序列预测(LSTF)。然而,现有方法大多设计用于短期问题,如预测48点或更少的数据。随着序列长度的增加,模型的预测能力受到挑战。例如,当预测长度超过48点时,LSTM网络的预测效果开始变得不满意,推理速度急剧下降。LSTF的主要挑战是提升预测能力,以满足日益增长的长序列需求,这需要(a)超常的长距离对齐能力和(b)在长序列输入输出上的高效操作。最近,Transformer模型在捕捉长距离依赖性方面表现优于RNN模型。然而,自注意力机制由于其二次方的计算和内存消耗,违反了(b)的要求。一些大型Transformer模型在NLP任务上取得了令人印象深刻的结果,但训练和部署成本高昂。因此,本文试图回答这个问题:我们是否可以改进Transformer模型,使其在计算、内存和架构上更高效,同时保持更高的预测能力?

2.2、LSTM技术的缺陷

上图展示了一个真实数据集上的预测结果,其中LSTM网络从短期(12个点,0.5天)预测电力变压器站的小时温度到长期(480个点,20天)。当预测长度大于48个点时(图1b中的实心星号),整体性能差距显著,均方误差升高,推理速度急剧下降,LSTM模型开始失效。

总结:这里说明了传统的时间序列预测对于长期预测效果不是很好大家如果想看LSTM的预测效果可以看我的往期博客里面有各种类型的LSTM讲解

2.3、Informer模型的提出 

Informer是一种用于长序列时间序列预测的Transformer模型,但是它与传统的Transformer模型又有些不同点,与传统的Transformer模型相比,Informer具有以下几个独特的特点:

1. ProbSparse自注意力机制:Informer引入了ProbSparse自注意力机制,该机制在时间复杂度和内存使用方面达到了O(Llog L)的水平,能够有效地捕捉序列之间的长期依赖关系。

2. 自注意力蒸馏:通过减少级联层的输入,自注意力蒸馏技术可以有效处理极长的输入序列,提高了模型处理长序列的能力。

3. 生成式解码器:Informer采用生成式解码器,可以一次性预测整个长时间序列,而不是逐步进行预测。这种方式大大提高了长序列预测的推理速度。

2.4、图解Informer的机制原理

上图为Informer模型概述:左侧:编码器接收大规模的长序列输入(绿色序列)。我们使用提出的ProbSparse自注意力替代传统的自注意力。蓝色梯形表示自注意力蒸馏操作,用于提取主导的注意力,大幅减小网络大小。层堆叠的副本增加了模型的稳健性。右侧:解码器接收长序列输入,将目标元素填充为零,测量特征图的加权注意力组合,并以生成式风格即时预测输出元素(橙色序列)

上图是Informer模型编码器结构的视觉表示,下面是对其内容的解释:

  1. 编码器堆栈:图像中的水平堆栈代表Informer编码器结构中的一个编码器副本。每个堆栈都是一个独立单元,处理部分或全部输入序列。

  2. 主堆栈:图中显示的主堆栈处理整个输入序列。主堆栈之后,第二个堆栈处理输入序列的一半,以此类推,每个后续的堆栈都处理上一个堆栈输入的一半。

  3. 点积矩阵:堆栈内的红色层是点积矩阵,它们是自注意力机制的一部分。通过在每一层应用自注意力蒸馏,这些矩阵的大小逐层递减,可能降低了计算复杂度,并集中于序列中最相关的信息。

  4. 输出的拼接:通过自注意力机制处理后,所有堆栈的特征图被拼接起来,形成编码器的最终输出。然后,模型的后续部分(如解码器)通常使用这个输出,基于输入序列中学习到的特征和关系生成预测。

这张图片可能用于说明Informer模型如何通过注意力蒸馏和跨多个处理堆栈的输入序列的智能处理,有效地处理长序列并减少计算负载。

2.5、结果分析

上面图片包含三个图表,分别标记为(a)、(b)和(c),每个图表都展示了Informer模型性能的不同方面与均方误差(MSE)得分之间的关系:

(a) 输入长度:此图表比较了编码器不同输入长度和解码器token长度的MSE得分。它显示了两个预测范围,48和168,指示模型性能随输入序列长度增加的变化。

(b) 采样因子:此图表展示了不同采样因子(c=3、c=5、c=8、c=10)对Informer MSE得分的影响。采样因子在Informer模型的上下文中可能与ProbSparse自注意力机制有关,影响注意力机制如何采样输入序列。

(c) 堆叠组合:这个图表说明了当应用不同的依赖度量尺度(L尺度、L/2尺度、L/4尺度)与Informer自身的依赖方法相比,不同编码器输入长度的MSE得分。这些不同的尺度可能指的是Informer模型处理输入序列的方式,可能表示模型内部的一种层次化处理或注意力机制。

这些图表有助于理解不同参数和配置如何影响Informer模型的性能,特别是在预测准确性方面,以MSE测量。每个图表都提供了洞察如何优化模型以在各种时间序列数据长度上获得更好的准确性。

总结:Informer模型,成功提高了在LSTF问题中的预测能力,验证了类似Transformer的模型在捕捉长序列时间序列输出和输入之间的个体长期依赖关系方面的潜在价值。

  • 提出了ProbSparse自注意力机制,以高效地替代传统的自注意力机制,
  • 提出了自注意力蒸馏操作,可优化J个堆叠层中主导的注意力得分,并将总空间复杂度大幅降低。
  • 提出了生成式风格的解码器,只需要一步前向传播即可获得长序列输出,同时避免在推理阶段累积误差的传播。

三、数据集介绍

我们本文用到的数据集是官方的ETTh1.csv ,该数据集是一个用于时间序列预测的电力负荷数据集,它是 ETTh 数据集系列中的一个。ETTh 数据集系列通常用于测试和评估时间序列预测模型。以下是 ETTh1.csv 数据集的一些内容:

数据内容:该数据集通常包含有关电力系统的多种变量,如电力负荷、价格、天气情况等。这些变量可以用于预测未来的电力需求或价格。

时间范围和分辨率:数据通常按小时或天记录,涵盖了数月或数年的时间跨度。具体的时间范围和分辨率可能会根据数据集的版本而异。 

以下是该数据集的部分截图->

​

四、项目结构和详细参数讲解 

4.1、项目结构

项目结构如下图所示,其中main_informer.py文件为程序入口。

4.2、模型参数讲解以及Bug修复

main_informer.py的参数讲解如下->

4.2.1、参数讲解

参数名称参数类型参数讲解
0modelstr这是一个用于实验的参数设置,其中包含了三个选项: informer, informerstack, informerlight。根据实验需求,可以选择其中之一来进行实验,默认是使用informer模型。
1datastr

数据,这个并不是你理解的你的数据集文件,而是你想要用官方定义的方法还是你自己的数据集进行定义数据加载器,如果是自己的数据集就输入custom

2root_pathstr这个才是你文件的路径,不要到具体的文件,到目录级别即可。
3data_pathstr这个填写你文件的名称。
4is_rolling_predictbool是否进行滚动预测的选项如果设置为False则是普通预测,本文改进
5rolling_data_pathstr如果你要进行滚动预测则需要一个额外的文件,可以从你的数据集末尾中进行裁取。本文改进
6featuresstr这个是特征有三个选项M,MS,S。分别是多元预测多元,多元预测单元,单元预测单元。
7targetstr这个是你数据集中你想要预测那一列数据,假设我预测的是油温OT列就输入OT即可。
8freqstr时间的间隔,你数据集每一条数据之间的时间间隔。
9checkpointsstr训练出来的模型保存路径
10seq_lenint用过去的多少条数据来预测未来的数据
11label_lenint可以裂解为更高的权重占比的部分要小于seq_len
12pred_lenint预测未来多少个时间点的数据
13enc_inint你数据有多少列,要减去时间那一列,这里我是输入8列数据但是有一列是时间所以就填写7
14dec_inint同上
15c_outint这里有一些不同如果你的features填写的是M那么和上面就一样,如果填写的MS那么这里要输入1因为你的输出只有一列数据。
16d_modelint用于设置模型的维度,默认值为512。可以根据需要调整该参数的数值来改变模型的维度
17n_headsint用于设置模型中的注意力头数。默认值为8,表示模型会使用8个注意力头,我建议和的输入数据的总体保持一致,列如我输入的是8列数据不用刨去时间的那一列就输入8即可。
18e_layersint用于设置编码器的层数
19d_layersint用于设置解码器的层数
20s_layersstr用于设置堆叠编码器的层数
21d_ffint模型中全连接网络(FCN)的维度,默认值为2048
22factorint ProbSparse自注意力中的因子,默认值为5
23paddingint填充类型,默认值为0,这个应该大家都理解,如果不够数据就填写0.
24distilbool是否在编码器中使用蒸馏操作。使用--distil参数表示不使用蒸馏操作,默认为True也是我们的论文中比较重要的一个改进。
25dropoutfloat这个应该都理解不说了,丢弃的概率,防止过拟合的。
26attnstr编码器中使用的注意力类型,默认为"prob"我们论文的主要改进点,提出的注意力机制。
27embedstr时间特征的编码方式,默认为"timeF"
28activationstr激活函数
29output_attentionbool是否在编码器中输出注意力,默认为False
30do_predictbool是否进行预测,这里模型中没有给添加算是一个小bug我们需要填写一个default=True在其中。
31mixbool在生成式解码器中是否使用混合注意力,默认为True
32colsstr从数据文件中选择特定的列作为输入特征,应该用不到
33num_workersint线程windows大家最好设置成0否则会报线程错误,linux系统随便设置。
34itrint实验运行的次数,默认为2,我们这里改成数字1.
35train_epochsint训练的次数
36batch_sizeint一次往模型力输入多少条数据
37patienceint早停机制,如果损失多少个epochs没有改变就停止训练。
38learning_ratefloat学习率。
39desstr        实验描述,默认为"test"
40lossstr     损失函数,默认为"mse"
41lradjstr     学习率的调整方式,默认为"type1"
42use_ampbool混合精度训练,
43inversebool我们的数据输入之前会被进行归一化处理,这里默认为False,算是一个小bug因为输出的数据模型没有给我们转化成我们的数据,我们要改成True。
44use_gpubool是否使用GPU训练,根据自身来选择
45gpuintGPU的编号
46use_multi_gpubool是否使用多个GPU训练。
47devicesstrGPU的编号

4.2.2、Bug修复 

其中定义了许多参数,在其中存在一些bug有如下的->

main_informer.py: error: the following arguments are required: --model, --data

这个bug是因为头两行参数的,中的required=True导致的,我们将其删除掉即可。

parser.add_argument('--model', type=str, required=True, default='informer',help='model of experiment, options: [informer, informerstack, informerlight(TBD)]')

parser.add_argument('--data', type=str, required=True, default='ETTh1', help='data')

删除完以后如下-> 

parser.add_argument('--model', type=str, default='informer',help='model of experiment, options: [informer, informerstack, informerlight(TBD)]')

parser.add_argument('--data', type=str, default='ETTh1', help='data')

过程中还有些bug在参数讲解的描述中我都讲述了该如何解决,希望能够帮助到大家。

五、模型训练

到这里参数已经完全讲解完了,bug也解决了我们可以开始进行模型训练了。我修改完训练的main_informer.py内容如下。

import argparse

import torch

from exp.exp_informer import Exp_Informer

parser = argparse.ArgumentParser(description='[Informer] Long Sequences Forecasting')

parser.add_argument('--model', type=str, default='informer',
                    help='model of experiment, options: [informer, informerstack, informerlight(TBD)]')

parser.add_argument('--data', type=str, default='custom', help='data')
parser.add_argument('--root_path', type=str, default='./', help='root path of the data file')
parser.add_argument('--data_path', type=str, default='ETTh1.csv', help='data file')
parser.add_argument('--is_rolling_predict', type=bool, default=False, help='rolling predict')
parser.add_argument('--rolling_data_path', type=str, default='ETTh1-Test.csv', help='data file')
parser.add_argument('--features', type=str, default='MS', help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
parser.add_argument('--target', type=str, default='OT', help='target feature in S or MS task')
parser.add_argument('--freq', type=str, default='h',
                    help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')
parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location of model checkpoints')
parser.add_argument('--seq_len', type=int, default=126, help='input sequence length of Informer encoder')
parser.add_argument('--label_len', type=int, default=64, help='start token length of Informer decoder')
parser.add_argument('--pred_len', type=int, default=4, help='prediction sequence length')
# parser.add_argument('--sum_pred_len', type=int, default=42, help='sum_pred_len // pred_len = 0')

# Informer decoder input: concat[start token series(label_len), zero padding series(pred_len)]

parser.add_argument('--enc_in', type=int, default=7, help='encoder input size')
parser.add_argument('--dec_in', type=int, default=7, help='decoder input size')
parser.add_argument('--c_out', type=int, default=1, help='output size')
parser.add_argument('--d_model', type=int, default=512, help='dimension of model')
parser.add_argument('--n_heads', type=int, default=8, help='num of heads')
parser.add_argument('--e_layers', type=int, default=2, help='num of encoder layers')
parser.add_argument('--d_layers', type=int, default=1, help='num of decoder layers')
parser.add_argument('--s_layers', type=str, default='3,2,1', help='num of stack encoder layers')
parser.add_argument('--d_ff', type=int, default=2048, help='dimension of fcn')
parser.add_argument('--factor', type=int, default=5, help='probsparse attn factor')
parser.add_argument('--padding', type=int, default=0, help='padding type')
parser.add_argument('--distil', action='store_false',
                    help='whether to use distilling in encoder, using this argument means not using distilling',
                    default=True)
parser.add_argument('--dropout', type=float, default=0.05, help='dropout')
parser.add_argument('--attn', type=str, default='prob', help='attention used in encoder, optio---ns:[prob, full]')
parser.add_argument('--embed', type=str, default='timeF',
                    help='time features encoding, options:[timeF, fixed, learned]')
parser.add_argument('--activation', type=str, default='gelu', help='activation')
parser.add_argument('--output_attention', action='store_true', help='whether to output attention in ecoder')
parser.add_argument('--do_predict', action='store_true', default=True, help='whether to predict unseen future data')
parser.add_argument('--mix', action='store_false', help='use mix attention in generative decoder', default=True)
parser.add_argument('--cols', type=str, nargs='+', help='certain cols from the data files as the input features')
parser.add_argument('--num_workers', type=int, default=0, help='data loader num workers')
parser.add_argument('--itr', type=int, default=1, help='experiments times')
parser.add_argument('--train_epochs', type=int, default=20, help='train epochs')
parser.add_argument('--batch_size', type=int, default=32, help='batch size of train input data')
parser.add_argument('--patience', type=int, default=5, help='early stopping patience')
parser.add_argument('--learning_rate', type=float, default=0.0001, help='optimizer learning rate')
parser.add_argument('--des', type=str, default='test', help='exp description')
parser.add_argument('--loss', type=str, default='mse', help='loss function')
parser.add_argument('--lradj', type=str, default='type1', help='adjust learning rate')
parser.add_argument('--use_amp', action='store_true', help='use automatic mixed precision training', default=False)
parser.add_argument('--inverse', action='store_true', help='inverse output data', default=False)

parser.add_argument('--use_gpu', type=bool, default=True, help='use gpu')
parser.add_argument('--gpu', type=int, default=0, help='gpu')
parser.add_argument('--use_multi_gpu', action='store_true', help='use multiple gpus', default=False)
parser.add_argument('--devices', type=str, default='0,1,2,3', help='device ids of multile gpus')

args = parser.parse_args()
args.use_gpu = True if torch.cuda.is_available() and args.use_gpu else False

if args.use_gpu and args.use_multi_gpu:
    args.devices = args.devices.replace(' ', '')
    device_ids = args.devices.split(',')
    args.device_ids = [int(id_) for id_ in device_ids]
    args.gpu = args.device_ids[0]

data_parser = {
    'ETTh1': {'data': 'sum.csv', 'T': 'sl', 'B': [7, 7, 7], 'S': [350, 168, 4], 'MS': [7, 7, 1]},
    'ETTh2': {'data': 'ETTh2.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
    'ETTm1': {'data': 'sum.csv', 'T': 'sl', 'B': [7, 7, 7], 'S': [126, 42, 4], 'MS': [7, 7, 1]},
    'ETTm2': {'data': 'ETTm2.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
    'WTH': {'data': 'WTH.csv', 'T': 'WetBulbCelsius', 'M': [12, 12, 12], 'S': [1, 1, 1], 'MS': [12, 12, 1]},
    'ECL': {'data': 'ECL.csv', 'T': 'MT_320', 'M': [321, 321, 321], 'S': [1, 1, 1], 'MS': [321, 321, 1]},
    'Solar': {'data': 'solar_AL.csv', 'T': 'POWER_136', 'M': [137, 137, 137], 'S': [1, 1, 1], 'MS': [137, 137, 1]},
    'custom': {'data': '{}'.format(args.data_path), 'T': 'OT', 'M': [7, 7, 7], 'MS': [7, 7, 1], 'S': [1, 1, 1]},
}
if args.data in data_parser.keys():
    data_info = data_parser[args.data]
    args.data_path = data_info['data']
    args.target = data_info['T']
    args.enc_in, args.dec_in, args.c_out = data_info[args.features]

args.s_layers = [int(s_l) for s_l in args.s_layers.replace(' ', '').split(',')]
args.detail_freq = args.freq
args.freq = args.freq[-1:]

print('Args in experiment:')
print(args)

Exp = Exp_Informer

for ii in range(args.itr):
    # setting record of experiments
    setting = 'group_id{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_at{}_fc{}_eb{}_dt{}_mx{}_{}_{}'.format(
        args.data_path, args.model, args.data, args.features,
        args.seq_len, args.label_len, args.pred_len,
        args.d_model, args.n_heads, args.e_layers, args.d_layers, args.d_ff, args.attn, args.factor,
        args.embed, args.distil, args.mix, args.des, ii)

    exp = Exp(args)  # set experiments
    print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
    exp.train(setting)

    print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
    exp.test(setting)

    if args.do_predict:
        print('>>>>>>>predicting : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))
        exp.predict(args, setting, True)

    torch.cuda.empty_cache()

我们运行该文件,控制台就会开始输出进行训练。

训练出来的模型会保存在该目录下->其中的pth文件就是保存下来的模型。

六、结果预测

训练完成之后,我们就可以开始预测了,我这里进行了修改,将所有的结果都变成了CSV文件这样方便大家观测结果会保存在下面的文件当中。

我们可以打开该文件部分截图如下-> 

我们可以利用其进行画图从而评估结果-> 

七、如何训练你自己的数据集

上面介绍了用我的数据集训练模型,那么大家在利用模型的时候如何训练自己的数据集呢这里给家介绍一下需要修改的几处地方。

parser.add_argument('--data', type=str, default='custom', help='data')
parser.add_argument('--root_path', type=str, default='./', help='root path of the data file')
parser.add_argument('--data_path', type=str, default='ETTh1.csv', help='data file')
parser.add_argument('--is_rolling_predict', type=bool, default=False, help='rolling predict')
parser.add_argument('--rolling_data_path', type=str, default='ETTh1.csv', help='data file')
parser.add_argument('--features', type=str, default='MS', help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')
parser.add_argument('--target', type=str, default='OT', help='target feature in S or MS task')
parser.add_argument('--freq', type=str, default='h',
                    help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')

首先需要修改的就是上面这几处,

  • 其中data必须填写custom,
  • root_path填写文件夹即可,
  • data_path填写具体的文件在你文件夹下面,
  • is_rolling_predict就是滚动预测的开关设置为True则进行滚动预测否则就是普通预测
  • rolling_data_path如果你要进行滚动预测则需要一个额外的文件,可以从你的数据集末尾中进行裁取。
  • features前面有讲解,具体是看你自己的数据集,我这里MS就是7列结果综合分析输出想要的那一列结果的预测值,
  • target就是你数据集中你想要知道那列的预测值的列名,
  • freq就是你两条数据之间的时间间隔。
parser.add_argument('--seq_len', type=int, default=96, help='input sequence length of Informer encoder')
parser.add_argument('--label_len', type=int, default=48, help='start token length of Informer decoder')
parser.add_argument('--pred_len', type=int, default=24, help='prediction sequence length')

然后这三个就是影响精度的地方,seq_len和label_len需要根据数据的特性来设置,要进行专业的数据分析,我会在下一周出教程希望到时候能够帮助到大家。

parser.add_argument('--enc_in', type=int, default=7, help='encoder input size')
parser.add_argument('--dec_in', type=int, default=7, help='decoder input size')
parser.add_argument('--c_out', type=int, default=7, help='output size')

这三个参数要修改和你的数据集对应和前面features的设定来配合设置,具体可以看我前面的参数讲解部分,参数需要修改的就这些,然后是代码部分如下。

data_parser = {
    'ETTh1': {'data': 'ETTh1.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
    'ETTh2': {'data': 'ETTh2.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
    'ETTm1': {'data': 'ETTm1.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
    'ETTm2': {'data': 'ETTm2.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
    'WTH': {'data': 'WTH.csv', 'T': 'WetBulbCelsius', 'M': [12, 12, 12], 'S': [1, 1, 1], 'MS': [12, 12, 1]},
    'ECL': {'data': 'ECL.csv', 'T': 'MT_320', 'M': [321, 321, 321], 'S': [1, 1, 1], 'MS': [321, 321, 1]},
    'Solar': {'data': 'solar_AL.csv', 'T': 'POWER_136', 'M': [137, 137, 137], 'S': [1, 1, 1], 'MS': [137, 137, 1]},
    'custom': {'data': 'ETTh1.csv', 'T': 'OT', 'M': [7, 7, 7], 'S': [1, 1, 1], 'MS': [7, 7, 1]},
}

main_informer.py文件有如上的结构,这是我修改之后的,你可以按照我的修改,其中custom就是对应你前面设置参数data的名字,然后data后面替换成你的数据集,必须是csv格式的文件这里,然后是T大家不用管,OT修改成你自己数据集中预测的哪一列列名,就是前面设置的target值,然后是M,S,MS分别对应你数据中的列的给个数即可,我这里输入是8列扣去时间一列在M中就全部填写7即可,S的话我的数据集用不到,MS就是7列输出一列。 

最后呢大家如果需要我的数据集和修改完成之后的实战代码可以在评论区留言。

八、全文总结 

 到此本文的正式分享内容就结束了,在这里给大家推荐我的时间序列专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的模型进行补充,目前本专栏免费阅读(暂时,大家尽早关注不迷路~),如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

 专栏回顾: 时间序列预测专栏——持续复习各种顶会内容——科研必备

如果大家有不懂的也可以评论区留言一些报错什么的大家可以讨论讨论看到我也会给大家解答如何解决!最后希望大家工作顺利学业有成!

时间序列ARIMA滚动预测 什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列,时间序列分析就是通过观察历史数据预测未来的值。在这里需要强调一点的是,时间序列分析并不是关于时间的回归,它主要是研究自身的变化规律的(这里不考虑含外生变量的时间序列)。 为什么用python 用两个字总结“情怀”,爱屋及乌,个人比较喜欢python,就用python撸了。能做时间序列的软件很多,SAS、R、SPSS、Eviews甚至matlab等等,实际工作中应用得比较多的应该还是SAS和R,前者推荐王燕写的《应用时间序列分析》,后者推荐“基于R 阅读详情

相关推荐

informer自定义数据集

将自定义数据序列数据集文件夹添加到data文件夹下之后,前往代码修改以下几个地方:1、自定义数据集的时间列的字段名称 要是“date”;#想要获得最终预测的话这里应该设置为True;否则将是获得一个标准化的预测。

qq_31807039的博客 3959

针对Informer中时序数据ETT油温数据分析

电力变压器油温数据,由国家电网提供,该数据集是来自中国同一个省的两个不同县的变压器数据,时间跨度为2年,原始数据每分钟记录一次(用 m 标记),每个数据集包含2年 * 365天 * 24小时 * 60分钟 = 1,051,200数据点。由于数据量的庞大,将数据粒度改为每15分钟1个数据点,记为ETTm1、ETTm2,或一个小时级别粒度的数据集变体使用(用 h标记),记为ETTh1、ETTh2。每个数据点均包含8维特征,包括数据点记录日期,预测目标值oil temperature和6个不同类型功率负载特征。

creeper的博客 1万+

Informer魔改实战:滚动长期预测与论文级可视化

时间序列预测是电力负荷调度、气象预报等领域的核心技术,而Transformer及其变体近年来在此任务中表现突出。Informer作为其中代表模型,凭借ProbSparse自注意力机制降低了长序列计算复杂度,但其原生设计假定“一次生成整段预测”,在滚动预测场景下容易出现误差累积与预测均值化问题。针对此问题,本文从结构、数据和损失函数三方面对Informer进行改造:引入分层注意力与门控残差预测头,采用多起点滚动采样,并设计分步衰减MSE与差分L1联合损失,有效缓解了长期预测中的误差传播。实验表明,改造后模型在

weixin_27014595的博客 307

时间序列预测实战(二十五)PyTorch实现Seq2Seq进行多元和单元预测(附代码+数据集+完整解析)

本文给大家带来的时间序列模型是Seq2Seq,这个概念相信大家都不陌生了,网上的讲解已经满天飞了,但是本文给大家带来的是我在Seq2Seq思想上开发的一个模型和新的架构,架构前面的文章已经说过很多次了,其是专门为新手开发的,而且为了方便大家使用只定义了一个文件方便大家复制粘贴,架构功能包括:结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测功能。Seq2Seq模型是一种处理序列数据的深度学习模型,广泛用于机器翻译、语音识别和文本摘要等任务(也能用于时间序列)。

Snu77的博客 9939

时序预测中常用数据集合集,包括ECL ETTh1 ETTj2 ETTm1 ETTm2 EXR ILI m4 TRF WTH stock等数据集

时序预测中常用数据集合集,包括ECL ETTh1 ETTj2 ETTm1 ETTm2 EXR ILI m4 TRF WTH stock等数据集

分别基于LSTM、Transformers和自定义模型实现ETTh1数据集时间序列预测源码+项目说明.zip

新毕业设计-分别基于LSTM、Transformers和自定义模型实现ETTh1数据集时间序列预测源码+项目说明.zip 【项目介绍】 该项目是一个用于ETTh1数据集的时间序列预测的工具。它包含了LSTM、Transformers和自定义模型等多种预测模型。用户可以通过调整模型名称和序列长度等超参数来优化模型性能。 提供多种时间序列预测模型,包括LSTM、Transformers和自定义模型 支持调整超参数,如模型名称和序列长度,以优化模型性能 包含辅助脚本,如Transformers模型的子模块实现 技术栈 Python 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现

Informer长时序预测网络(2.输出可视化结果&更改自己的数据集)--小白粥学习笔记

----------------------------------------------------------分割线------------------------------------------------------------[24/04/29]-----------------------------------------------------------分割线------------------------------------------------------------

m0_53400993的博客 5491

AI视频生成成本优化实战:混合架构与硬件选型

AI视频生成技术正面临效果与成本的二元博弈,其核心挑战在于高昂的推理算力消耗与黑箱服务的不确定性。从技术原理看,视频生成依赖扩散模型等深度学习架构,通过多轮迭代实现像素级合成,这导致GPU显存占用和电力消耗呈指数级增长。在工程实践中,采用混合推理架构能有效平衡成本与质量,例如云端处理关键帧配合本地渲染过渡帧,实测可降低58%支出。硬件选型方面,消费级显卡魔改与边缘计算设备为中小企业提供了可行方案,如RTX 3090显存扩容或Jetson AGX边缘部署。当前AI视频应用已渗透电商直播、新闻制作等领域,但需警

weixin_29531177的博客 295

LSTM-EAAtention-Transfomer——基于有效附加注意力的时间序列预测

在自然语言处理(NLP)领域,传统的加性注意力机制通过元素乘法而非点积来捕捉令牌间的成对交互,以获取全局上下文信息。这种机制依赖于三个关键的注意力分量——查询(Q)、键(K)和值(V)——来编码输入序列中上下文信息的相关性得分。这种方法被称为有效的附加注意力,它不仅提高了推理速度,而且生成了更强大、更丰富的上下文表示。在传统的RNN中,由于梯度消失的问题,网络往往难以捕捉序列中的长期依赖关系。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。

小嘤熊的博客 2447

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8352

如何用Lmcache+vllm优化KVcache存储?CPU与SSD性能实测对比

本文通过实测对比,详细介绍了如何利用Lmcache+vLLM将大模型推理中的KV Cache卸载至CPU内存或SSD硬盘,以解决长上下文场景下的GPU显存瓶颈。测试数据显示,CPU卸载方案在首字延迟(TTFT)上显著优于SSD方案,但SSD方案在存储成本上更具优势。文章提供了完整的配置指南、性能数据分析和生产环境选型建议。

fire9的博客 988

【ICLR 2023】时间序列预测实战Crossformer(附代码+数据集+详细讲解)

本篇文章给大家带来的实战讲解是Crossformer模型,其是一个针对多变量时间序列预测的新型深度学习模型,发表ICLR 2023上并且排名前5%,所以这个模型的质量还是能够有一定保证的(但是我用官方的代码真的是Bug一堆改的让人头大)。Bug多是很多但是其效果还是可圈可点的,Crossformer的主要思想是:通过维度-段式嵌入技术将时间序列数据转换为二维向量数组,同时使用两阶段注意力层来高效地捕获这两种依赖关系。Crossformer采用分层编码器-解码器结构,在不同层次上利用信息进行预测。

Snu77的博客 2万+

STM32实战开发(76):STM32开发无线传感器网络(WSN)完整实现

本文介绍了如何基于STM32开发无线传感器网络,包括硬件选择、通信协议、系统设计和编程实现。通过STM32的强大性能和低功耗特性,我们能够构建高效、可靠的无线传感器网络。无论是Zigbee、LoRa、Wi-Fi还是BLE协议,STM32都能够与多种通信模块进行兼容,满足不同应用的需求。希望这篇文章能帮助您了解无线传感器网络的构建流程,并为您的项目提供有价值的参考。

2201_76125393的博客 1059

PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测

PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测

KI的博客 1万+

【ArcGIS遇上Python】ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换

由于论文的需要,将MODIS NDVI数据进行投影变换和格式转换,具体操作可以参照:《ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换》,但是该文章中的做法只能一次性实现一景影像的转换,没法批量,虽然ArcGIS中提供了Batch的方法但是需要挨个添加数据,确定输出路径等等,本文就实现以ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换。先来看投影后的效果: 在实现批量投影转换之前,需要两个投影文件:Sinusoidal.prj和MyAl

智慧空间实验室 3815

滑模控制算法(SMC)讲解-案例(附C代码)

该文章介绍了滑模控制算法的原理实现步骤,特点及关键问题,最后以车辆控制案例来讲解滑模控制的整个步骤实现

heda3的博客 4111

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

大家好,最近在搞论文所以在研究各种论文的思想,这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布,其主要的核心思想是:基于多层感知机(MLP)构建的编码器-解码器架构,核心创新在于它结合了线性模型的简洁性和速度优势,同时能有效处理协变量和非线性依赖。论文中号称TiDE在长期时间序列预测基准测试中不仅表现匹敌甚至超越了先前的方法,而且在速度上比最好的基于Transformer的模型快5到10倍。在官方的开源代码中是并没有预测未来数据功能的,因为这种都是学术文章发表论文的时候只看测试集表现。

Snu77的博客 7731

基于Simulink的间接功率控制的矩阵变换器

通过上述步骤,我们成功设计并实现了基于 Simulink 的间接功率控制的矩阵变换器仿真模型。该模型能够通过控制输入电流和输出电压,实现对功率的间接控制,适用于电机驱动、可再生能源系统、电力传输等领域。通过虚拟场景仿真、参数优化和性能评估,验证了系统的稳定性和高效性,并通过调整 PI 控制器参数和优化调制算法,进一步提升了系统的性能。

MHD0815的博客 296

时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)

本文给大家带来的实战内容是利用PyTorch实现LSTM-GRU模型,LSTM和GRU都分别是RNN中最常用Cell之一,也都是时间序列预测中最常见的结构单元之一,本文的内容将会从实战的角度带你分析LSTM和GRU的机制和效果,同时如果你是时间序列中的新手,这篇文章会带你了解整个时间序列的建模过程,同时本文的实战代码支持多元预测单元、单元预测单元、多元预测多元(为我个人编写大家如有转载请标明来源),本文的实战内容通过时间序列领域最经典的数据集——电力负荷数据集为例进行预测。内容回顾->

Snu77的博客 1万+

华为OD机试真题 新系统 - 计算数列位置N的值 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2011

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

优于LSTM、GRU、RNN的时序数据预测方式:PatchTST单变量——Etth1变压器油温时序数据预测

本文探讨了PatchTST模型在长序列电力变压器油温预测中的应用。针对ETT-small数据集,对比了PatchTST与LSTM、GRU、RNN的性能表现。实验采用不同预测长度(96至720小时),结果显示PatchTST在各指标(MSE、MAE、RSE)上均优于传统模型,尤其随着预测长度增加优势更明显。研究详细介绍了数据预处理方法、模型实现过程及评估指标计算,确保实验可比性。结果表明,基于Transformer的PatchTST在长序列预测任务中具有显著优势,为时序预测提供了新思路。

2301_76610365的博客 2128

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

时间序列Long-term Forecasting标准数据集和benchmark

文章在长期时间序列预测对比的benchmark上没有用LSTM/RNN等经典模型,只对比了Transformer-based的模型,其实作为读者我也很好奇LSTM/RNN在长期时间序列预测上的表现。PE越低的序列越容易预测。可以看到,经过文章提出的模型进行变换后,序列的可预测性确实有了提升,PE有显著下降。记录了2015年1月至2016年12月,旧金山湾区高速公路上的 862 个传感器测量的每小时道路占用率。短期时间序列预测,tau代表不同的预测间隔,短期预测考虑3,6,12,24步的向前预测。

hellozhxy的博客 1454

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

论文解读10——Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting

这篇是2021年AAAI的best paper,主要提出了Informer模型来解决Transformer中无法用于长时间序列预测的问题,提高了长时间序列预测问题的能力。

对流层的酱猪肘~的博客 1956

时间序列预测创新代码——基于时间卷积网络TCN、小波卷积WTC、Transformer的时间序列预测

由两个小时级数据集(ETTh)和两个 15 分钟级数据集(ETTm)组成。它们中的每一个都包含 2016 年 7 月至 2018 年 7 月的七种石油和电力变压器的负载特征。

小嘤熊的博客 1469

Informer2020多数据集验证:ETTh1/ETTh2/ETTm1性能深度测评

你是否在处理工业时间序列数据时遇到以下痛点?长序列依赖难以捕捉、多变量特征耦合复杂、不同采样频率数据集性能波动大?作为Informer模型的原始PyTorch实现,Informer2020通过ProbSparse注意力机制在长序列预测任务中实现了O(n log n)的时间复杂度优化。本文将基于ETT(Electrical Transformer Temperature)数据集家族的三个关键子集(E...

gitblog_00103的博客 1673

深度学习(19)——informer 详解(1)

transformer 长时间序列预测

羊羊的博客 5646
上一篇: YOLOv8改进 | 注意力机制 | 添加FocusedLinearAttention助力YOLOv8实现有效涨点
下一篇: YOLOv8改进 | SAConv可切换空洞卷积(附修改后的C2f+Bottleneck)
Snu77
Snu77 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄5年 11万+粉丝 934原创
评论 289
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Snu77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值