当前位置:   article > 正文

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

informer

更新目录


2021-10-11 14:10 更新:informer的预测本质
2022-10-13 14:57 更新: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原理和模型架构

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

四、informer代码框架、 流水线解读

1.informer的项目结构:
在这里插入图片描述

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

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

注意,如果你还没创建好项目的先创建好项目,然后配置解释器,之后:

pip install -r requirements.txt
  • 1

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

# ETTh1
python -u main_informer.py --model informer --data ETTh1 
  • 1
  • 2

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

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
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]},
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(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年的新模型。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/86285
推荐阅读
相关标签
  

闽ICP备14008679号