informer自定义数据集

发布时间 2023-10-08 08:14:59作者: emanlee

 

目录

informer相关

模型数据集划分

模型参数

跑通自定义数据集

预测结果可视化
informer相关

    论文:https://arxiv.org/abs/2012.07436
    感谢论文作者对AI科学做出的贡献,才能像我这种普通人能有机会接触这么nice的文章。作者的github:GitHub - zhouhaoyi/Informer2020: The GitHub repository for the paper "Informer" accepted by AAAI 2021.

模型数据集划分

假设数据维度是317天的数据,滑动窗口为120天预测未来20天数据,num_train = 221 , num_test = 63 ,num_vali = 33 , border1s = [0, 101, 134] ,border2s = [221, 254, 317],

训练集数据:0-222天,120天滑动窗口预测未来30天,训练样本数量:222-120-30+1=72条

验证集数据:102天-254天 ,验证集样本数:254-101-120-30+1=4条

测试集数据:134天-317天 ,测试集样本数:317-134-120-30+1=34条

 


 源码中代码部分如下:

       # init
       assert flag in ['train', 'test', 'val']
       type_map = {'train':0, 'val':1, 'test':2}
       self.set_type = type_map[flag]

    #自定义数据划分训练集、验证集、测试集部分
    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]

模型参数

论文中提出的模型的整体框架如下图所示,可以看出提出的Informer模型仍然保存了Encoder-Decoder的架构:

 


model:可以设置为informer、informersack、informerlight(待定);

data:数据集名称

root_path:数据文件的根路径(默认为./data/ETT/)

data_path:数据文件名(默认为ETTh1.csv)

features:预测任务(默认为M)。这可以设置为M、S、MS(M:多变量预测多变量,S:单变量预测单变量,MS:多变量预报单变量)

target:S或MS任务中的目标目标特征(默认为OT)

freq:用于时间特征编码的freq freq(默认为h)。这可以设置为s,t,h,d,b,w,m(s:秒,t:分钟,h:小时,d:每天,b:工作日,w:每周,m:每月)。

checkpoints:模型保存的位置(默认为./checkpoints/)

seq_len: Informer编码器的输入序列长度(默认为96)

label_len:Informer解码器的起始标记长度(默认为48)

pred_len:预测序列长度(默认为24)

enc_in:编码器输入大小(默认为7)

dec_in:解码器输入大小(默认为7)

c_out:输出大小(默认为7)

d_model:模型的尺寸(默认为512)

n_heads:头数(默认为8)

e_layers:编码器层数(默认为2)

d_layers:解码器层数(默认为1)

s_layers:堆栈编码器层数(默认为3,2,1)

d_ff:全连接层神经元个数(默认为2048)

factor:采样因子数(默认为5)

padding:1D卷积核

distil:是否需要序列长度衰减

dropout:神经网络正则化操作

attn:attention计算方式

embed:时间特征编码方式

activation:激活函数

output_attention:是否输出attention

do_predict:是否需要预测

mix:是否在生成解码器中使用混合注意力,使用此参数意味着不使用混合注意力(默认为True)

cols:数据文件中的某些cols作为输入

itr:试验次数(默认为2)

train_epochs:训练epochs(默认为6)

batch_size:训练输入数据的批量大小(默认为32)

patience:早停策略(默认为3)

learning_rate:优化器学习率(默认为0.0001)

loss:loss计算方式

lradj:学习率衰减参数

use_amp:是否使用自动混合精度训练

inverse:是否反转输出结果
跑通自定义数据集

将自定义数据序列数据集文件夹添加到data文件夹下之后,前往代码修改以下几个地方:
1、自定义数据集的时间列的字段名称 要是“date”;

2、main_informer里面,需要修改、注意的地方如下:

    #想要获得最终预测的话这里应该设置为True;否则将是获得一个标准化的预测。
    parser.add_argument('--inverse', action='store_true', help='inverse output data', default=True)

    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':'train.csv','T':'flow','M':[5,5,5],'S':[1,1,1],'MS':[5,5,1]}
    }
    #'M':[5,5,5],其中5表示输入数据特征有5个

3、exp_informer文件的这里,需要修改、注意的地方如下:


预测结果可视化

 

 


1、在不更改任何参数的情况下跑完代码,会在项目文件夹中生成两个子文件夹:checkpoints文件夹中包含训练完成的模型,后缀名为.pth,该模型文件包含完整的模型架构与各层权重,可以通过torch.load函数加载模型
2、results文件夹中包含metrics.npy、pred.npy、true.npy三个文件,pred.npy表示模型预测值,true.npy表示序列真实值
3、pred.npy与true.npy文件作图进行对比,观察模型效果

    setting = 'informer_ETT_ftMS_sl120_ll90_pl30_dm256_nh8_el2_dl1_df2048_atprob_fc5_ebtimeF_dtTrue_mxTrue_test_0'
    exp = Exp_Informer(args)
    exp.predict(setting, True)
     
    preds = np.load('D:Informer2020-main/results/' + setting + '/pred.npy')
    trues = np.load('D:Informer2020-main/results/' + setting + '/true.npy')
     
    print(trues.shape)
    print(preds.shape)
     
    plt.figure()
    plt.plot(trues[0,:,-1].reshape(-1),label='GroundTruth')
    plt.plot(preds[0,:,-1].reshape(-1),label='Prediction')
    plt.legend()
    plt.show()

 


4、预测结果代码

在pycharm模型训练之前将参数'--do_predict'由'store_true'变为'store_false',这样在代码运行完以后results文件夹中会多出一个文件real_prediction.npy,该文件中即是模型预测的序列值;

    #预测结果30天
    setting = 'informer_ETT_ftMS_sl120_ll90_pl30_dm256_nh8_el2_dl1_df2048_atprob_fc5_ebtimeF_dtTrue_mxTrue_test_0'
     
    preds = np.load('D:Informer2020-main/results/' + setting + '/real_prediction.npy')
     
    print(preds .shape)
————————————————
链接:https://blog.csdn.net/qq_31807039/article/details/130485293