机器学习算法实战案例:Informer实现多变量负荷预测

2024-01-21

机器学习算法实战案例系列

  • 机器学习算法实战案例:确实可以封神了,时间序列预测算法最全总结!

  • 机器学习算法实战案例:时间序列数据最全的预处理方法总结

  • 机器学习算法实战案例:GRU 实现多变量多步光伏预测

  • 机器学习算法实战案例:LSTM实现单变量滚动风电预测

  • 机器学习算法实战案例:LSTM实现多变量多步负荷预测

  • 机器学习算法实战案例:CNN-LSTM实现多变量多步光伏预测

  • 机器学习算法实战案例:BiLSTM实现多变量多步光伏预测

  • 机器学习算法实战案例:VMD-LSTM实现单变量多步光伏预测

  • 机器学习算法实战案例:VMD-LSTM实现单变量多步光伏预测(升级版)

答疑&技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

​方式①、微信搜索公众号: Python学习与数据挖掘 ,后台回复:加群
方式②、添加微信号: dkl88194 ,备注:来自CSDN + 技术交流

1 实验数据集

实验数据集采用数据集4:2016年电工数学建模竞赛负荷预测数据集,数据集包含日期、最高温度℃ 、最低温度℃、平均温度℃ 、相对湿度(平均) 、降雨量(mm)、日需求负荷(KWh),时间间隔为1H。

在使用数据之前相对数据进行处理,用其他数据集时也是同样的处理方法。首先读取数据,发数据不是UTF-8格式,通过添加encoding = 'gbk’读取数据, 模型传入的数据必须是UTF-8格式

df= pd.read_table('E:\\课题\\08数据集\\2016年电工数学建模竞赛负荷预测数据集\\2016年电工数学建模竞赛负荷预测数据集.txt',encoding = 'gbk')

然后检查数据是否有缺失值:

df.isnull().sum()

发现数据存在少量缺失值,分析数据特点,可以通过前项或后项填充填补缺失值:

df = df.fillna(method='ffill')

后面需要将表格列名改为英文,时间列名为date ,不然后面运行时会报错:

df.columns = ["date","max_temperature(℃)","Min_temperature(℃ )","Average_temperature(℃)","Relative_humidity(average)","Rainfall(mm)","Load"]

最后将数据按 UTF-8格式保存

load.to_csv('E:\\课题\\08数据集\\2016年电工数学建模竞赛负荷预测数据集\\2016年电工数学建模竞赛负荷预测数据集_处理后.csv', index=False,encoding = 'utf-8')

最后可视化看一下数据:

load.drop(['date'], axis=1, inplace=True)

cols = list(load.columns)

fig = plt.figure(figsize=(16,6))

plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=0.8)

for i in range(len(cols)):

    ax = fig.add_subplot(3,2,i+1)

    ax.plot(load.iloc[:,i])

    ax.set_title(cols[i])

    # plt.subplots_adjust(hspace=1)

2 如何运行自己的数据集

前面两篇文章介绍了论文的原理、代码解析和官方数据集训练和运行,那么大家在利用模型训练自己的数据集的时候需要修改的几处地方。

parser.add_argument('--data', type=str, default='custom', help='data')

parser.add_argument('--root_path', type=str, default='./data/Load/', help='root path of the data file')

parser.add_argument('--data_path', type=str, default='load.csv', help='data file')

