时间序列深度学习模型AAAI 2021论文之一Informer的主要代码解读、项目运作、自定义数据集使用

更新目录


2021-10-11 14:10 更新:informer的预测本质

经调试发现,informer的预测并不存在这种问题(时间预测的悖论),请看第七点提到的。

2021-11 如何安装GPU版本的ML框架、而且是多版本共存的那种,两种方法
2021-11-10 群友提供实现随机种子的函数实现以及具体分析
2022更新 注释链接和代码以及说明、案例在文章底部

一、前言

本文章是对informer开源代码进行自定义数据集(就是如何修改代码以跑通自己的数据集,毕竟原代码仓库没有注释)的使用的代码修改和代码流程解释。由于该informer项目仓库的源码没有注释,本文是包含注释的内容。

以Github上的源码为准!以Github上的源码为准!以Github上的源码为准!

要想得到好的模型效果,你要做的不只是拿数据套模型而已!套模型调参、修改模型之前你要的事情还有很多,这些事情几乎占用你整个项目的60%的时间!

二、informer相关

  1. 论文:https://arxiv.org/abs/2012.07436
  2. 代码仓库:https://github.com/zhouhaoyi/Informer2020
  3. 简介:据网上说是被评为AAAI 2021最佳论文,其作者设计了一种专为LSTF (长序列时间序列预测)设计的基于Transformer的改进模型 Informer,来解决Transformer在应用于LSTF时存在一些严重的问题。比如二次时间复杂度、较高的内存使用量和编解码器结构的固有限制等。Informer具有三个显著特点:采用ProbSparse自关注机制、自注意力提炼、生成式解码器。
  4. 感谢论文作者对AI科学做出的贡献,才能像我这种普通人能有机会接触这么nice的文章。作者的github:https://github.com/zhouhaoyi/Informer2020

三、informer原理和模型架构

这里请自行百度,百度讲的比较透彻,比如:

  • AAAI 2021最佳论文 Informer
  • AAAI 2021最佳论文《Informer》作者:Transformer 最新进展
  • 解读:Informer——比Transformer更有效的长时间序列预测方法
  • 四、informer代码框架、 流水线解读

    1.informer的项目结构:

    以上主要看红色框框部分,一个框框相当于一个模块,从上到下依次的模块含义是:

  • ①:项目的数据文件夹,其中data_loader文件是加载数据、预处理数据的作用。
  • ②:项目的训练功能文件夹,这里面的py文件是用来训练模型的作用。
  • ③:model文件夹,这里包含了模型的详细结构实现、各种作者提出的新的东西都在里面。
  • ④:scripts文件夹,这里包含了模型的启动脚本、使用脚本。
  • ⑤:utols文件夹,这里包含了模型的评估指标、时间轴的时间特征处理、指数缩减学习率、提前停止训练策略、数据标准化策略等功能。当然,还有作者提出的新型mask也在这里面。
  • ⑥:第六部分这里是项目的启动入口main_informer文件(该文件包含了程序入口、变量初始化设置等),还有readme文件、还有依赖包文件。
  • 注意,如果你还没创建好项目的先创建好项目,然后配置解释器,之后:

    pip install -r requirements.txt
    

    五、快速跑通示例和自定义数据集

    1.运行示例

    配置好项目和安装好模块之后,先启动作者给出的数据文件看看是否能够启动:

    作者给出的是这样的命令:

    # ETTh1
    python -u main_informer.py --model informer --data ETTh1 --attn prob --freq h
    
    # ETTh2
    python -u main_informer.py --model informer --data ETTh2 --attn prob --freq h
    
    # ETTm1
    python -u main_informer.py --model informer --data ETTm1 --attn prob --freq t
    
    

    当然也可以这样就好(然后在代码文件中设置好数据和时间频率):

    # ETTh1
    python -u main_informer.py --model informer --data ETTh1 
    

    启动成功之后,可以去配置成自己所需要的自定义数据集。

    2.跑通自定义数据集

    将自定义数据序列数据集文件夹添加到data文件夹下之后,前往代码修改以下几个地方:
    首先,你的自定义数据集的时间列的字段名称 要是“date”,当然也可以不是,但是那样的话需要去改一下dataframe代码的列名。

    (1)main_informer里面:

    parser.add_argument('--data', type=str, required=True, default='titick', help='data them')
    parser.add_argument('--root_path', type=str, default='./data/titick/', help='数据文件的根路径(root path of the data file)')
    
    parser.add_argument('--features', type=str, default='S',....)
    
    parser.add_argument('--data_path', type=str, default='日均价.csv', help='data file')
    
    # 想要获得最终预测的话这里应该设置为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]},
        'titick':{'data':'日均价.csv','T':'price','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
    }
    

    (2)还有exp_informer文件的这里:

    六、修改自定义数据集部分模块的主要解读

    注意:
    将随机打散数据的设置关掉将有助于你去调试模型,去观察张量维度变化。如下:

    七、代码疑惑点:是否存在时间预测的悖论【不存在】

    预测功能的时候本身有可能还是将已知数据作为输入来预测未来,因为现实场景中不会那样的。(说 有可能 主要是我不敢确定是不是,因为我毕竟习惯和常用TensorFlow,pytorch的代码不是看的很清晰)

    这种现实场景就是:假如要预测2021-12-10~2021-12-20号的数据,但是需要2021-11-05到2021-12-09号的数据作为输入X才能实现预测,但是现在还没到11-05,所以那部分X数据就是未来的、是未知的,这种情况下就无法预测,这个是现实问题。

    详细请看我的这篇博客:
    LSTM时间序列预测存在的问题–滑动窗口是一把双刃剑 | Python技能树征题

    2021-10-11 14:10 更新:informer的预测本质

    经调试发现,informer的预测并不存在这种问题(时间预测的悖论)。

    八、实验发现存在的一些疑惑

  • 在预测未来的时候,如果是长时间预测则无法较好的预测出突变的信息,如果是短期的预测(比如2~3个时间点)才能预测出突变,但是不稳定。
  • 更换了损失函数发现原装的mse相对最好,mse特性本身就是对“异常点”有鲁棒性。huber loss进行长序列预测的时候容易趋于稳定。
  • 关于shuffle_flag的设置,训练集的shuffle_flag如果为Flase的话发现预测的时候predict会很好但是需要把dropout设置的比较大比如0.5,为True的话需要把dropout设置的比较小比如0.05。
  • 仅为个人的数据集上的实验内容,每个数据集可能都不一样。有什么好的方法留言一起交流。

    九、仓库

    2022-06-26 代码分享,如果您觉得对您有帮助,欢迎您为仓库点个star

    最后:据说SCINet论文和代码结果相对informer来说更好,可以去试试这个2021年的新模型。

    来源:Tony学长

    物联沃分享整理
    物联沃-IOTWORD物联网 » 时间序列深度学习模型AAAI 2021论文之一Informer的主要代码解读、项目运作、自定义数据集使用

    发表评论