DeepAR代码详析(pytorch版)实现用电量预测

2023-10-18 16:30

本文主要是介绍DeepAR代码详析(pytorch版)实现用电量预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DeepAR代码详析(pytorch版)实现用电量预测 – 潘登同学的RNN学习笔记

文章目录

    • DeepAR代码详析(pytorch版)实现用电量预测 -- 潘登同学的RNN学习笔记
  • 数据集说明
    • 数据预处理代码
  • 构造模型
    • Loss函数
    • 评估指标相关
  • utils工具类
  • 训练模型

前言: 上次用Amazon中的glount-ts框架做了一个deepar的股价预测,但是我感觉用的是人家的API,不太好,所以今天来搂一把pytorch的deepar,看看效果如何

数据集说明

数据集说明

  • 2011 ~2014期间;
  • 370 个 家庭的用电量;
  • 频率为 15分钟,但是取的时候是以一个小时为单位取的;

下载地址,下载好解压后放到./data/elect/目录下

超参数

  • 滑动窗口长度: 192 换算为天数为 192/24 = 8
  • 已知序列(上下文)长度: 168 换算为天数 168/24 = 7
  • 预测序列长度: 24 换算为天数 24/24 = 1

了解数据预处理之前,我们需要明确我们的输入与输出

  • 输入:上下文长度的协变量(covariates) X t X_t Xt与上一时刻的结果 Z t − 1 Z_{t-1} Zt1,加上一个指示向量(表示哪一户人家,one-hot形式)
  • 输出:这一时刻的结果 Z t Z_t Zt

训练集与测试集

  • 训练集的开始时间是: 2011-01-01 00:00:00
  • 训练集的结束时间是: 2014-08-31 23:00:00
  • 测试集的开始时间是: 2014-08-25 00:00:00 因为要有7天的上下文
  • 测试集的结束时间是: 2014-09-07 23:00:00

数据预处理的几个关键

  • 有些家庭可能在2011的时候没有入住或者没有开始使用,要将前面全零的这部分去掉
  • 该文是将数据的时间维度按照星期几、小时数(比如上午8:00)、月份当作了协变量
  • 对协变量做数据归一化的时候,是按照协变量级别来做的(将所有家庭,所有时间点的星期几这一变量放到一起做归一化),因为在这里协变量都是周而复始的,所有家庭都共用相同的协变量,所以对对所有时间点,所有家庭的协变量做归一化其实跟只将所有家庭的写变量分不同时间点做归一化是一样的;我认为在协变量不同的情况下,就比如股价预测,每个公司的四价一量都不一样,如果做归一化的话(当前时间点的四价一量与过去时间点的四价一量表达的含义一定不一样),应该对每个时间点做归一化;

在这里插入图片描述

数据预处理代码

建议先把数据下载下来,不然会很慢

在这里插入图片描述

构造模型

deepAR的模型本质上是一个RNN,RNN cell使用的是LSTM,只是在最后输出接了两个全连接层,一个是预测均值的,一个是预测标准差的(一开始我认为只要接一个就可以,最后输出两个神经元即可,后来发现标准差的那个要经过一个softplus激活函数,这个激活函数是relu的一个改进版本,最后接这个的目的也是为了保证标准差为正)

输入的时候,还将one-hot经过embedding层(这都是比较常规的操作啦)

在这里插入图片描述

Loss函数

Loss的构造比较容易理解,在论文中我都没太看懂loss,但是代码里面我看懂了;思路就是根据预测出来的均值与标准差重构一个正态分布,再计算对数似然(就是计算label在该分布下的对数概率),最小化负平均似然即可

在这里插入图片描述

评估指标相关

在这里插入图片描述

utils工具类

工具函数中写了很多params,画图,评估函数,保存模型等的工具类,总之复用性很高,可以借鉴,我这里也贴出来

在这里插入图片描述

训练模型

训练模型这个操作就比较常规了,不详细讲解了,这个的日志写的也不错,贴一下吧;然后test也在evaluate中被调用,所以就没必要另说test了,test的代码也在构造模型中,也比较简单,是一个decoder的过程

在这里插入图片描述

写在最后,该代码不是我写的,源码在github上获取,这里只是我的解读,不懂的可以跟我探讨,总的来说我认为这个pytorch的复现版本写的很优秀,如果想改的话,只需要改改数据预处理部分即可; 如果真的想用该源码做股价预测,就改数据预处理部分吧…

这篇关于DeepAR代码详析(pytorch版)实现用电量预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233786

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核