parser.add_argument('--features', type=str, default='MS', help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate')

parser.add_argument('--target', type=str, default='Load', help='target feature in S or MS task')

parser.add_argument('--freq', type=str, default='h', help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h')
  • data:必须填写 default=‘custom’,也就是改为自定义的数据
  • root_path:填写数据文件夹路径
  • data_path:填写具体的数据文件名
  • features:前面有讲解,features有三个选项(M,MS,S),分别是多元预测多元,多元预测单元,单元预测单元,具体是看你自己的数据集。
  • target:就是你数据集中你想要知道那列的预测值的列名,这里改为Load
  • freq:就是你两条数据之间的时间间隔。
parser.add_argument('--seq_len', type=int, default=96, help='input sequence length of Informer encoder')

parser.add_argument('--label_len', type=int, default=48, help='start token length of Informer decoder')

parser.add_argument('--pred_len', type=int, default=24, help='prediction sequence length')
  • seq_len:用过去的多少条数据来预测未来的数据
  • label_len:可以裂解为更高的权重占比的部分要小于seq_len
  • pred_len:预测未来多少个时间点的数据
parser.add_argument('--enc_in', type=int, default=6, help='encoder input size')

parser.add_argument('--dec_in', type=int, default=6, help='decoder input size')

parser.add_argument('--c_out', type=int, default=1, help='output size')
  • enc_in:你数据有多少列,要减去时间那一列,这里我是输入8列数据但是有一列是时间所以就填写7
  • dec_in:同上
  • c_out:这里有一些不同如果你的features填写的是M那么和上面就一样,如果填写的MS那么这里要输入1因为你的输出只有一列数据。
# 字典data_parser中包含了不同数据集的信息,键值为数据集名称('ETTh1'等),对应一个包含.csv数据文件名

    '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':'load.csv','T':'Load','M':[137,137,137],'S':[1,1,1],'MS':[6,6,1]},

预测结果保存在result文件下,保存格式为numpy,可以通过下面的脚本进行可视化预测结果:

import matplotlib.pyplot as plt

file_path1 = "results/informer_ETTh1_ftM_sl96_ll48_pl24_dm512_nh8_el2_dl1_df2048_atprob_fc5_ebtimeF_dtTrue_mxTrue_test_0/true.npy"

file_path2 = "results/informer_ETTh1_ftM_sl96_ll48_pl24_dm512_nh8_el2_dl1_df2048_atprob_fc5_ebtimeF_dtTrue_mxTrue_test_1/pred.npy"

data1 = np.load(file_path1)

data2 = np.load(file_path2)

    true_value.append(data2[0][i][6])

    pred_value.append(data1[0][i][6])

df = pd.DataFrame({'real': true_value, 'pred': pred_value})

df.to_csv('results.csv', index=False)

fig = plt.figure(figsize=( 16, 8))

plt.plot(df['real'], marker='o', markersize=8)

plt.plot(df['pred'], marker='o', markersize=8)

plt.tick_params(labelsize = 28)

plt.legend(['real','pred'],fontsize=28)

最后预测的效果如下,发现并不是太好,后续看参数调优后是否能提升模型预测效果。

3 报错分析

报错1:UnicodeDecodeError: ‘utf-8’ codec can’t decode bytes in position 56-57: invalid continuation byte,具体来说,‘utf-8’ 编解码器无法解码文件中的某些字节,因为它们不符合 UTF-8 编码的规则。

  File "D:\Progeam Files\python\lib\site-packages\pandas\io\parsers\c_parser_wrapper.py", line 93, in __init__

    self._reader = parsers.TextReader(src, **kwds)

  File "pandas\_libs\parsers.pyx", line 548, in pandas._libs.parsers.TextReader.__cinit__

  File "pandas\_libs\parsers.pyx", line 637, in pandas._libs.parsers.TextReader._get_header

  File "pandas\_libs\parsers.pyx", line 848, in pandas._libs.parsers.TextReader._tokenize_rows

  File "pandas\_libs\parsers.pyx", line 859, in pandas._libs.parsers.TextReader._check_tokenize_status

  File "pandas\_libs\parsers.pyx", line 2017, in pandas._libs.parsers.raise_parser_error

UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 56-57: invalid continuation byte

解决办法:

(1) 根据提示,要将数据更改’utf-8’格式,最简便的方法将数据用记事本打开,另存为是通过UTF-8格式保存

(2) 尝试使用其他编解码器(如 ‘latin1’)来读取文件,或者在读取文件时指定正确的编码格式。

**报错2:ValueError: list.remove(x): x not in list,**试从列表中删除两个元素,但是这两个元素中至少有一个不在列表中。

File "E:\课题\07代码\Informer2020-main\Informer2020-main\data\data_loader.py", line 241, in __read_data__

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

ValueError: list.remove(x): x not in list

解决办法:在没有找到具体原因的时候 可以在删除元素之前先检查一下列表中是否包含要删除的元素,或者使用 try-except 语句来捕获异常,以便在元素不存在时不会导致程序中断。通过检查,数据中的列名最好改为英文,避免产生乱码。

    cols=self.cols.copy()

    cols.remove(self.target)

    cols = list(df_raw.columns)

    print(cols)  # 输出列的内容

    if self.target in cols:

        cols.remove(self.target)

        print(f"{self.target} not in columns")

        cols.remove('date')

        print("date not in columns")

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

df_raw = df_raw[['date']+cols+[self.target]]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习算法实战案例:Informer实现多变量负荷预测 的相关文章

随机推荐

  • HarmonyOS 基于eTS高效开发HarmonyOS课程类应用

    随着HarmonyOS 3 0 Beta版的发布 API Version 8新增了大批JS eTS API接口 相信很多开发者已经迫不及待想体验基于eTS的HamronyOS应用开发 本期Codelab 我们将基于API Version 8
  • 题解 | #整数与IP地址间的转换#

    百度绝对是今年大厂最ex的 部门是深坑 真别去 我已经替大家踩过 我的金十二银一 Java高频面试题 线程池 入职有编制 退休有房子 Google暑期实习技术面一面 我与101 位架构师交谈的经验 许多人对负载均衡器 API 网关和 BFF
  • 用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

    检索增强生成 Retrieval Augmented Generation RAG 是一种结合了检索 Retrieval 和生成 Generation 的技术 它有效地解决了大语言模型 LLM 的一些问题 比如幻觉 知识限制等 随着 RAG
  • 为什么选择HelpLook而不是Document360:知识库工具分析

    在现今的信息化时代 企业们越来越倾向于使用知识库工具来收集 组织和分享他们的知识资源 HelpLook和Document360是市面上两款不错的知识库管理工具 那如果非要在他们之中选一个 还是建议HelpLook 以下是一些对比分析 希望可
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 甜蜜而简洁 —— 深入了解Pytest插件pytest-sugar

    在日常的软件开发中 测试是确保代码质量的关键步骤之一 然而 对于测试报告的生成和测试结果的可读性 一直以来都是开发者关注的焦点 Pytest插件 pytest sugar 以其清晰而美观的输出 为我们提供了一种愉悦的测试体验 本文将深入介绍
  • 机器学习算法实战案例:LSTM实现多变量多步负荷预测

    文章目录 1 数据处理 1 1 数据集简介 1 2 数据集处理 2 模型训练与预测 2
  • 月薪2W的软件测试工程师,到底是做什么的?

    在生活中 我们常常会遇到以下几种窘迫时刻 准备骑共享单车出行 却发现扫码开锁半天 车子都没有反应 手机导航打车 却发现地图定位偏差很大 司机总是跑错地方 买个水 却遭遇自动售货机吐币 或者不找零钱 好不容易休息打个游戏 却一直出现卡顿 闪退
  • AI魔幻巨制电影《权力的游戏:重生之战》

    AI魔幻巨制电影 权力的游戏 重生之战 冰与火之歌 龙妈雪诺后裔是谁 你相信龙族的力量可以改变维斯特洛大陆的命运吗 在 权力的游戏 重生之战 中 维斯特洛大陆再次陷入混乱之中 但这一次的混乱并非来自家族之间的争斗 而是源自一场神秘的事件 一
  • 题解 | #获取员工其当前的薪水比其manager#

    我为什么拒了华为 offer 国家智能设计与数控技术创新中心 英语好技术烂的top2工科硕就业迷茫 坐等消息 华为ICT无线网络产品线面经 已完结 华为面经 ICT计算产品线 华为计算产品线实习面试 通软 凉凉 软开还是run开 国企银行的
  • 2024诸多大厂春招提前启动!Android的程序员还在等什么

    春招 提前批 已开 xdm别打瞌睡了 格力 顺丰 酷狗 沃尔玛中国 理想 科大讯飞等开启春招 开始收简历了 还有hc的企业提前抢人 春招时间短 节奏快 招满即止 就算挂了也绝不能不投 对企业来说 秋招和春招都是储备人才的黄金时期 春招中 除
  • 【牛客周赛Round 27】题目讲解

    题目一 小红的二进制删数字 小红拿到了一个二进制字符串 s 她可以删掉其中的一些字符 使得最终该字符串为一个2的幂 即可以表示为 2 k 形式的数 小红想知道 自己最少删几个字符可以达成 请你编写一个函数返回这个答案 具体思路 看到这道题目
  • Python常用的自动化小脚本!

    一 list转json string转json 可以使用Python内置的 json 模块将列表 List 和字符串 String 转换成JSON格式 List转JSON假设我们有一个列表 List my list apple banana
  • 做好这几件事,30岁的你也能转行鸿蒙(HarmonyOS)?

    当你年过30 不管你愿不愿意承认 你的精力都在走下坡路 25岁熬一个通宵能写出来的代码 30岁有可能需要一整天 当然你也可以选择不拼精力和体力 当自身的一线经验积累到一定程度后 就会选择慢慢过渡到管理者的角色 通过经验分享及任务分配来参与项
  • 题解 | #汇总各个部门当前员工的title类型的分配数目#

    百度提前批 C 后端开发 技术一面 百度离线搜索架构实习一二三面面经 2024面经总结 百度提前批一面 2024面经总结 百度秋招二面 百度 C 研发工程师 二面 25届百度C 实习一面 已oc 百度 C 日常实习 1 2面 百度 Java
  • 探索自动化测试断言:提升测试效率与质量的关键!

    前言 断言在自动化测试中起着关键的作用 它是验证测试结果是否符合预期的重要手段 如果在自动化测试过程中忽视了断言 那么这个测试就失去了其本质的意义 因为我们无法得知测试结果是否达到了预期的效果 因此 断言在自动化测试中的重要性不言而喻 那么
  • 华为OD机试2024年最新题库(Java)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Java 解法 问
  • 如何用GPT进行论文润色与改写?

    详情点击链接 如何用GPT GPT4进行论文润色与改写 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Ge
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 机器学习算法实战案例:Informer实现多变量负荷预测

    文章目录 机器学习算法实战案例系列 答疑 技术交流 1 实验数据集 2 如何运行自己的数据集 3 报错分析 机器学习算法实战案例系