Informer模型学习记录

发布时间 2023-09-07 13:52:00作者: Hecto

Informer 时间序列模型

data

1. WTH.csv

  • 水厂
  • csv格式数据,总共13列,包含一列标签,12列特征,后面输入模型维度:12
  • 每隔一小时一条记录
  • 每个时间点对应多个特征,最后一个数据值作为数据标签

2. ECL.csv

  • csv格式数据

3. data_loader

            cols = list(df_raw.columns); cols.remove(self.target); cols.remove('date')
        df_raw = df_raw[['date']+cols+[self.target]]

        num_train = int(len(df_raw)*0.7)
        num_test = int(len(df_raw)*0.2)
        num_vali = len(df_raw) - num_train - num_test
        border1s = [0, num_train-self.seq_len, len(df_raw)-num_test-self.seq_len]
        border2s = [num_train, num_train+num_vali, len(df_raw)]
        border1 = border1s[self.set_type]
        border2 = border2s[self.set_type]

border: 由于输入数据是一个连续的序列,因此在原始数据集里取序列的时候【不可以把数据集里末端元素作为序列头】,因为后面没有元素了,无法组成一个完整的序列,因此在划分的训练集、测试集、验证集里会有一个序列边界border的概念,即【最后一个可以组成完整序列的序列头】元素位置。

  • 以减去seq_len序列长度操作来实现【限定(组成完整序列)的边界】

model

?tips : 由于pytorch机制,debug nn.module的时候在forward处打断点

main

命令行参数parser

从命令行中解析参数,从命令行中将参数读出来

  1. parser.add_argument('--freq'):数据重采样(将多个样本结合为一个,比如求均值)
  2. parser.add_argument('--label_len'): 训练样本(含标签样本)序列长度(模型里先验知识)
  3. parser.add_argument('--pred_len'):预测样本序列长度
  4. parser.add_argument('--enc_in'): 输入样本数据维度/输入编码器的样本大小(比如csv训练数据有多少列)
  5. args.s_layers : 模块循环次数
  6. args.freq: 时间序列的间隔大小(小时)

data_parser字典

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]},

定义了一个字典,字典里提供了很多样例数据,不同的样例数据,指定了标签具体是数据中的哪一列。

  • T: 标签列
  • M:序列大小

这个可以用于后面自定义数据,指定数据大小等等,自己定义,模仿构建数据输入模式

Structure

  • ?Encoder: 96(包含了?label: 48)
  • ⚪Decoder: 72 =? label: 48 + ?pred: 24

model.py

  • ?Encoder: 96(包含了?label: 48)
  • ⚪Decoder: 72 =? label: 48 + ?pred: 24
    1. 初始化:input = torch.zeros()
    2. 合并48个先验序列:input = torch.cat()

embed.py

  • DataEmbedding

encoder.py

  • class EncoderLayer

    1. forward: attention

      计算Q\K\V

    2. attn.py

    3. ProbAttention(Informer核心:创新QKV的计算)

      Q\K\V

      每个Q和每个K计算,效率太慢,

      比如96个Q和96个K

      不把96个Q全部和K一一计算,从96个Q中选一部分作为代表

      怎么选出Q呢?

      先随机选25个K,作为评判标准,

      计算96个Q与25个K之间的attention

      将得分从大到小排序

      前25个得分高的Q作为代表

      实现用小的计算量达到同样高水平效果

      更新分数的时候只更新这25个Q值的,其他的用均值作为更新

Decoder.py

  • cross attention

    Q : X

    K : encoder 输出的特征

    V:encoder 输出的特征

  • output 多变量预测

最后反向传播,参数更新,学习参数