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

【目标检测】 IterDet模型简介、TIDE评价指标介绍 来源 | 极链AI云(性价比最高的共享GPU算力平台,双十活动进行中 10.9-10.11,新人注册可领取198元大礼包,价值100小时的免费使用时长,领取地址:https://cloud.videojj.com/) 作者 | 小仇极链AI云技术原创奖励计划 原文地址 | [目标检测] IterDet(Iterative Scheme for Object Detection in Crowded Environments)模型简介 [目标检测-评价指标] TIDE(A General Tool.. 阅读详情
AI摘要

本文介绍了Google在2023年8月发布的TiDE模型,它基于多层感知机构建编码器 - 解码器架构,结合线性模型优势,能处理协变量和非线性依赖。文中阐述了其框架原理、实验结果,还给出实战所用数据集、代码及参数详解,展示了模型训练、测试和预测效果,并说明如何用自己的数据集训练。

一、本文介绍

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

(开始之前给大家推荐一下我的专栏,本专栏包含时间序列领域各种模型适合各类人群,同时包含本人创新的框架和模型,无论你是想发论文还是工程项目中使用本专栏都能够满足你的需求) 

   专栏目录:时间序列预测目录:深度学习、机器学习、融合模型、创新模型实战案例

专栏: 时间序列预测专栏:基础知识+数据分析+机器学习+深度学习+Transformer+创新模型

预测未知数据功能如下->

下面的图片集成在模型的预测功能上,大家运行直接可以生成。

滚动长期预测功能如下->

下面的文件是由代码自动生成的csv文件可以用其进行各种可视化操作。

目录

一、本文介绍

二、TiDE的框架原理

2.1 TiDE的框架原理

2.1.1 密集多层感知机(MLP)编码器

2.1.2 密集MLP解码器

2.1.3 特征投影步骤

2.1.4 时序解码器

2.1.5 全局线性残差连接

2.2 TiDE的实验结果

三、实战所用数据集 

四、实战代码 

4.1 个人完善版本下载地址 

4.2 参数详解 

五、DiTE实战

5.1 训练模型

5.2 测试集表现 

5.3 预测未来一天的数据(结果可视化)

5.4 滚动长期预测(结果可视化 + CSV文件生成)

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

七、本文总结 


二、TiDE的框架原理

​

论文地址: 官方论文地址

代码地址: 官方代码地址

​


2.1 TiDE的框架原理

TiDE(时间序列密集编码器)模型是一个基于多层感知机(MLP)的编码器-解码器架构,旨在简化长期时间序列预测。该模型结合了线性模型的简单性和速度,同时能够有效处理协变量和非线性依赖。理论上,该模型的简单线性类似物能够在特定条件下为线性动态系统(LDS)实现接近最优的误差率。

TiDE(时间序列密集编码器)模型的网络结构可以概括为以下几个关键组成部分:

  1. 密集多层感知机(MLP)编码器:TiDE使用密集的MLP来编码时间序列的过去信息以及协变量。

  2. 密集MLP解码器:解码器同样基于密集的MLP,用于处理编码后的时间序列和未来的协变量。

  3. 特征投影步骤:模型在编码和解码过程中包含一个将动态协变量映射到低维空间的特征投影步骤。

  4. 时序解码器:最终的预测是通过结合每个时间步的解码向量与该时间步的投影特征来形成的。

  5. 全局线性残差连接:从回溯到预测范围,模型还增加了一个全局线性残差连接。

总结:TiDE模型的结构注重于简化和效率,避免了自注意力、递归或卷积机制,从而在处理长期时间序列预测任务时实现了线性的计算量扩展。

下面的图片是TiDE的网络结构图(附上我个人的理解)->

这个网络结构从输入到输出的工作流程是:

  1. 动态协变量:它首先对时间序列的动态协变量进行特征投影,简化特征的维度。

  2. 查回和属性输入:将过去的时间序列数据(查回部分)与相关属性(如日期、假日等)结合。

  3. 编码:这些结合后的数据被送入密集编码器,它使用多层感知机对信息进行编码,生成一个内部表示。

  4. 解码:内部表示随后被送入密集解码器,再次使用多层感知机,解码预测未来的时间序列。

  5. 时序解码:每个时间步的预测通过时序解码器进行优化,以生成最终的时间序列预测。

  6. 残差连接:为了加强模型的预测能力并减少训练中的问题,如梯度消失,一个残差连接直接将输入的查回部分连接到输出端。

这整个过程就像是将时间序列的历史数据和相关信息通过一个多层处理过程,最终转化为对未来的精准预测。

下面我来分别介绍TiDE的几个关键组成部分(同时每一个步骤在TiDE的网络结构中位置我都进行了标注)->


2.1.1 密集多层感知机(MLP)编码器

密集多层感知机(MLP)编码器是TiDE模型中的核心部分,它的作用是将时间序列的历史数据(也称为查回部分)和协变量(如日期、天气等可能影响预测的外部信息)转换成内部表示。这个编码器通过一系列层次化的网络层(即MLP层)来处理输入数据,每一层都会对数据进行转换和学习,从而捕捉时间序列的复杂模式和依赖关系。简而言之,这个编码器将原始输入转换成模型可以进一步处理的压缩信息。


2.1.2 密集MLP解码器

密集MLP解码器在TiDE模型中扮演着将编码后的信息转换回时间序列预测的角色。这个解码器接收来自编码器的内部表示,并开始构建对未来时间点的预测。它也使用多层感知机层,这些层专门训练用于识别编码信息中的模式,并将这些模式映射到未来的协变量上,从而生成对未来时间序列的预测值。简言之,解码器的任务是解读编码的数据,并将其转换为具体的未来预测。


2.1.3 特征投影步骤

特征投影步骤是TiDE模型的一部分,它负责处理动态协变量——这些是随时间变化而变化的输入变量,如天气或节假日等。在这一步骤中,模型将这些协变量从高维空间降维到一个低维空间。这个过程有助于简化模型处理的信息量,减少计算复杂性,并且可能还能帮助模型更有效地从这些协变量中提取有用的特征,以便进行准确的时间序列预测。简单来说,特征投影就像是对输入数据进行压缩,以便于编码器和解码器更有效地处理。 


2.1.4 时序解码器

时序解码器是TiDE模型中的一个重要组件,用于处理密集解码器输出的信息。它特别针对每个时间步骤进行工作,把解码器生成的预测转化为最终的时间序列输出。时序解码器通过在每个时间点上应用特定的变换,优化了预测的时间依赖性,增强了模型对时间序列数据中时间动态的捕捉能力。简而言之,时序解码器将解码过程与时间维度相结合,生成精确的逐步预测。


2.1.5 全局线性残差连接

全局线性残差连接是一种在神经网络中常见的技术,用于改善深层网络的学习效率和减少训练难度。在TiDE模型中,残差连接允许从网络的早期层(在本例中是查回部分)直接传递信息到后面的层,这有助于模型在学习过程中保留原始输入数据的信息。这样,即使在网络很深的情况下,也可以缓解梯度消失的问题,确保网络能够有效地学习和适应训练数据。简单来说,它就像是一个快捷通道,使得输入数据可以绕过多个中间层直接影响输出。


2.2 TiDE的实验结果

下面这个表格总结TiDE的效果对比,可以看出在绝大多数的数据上其都有一个最好的结果(但是真假性不易得知,我个人实验效果只能说和之前的一些模型持平吧)。

这个直方图代表了DiTE模型的训练速度(单位是秒S),我个人训练在3070上速度还可以吧毕竟不像图像领域。


三、实战所用数据集 

了解时序领域的读者都知道,最出名的数据集就是ETTh系列的数据集,我使用的就是ETTh1.csv文件。 

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

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

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

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


四、实战代码 

4.1 个人完善版本下载地址 

前面的代码我提供了一个官方版本,但是那个很简陋,所以我将其集成了在我的框架下,同时上传到了优快云中地址如下->

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


4.2 参数详解 

其中主要的配置文件是main.py文件(我们只需要配置好该文件就可以运行该代码),这里把我设置贴出来方便大家进行设置,同时其中的参数我后面也会进行讲解。

import argparse

import torch

from exp.exp_informer import Exp_Informer

parser = argparse.ArgumentParser(description='TiDE Long Sequences Forecasting')

parser.add_argument('--model', type=str, default='TiDE',
                    help='model of experiment, options: [TiDE]')
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='M',
                    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=24, help='prediction sequence length')

# 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=7, 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=16, 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

args.task_name = 'long_term_forecast'
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': '{}'.format(args.target), '{}'.format(args.features):
        [args.enc_in, args.dec_in, args.c_out]},
}


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()

其中涉及到很多的参数,我来进行讲解(大家如果想运行看完参数讲解你是一定能够运行的),

其中的参数涉及到运行成功与否的我都用颜色标出来了 

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


五、DiTE实战

5.1 训练模型

当我们配置完所有的参数之后直接运行main.py文件就可以开始训练了,控制台的输出如下-> 

训练完的结果保存在该文件目录下(其中的pth文件就是我们的模型我们之后预测直接加载其就可以)-> 


5.2 测试集表现 

测试集本来想做一个画图功能了后来想着大家可能也不需要,所以就没做测试集会打印出模型误差如下->


5.3 预测未来一天的数据(结果可视化)

 下面的文件是代码自动生成预测一天的csv文件。

可视化如下->


5.4 滚动长期预测(结果可视化 + 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('--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',

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

  • 其中data必须填写custom,
  • root_path填写文件夹即可,
  • 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分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的模型进行补充,目前本专栏免费阅读(暂时,大家尽早关注不迷路~),如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

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

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

​

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

相关推荐

TiDE模型详解及代码复现

TiDE模型的产生源于对现有时间序列预测技术的反思和改进。在深度学习领域快速发展背景下,Transformer虽在自然语言处理中表现卓越,但在时间序列预测方面却面临挑战。研究表明,。这一发现引发了对传统MLP模型在时间序列预测中潜力的重新审视。TiDE模型正是在这种背景下应运而生,旨在克服传统线性模型在处理非线性关系方面的局限性,同时保留其计算效率高的优势。通过对MLP结构进行创新,TiDE成功地解决了长期存在的预测窗口与历史窗口非线性关系问题,以及如何有效建模外部变量等关键挑战。

hasakie的博客 1437

【Transformer&CNN&TiDE】从CNN到ViT,再从ViT到TiDE,回顾近十年顶刊和会议发表的关于Attention自注意力、Conv卷积机制以及最新诞生的TiDE模型的发展历程

从CNN到ViT,再从ViT到TiDE,回顾近十年顶刊和会议发表的关于Attention自注意力、Conv卷积机制以及最新诞生的TiDE模型的发展历程

Next_SummerAgain的博客 4885

使用 TiDE 进行时间序列预测

时间序列预测一直是数据科学领域的一个热门研究课题,广泛应用于能源、金融、交通等诸多行业。传统的统计模型如ARIMA、GARCH等因其简单高效而被广泛使用。而近年来,随着深度学习的兴起,基于神经网络的预测模型也备受关注,表现出了强大的预测能力。其中,Transformer模型因其出色的捕捉长期依赖关系的能力,一度被认为是解决时间序列预测问题的利器。但最新研究发现,这些基于Transformer的模型在长期预测任务中,性能并不如人意,反而被一些简单的线性模型超越。

wjianwei666的专栏 557

谷歌本周发布全新线性时间序列预测模型,再次反超Transformer

继之前针对Transformer在时间序列预测中真的有效吗、使用MLP打败复杂模型等研究后,谷歌在昨天发表了一篇最新的时间序列预测工作,提出了TiDE模型,整个模型没有任何注意力机制、RNN或CNN,完全由全连接组成。下面为大家介绍这篇工作的主要内容。论文标题:Long-term Forecasting with TiDE: Time-series Dense Encoder下载地址:https:...

AI蜗牛车 3591

时间序列常用数据集(electrity,ETT,exchange,ILL,traffic,weather)

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

qq_43747519的博客 4万+

Informer模型实战案例(代码+数据集+参数讲解)

本篇博客带大家看的是Informer模型进行时间序列预测的实战案例,它是在2019年被提出并在ICLR 2020上被评为Best Paper,可以说Informer模型在当今的时间序列预测方面还是十分可靠的,Informer模型的实质是注意力机制+Transformer模型,Informer模型的核心思想是将输入序列进行自注意力机制的处理,以捕捉序列中的长期依赖关系,并利用Transformer的编码器-解码器结构进行预测,通过阅读本文你可以学会利用个人数据集训练模型。Informer是一种用于长序列时间序列预测的Transformer模型,但是它与传统的Transformer模型又有些不同点,与传统的Transformer模型相比,Informer具有以下几个独特的特点: 1. ProbSparse自注意力机制:Informer引入了ProbSparse自注意力机制,该机制在时间复杂度和内存使用方面达到了O(Llog L)的水平,能够有效地捕捉序列之间的长期依赖关系。 2. 自注意力蒸馏:通过减少级联层的输入,自注意力蒸馏技术可以有效处理极长的输入序列,提高了模型处理长序列的能力

【实战解析】TiDE模型:以MLP架构重塑时间序列长期预测的效率与精度

本文深入解析了Google Research提出的TiDE模型,该模型通过纯MLP架构在时间序列长期预测中实现了效率与精度的完美平衡。TiDE摒弃了传统的自注意力机制,采用密集连接的多层感知机,显著提升了推理速度,同时保持高预测精度。文章通过实战案例展示了TiDE在电力负荷预测、零售销量预测等场景中的优异表现,并提供了工业部署优化和自定义数据集处理的实用指南。

weixin_30791095的博客 377

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

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

时间序列预测新思路:为什么Google的TiDE用简单的MLP,效果却能比肩Transformer?

本文探讨了Google提出的TiDE模型在时间序列预测中的创新应用,通过简单的MLP架构实现了与Transformer相当甚至更优的性能,同时显著提升计算效率。文章详细解析了TiDE的核心设计哲学、编码器-解码器结构及其在长期预测中的独特优势,为时间序列预测提供了新思路。

weixin_33747129的博客 396

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

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

时间序列预测新思路:手把手教你用Google TiDE模型搞定电力负荷预测(从数据准备到滚动预测全流程)

本文详细介绍了如何使用Google TiDE模型进行电力负荷预测,从数据准备到滚动预测全流程。TiDE作为一种高效的时间序列预测模型,通过编码器-解码器架构和创新的特征投影技术,在长期预测任务中表现出色,特别适合电力行业的复杂周期性数据。文章还提供了ETTh1数据集的实战案例和模型调优策略,帮助读者快速掌握这一技术。

weixin_30411239的博客 282

红外气体检测方案解析:从NDIR原理到物联网终端设计实践

气体检测是工业安全与环境监测的核心需求,其技术原理主要基于气体分子对特定物理或化学信号的响应。非色散红外(NDIR)技术作为一种物理检测方法,通过测量气体分子对特定波长红外光的吸收来定量浓度,因其不依赖化学反应,具备寿命长、抗干扰强和响应快等优势。在工程实践中,红外气体检测方案的价值在于为物联网终端设备提供了高可靠、低功耗的感知能力,广泛应用于工业过程监控、环境空气质量监测以及智能家居安全预警等场景。本文以一套集成了Microchip MCU、Axetris红外光源和Pyreos热释电传感器的参考设计为例,

weixin_30954817的博客 395

时间序列预测新宠TiDE实战:手把手教你用ETTh1数据集复现Google论文结果(含参数调优避坑指南)

本文详细解析了Google Research提出的TiDE(Time-series Dense Encoder)模型在ETTh1数据集上的时间序列预测实战。从环境配置、数据预处理到模型架构实现,再到关键参数调优和性能验证,提供了全面的复现指南和避坑建议。特别针对长期预测场景,展示了TiDE相比传统模型的优势表现,并给出工程化部署的实用技巧。

weixin_31293685的博客 325

UR机械臂正逆运动学解析:从DH参数到8组解的完整求解策略

本文深入解析UR机械臂的正逆运动学求解策略,从DH参数原理到完整的8组解求解方法。详细介绍了正运动学的坐标变换过程,以及逆运动学中Atan2函数和三角恒等变换的应用,并揭示了8组解的产生机制。通过实际案例和调试技巧,帮助工程师掌握UR机械臂运动学求解的核心技术。

weixin_29094775的博客 414

大疆 2021 嵌入式笔试题

在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。

qq_38769551的博客 2496

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

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

creeper的博客 1万+

rk3568 点亮双LVDS 屏

承接文章《rk3568点亮LCD(lvds)》中仅仅只能使用亮单LVDS;经过厂商的努力,陆续发布新补丁。目前支持双lvds显示,缺憾是需要自己额外移植相关补丁。受限于通信频率和VOP编码能力,支持最大分辨仍然是1920x1080、60fps。

weixin_35723192的博客 3008

时间序列-数据集:电力变压器数据集 (ETDataset)

用于支撑”长时间序列”相关的研究。所有的数据都经过了预处理,并且以.csv的格式存储。这些数据的时间跨度为2016年7月到2018年7月。

u013250861的博客 8493

VCAST创建单元测试工程

选择工作目录,后面创建胡UT工程将会生成到这个目录。

qq_42851449的博客 2485

在 SAP S/4HANA Private Cloud 中把标准 CDS View 发布为 OData:可操作的四条路径与完整示例

在 ADT 中创建。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 726

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

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

Snu77的博客 9939

【系统分析师】核心考点:100个高频知识点汇总

本文系统梳理了系统分析师考试的11大领域高频考点,重点解析了计算机硬件与体系结构的7个核心知识点:计算机五大部件(CPU/存储器/总线等)、校验码类型(奇偶/海明/CRC)、CISC与RISC指令系统对比、总线分类与特性、RAID磁盘阵列级别、流水线技术原理及Flynn系统分类法。内容涵盖硬件组成、数据校验、指令架构、存储技术等关键概念,通过表格对比和公式说明,为考生提供结构化的知识框架与备考重点。

数据知道的博客 5573

TiDE时间序列模型预测(Long-term Forecasting with TiDE: Time-series Dense Encoder)

第一步:特征投影,利用残差块将动态协变量(随时间变化的外生变量)映射到低维投影中,在进行多元预测时,需要特征的未来值,因此模型必须处理回望窗口和水平序列,这些序列可能会很长,因此,通向低维空间投影,可以保持长度可控,并允许模型处理更长的序列,包括历史窗口和预测范围。工作流程:编码器会将历史的时间序列数据和相关的学变量(如节假日、促销活动等)输入进去,学习一个紧凑的表示向量,捕捉数据内在模式,接下来,解码器会根据这个向量,结合已知的未来时间步的协变量,生成相应的预测值。

weixin_42209537的博客 1522

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

肿瘤预测TIDE的使用

http://tide.dfci.harvard.edu/login/ 用edu邮箱进行注册。 input有需要进行标准化。input教程: 【预测抗PD1和抗CTLA4免疫治疗反应的在线网站工具使用方法】TIDE: TumorImmuneDysfunction andExclusion_哔哩哔哩_bilibili TIDE算法来预测免疫治疗疗效 – 王进的个人网站 (jingege.wang) 在线分析得出结果解读: 肿瘤TIDE在线分析结果中各项的具体含义如下: No benef

hx2024的博客 4298

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: 时间序列预测实战(二十三)进阶版LSTM多元和单元预测(课程设计毕业设计首选)
下一篇: YOLOv8改进 | Conv篇 | SPD-Conv空间深度转换卷积(高效空间编码技术)
Snu77
Snu77 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄5年 11万+粉丝 934原创
评论 22
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值