PyTorch-LSTM时间序列预测中如何预测真正的未来值
目录
- I. 前言
- II. 分析
- III. 多变量预测
I. 前言
之前写过几篇有关PyTorch搭建LSTM实现时间序列预测的文章,具体链接如下:
系列文章:
- 深入理解PyTorch中LSTM的输入和输出(从input输入到Linear输出)
- PyTorch搭建LSTM实现时间序列预测(负荷预测)
- PyTorch搭建LSTM实现多变量时间序列预测(负荷预测)
- PyTorch搭建双向LSTM实现时间序列预测(负荷预测)
- PyTorch搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
- PyTorch搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
- PyTorch搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
- PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
- PyTorch搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
- PyTorch中实现LSTM多步长时间序列预测的几种方法总结(负荷预测)
- PyTorch-LSTM时间序列预测中如何预测真正的未来值
- PyTorch搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
- PyTorch搭建ANN实现时间序列预测(风速预测)
- PyTorch搭建CNN实现时间序列预测(风速预测)
- PyTorch搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
- PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)
- PyTorch时间序列预测系列文章总结(代码使用方法)
- TensorFlow搭建LSTM实现时间序列预测(负荷预测)
- TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
- TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
- TensorFlow搭建LSTM实现多变量多步长时间序列预测(一):直接多输出
- TensorFlow搭建LSTM实现多变量多步长时间序列预测(二):单步滚动预测
- TensorFlow搭建LSTM实现多变量多步长时间序列预测(三):多模型单步预测
- TensorFlow搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
- TensorFlow搭建LSTM实现多变量多步长时间序列预测(五):seq2seq
- TensorFlow搭建LSTM实现多变量输入多变量输出时间序列预测(多任务学习)
- TensorFlow搭建ANN实现时间序列预测(风速预测)
- TensorFlow搭建CNN实现时间序列预测(风速预测)
- TensorFlow搭建CNN-LSTM混合模型实现多变量多步长时间序列预测(负荷预测)
文章写出后有不少人加了我的微信,也探讨了不少问题。这其中大家问得最多的问题是:到底怎么预测真正的未来值呢?而不是简单预测测试集里面的数据。这个问题其实很好解决,但貌似很多人不知道怎么写代码,也不知道怎么在原有代码的基础上改代码。所以,这篇文章我详细讲一下如何预测真正的未来值。
II. 分析
模型训练自不必说。
在对测试集进行预测时,我们已经提前处理好了数据,具体测试代码如下:
def test(args, Dte, lis, path):# Dtr, Dte, lis1, lis2 = load_data(args, flag, args.batch_size)pred = []y = []print('loading models...')input_size, hidden_size, num_layers = args.input_size, args.hidden_size, args.num_layersoutput_size = args.output_sizeif args.bidirectional:model = BiLSTM(input_size, hidden_size, num_layers, output_size, batch_size=args.batch_size).to(device)else:model = LSTM(input_size, hidden_size, num_layers, output_size, batch_size=args.batch_size).to(device)# models = LSTM(input_size, hidden_size, num_layers, output_size, batch_size=args.batch_size).to(device)model.load_state_dict(torch.load(path)['models'])model.eval()print('predicting...')for (seq, target) in tqdm(Dte):target = list(chain.from_iterable(target.data.tolist()))y.extend(target)seq = seq.to(device)with torch.no_grad():y_pred = model(seq)y_pred = list(chain.from_iterable(y_pred.data.tolist()))pred.extend(y_pred)y, pred = np.array(y), np.array(pred)m, n = lis[0], lis[1]y = (m - n) * y + npred = (m - n) * pred + nprint('mape:', get_mape(y, pred))# plotplot(y, pred)
核心代码:
for (seq, target) in tqdm(Dte):target = list(chain.from_iterable(target.data.tolist()))y.extend(target)seq = seq.to(device)with torch.no_grad():y_pred = model(seq)y_pred = list(chain.from_iterable(y_pred.data.tolist()))pred.extend(y_pred)
Dte为测试集,对于Dte中的每一个seq我们都知道了其标签target,但在预测未来值时我们只能得到seq,并不知道label。
当前时间为2022/6/6的21:00,我们用前24个小时的负荷值预测未来12个小时的负荷值。现在假设测试集的截止时间就为6/6的21:00,现在我们需要预测22:00到6/7 9:00的负荷值。根据模型的需求,我们需要构造一个seq,seq里面包含了6/6 21:00往前24个时刻的负荷值,这个是真实存在的。
具体代码:
def predict_one_step(model):data = data_process.load_data()train = data[:int(len(data) * 0.7)]test = data[int(len(data) * 0.7):len(data)]# 取test的最后24个负荷值load = test[test.columns[1]]load = load.tolist()m, n = np.max(load), np.min(load)load = (load - n) / (m - n)test = test.values.tolist()seq = []for i in range(len(test) - 24, len(test)):seq.append([load[i]])seq = [seq]seq = torch.FloatTensor(seq)seq = MyDataset(seq)seq = DataLoader(dataset=seq, batch_size=1, shuffle=False, num_workers=0)# print(new_seq)seq = [x for x in iter(seq)][0]print(seq.shape) # (1, 24, 1) batch_size=1, seq_len=24, input_size=1# 开始预测seq = seq.to(device)with torch.no_grad():y_pred = model(seq)y_pred = list(chain.from_iterable(y_pred.data.tolist()))# y_pred为一个列表,长度为12return y_pred * (m - n) + n
上述代码的作用是利用测试集中最后24个时刻的值预测未来12个时刻的负荷值,这12值还没被观测到,是真正意义上的未来值。值得注意的是,为了满足模型的需要,即使只预测一个样本,我们也需要将其处理成如下格式的Tensor:
(batch_size=1, seq_len=24, input_size=1)
这里input_size=1,即我们在预测未来值时只考虑负荷值,不考虑其他诸如温度、湿度以及压强等环境因素。
现在我们已经预测完了今晚22:00到6/7 9:00的负荷值,如果我们想接着预测6/7 10:00~21:00的负荷值又该如何操作呢?一般来讲,有以下三种可能:
(1)假设电网有能力实时收集到真实用电负荷值,到明天9:00时,我们已经观测到了今晚22:00到明天9:00的真实值,且这些真实值保存在了数据库中,假设保存在了数组true_list中。那么我们完全可以利用今晚22:00到明天9:00的真实值预测未来12小时的负荷值,具体代码如下:
def predict_1(model, true_list, MAX, MIN):# 取真实值中最后24个负荷值true_list = true_list[-24:]# 构造seqtrue_list = (true_list- MIN) / (MAX - MIN)seq = [[x] for x in true_list]seq = [seq]seq = torch.FloatTensor(seq)seq = MyDataset(seq)seq = DataLoader(dataset=seq, batch_size=1, shuffle=False, num_workers=0)# print(new_seq)seq = [x for x in iter(seq)][0]print(seq.shape) # (1, 24, 1) batch_size=1, seq_len=24, input_size=1# 开始预测seq = seq.to(device)with torch.no_grad():y_pred = model(seq)y_pred = list(chain.from_iterable(y_pred.data.tolist()))# y_pred为一个列表,长度为12return y_pred * (MAX - MIN) + MIN
简单来说就是利用真实值列表true_list中最后12个值进行预测。需要注意的是,我们是利用训练集中的最大最小值来对新数据进行归一化与反归一化的。此时,我们是可以计算MAPE的,因为真实值和预测值都存在。
(2)在现实生活中,往往很难及时收集到用电负荷信息,比如我们预测到了明天9:00,在明天9:00时,我们收集不到今晚22:00到明天9:00间的真实负荷值,此时我们就需要利用预测值来进行预测。也就是用一开始得到的今晚22:00到明天9:00间的预测值来预测未来12小时的负荷值,我们假设预测值保存在pred_list中,那么将上面代码中的true_list换成pred_list就可以得到未来12小时的负荷预测值。值得注意的是,此时是不能计算MAPE的,因为真实值尚未观测到。
(3)在明天9:00时,我们也不是一点真实值都没收集到,比如我们收集到了今晚22:00到明早3:00的负荷值,4:00到9:00的真实负荷值虽然已经产生,但电网还没有收集到数据库中。此时我们拥有6个真实值以及6个预测值,那么此时我们就可以用6个真实值加6个预测值,以及今晚9:00之前的12个真实值组成1个seq进行预测。一个大的前提:尽量使用真实值进行预测。
III. 多变量预测
上面的例子都是单变量预测,如果是多变量预测,情况将变得复杂一点。假设我们利用负荷值、温度、湿度以及压强四个变量来预测负荷。在我们预测今晚22:00到明早9:00的负荷值时,我们可以利用测试集中的数据进行预测。但当我们需要预测明早9:00之后的负荷值时,我们需要同时考虑是否收集到了真实的温度、湿度以及压强值。一般来讲,这些环境变量的收集比负荷数据的收集更加容易,也就是上述第二节中的第一种情况。
如果我们无法及时收集到负荷值,我们可以利用预测值进行预测;如果我们无法及时收集到温度、湿度以及压强值,我们也只能利用预测值进行预测。这就意味着,我们需要额外训练三个模型来分别预测温度、湿度以及压强,由于这三个变量和负荷一一对应,也属于时序数据,我们也可以采用LSTM进行预测,如果其变化幅度不大也可以采用传统的机器学习算法进行预测。
PyTorch-LSTM时间序列预测中如何预测真正的未来值相关推荐
- TensorFlow搭建LSTM实现多变量时间序列预测(负荷预测)
目录 I. 前言 II. 数据处理 III. LSTM模型 IV. 训练/测试 V. 源码及数据 I. 前言 在前面的一篇文章TensorFlow搭建LSTM实现时间序列预测(负荷预测)中,我们利用L ...
- TensorFlow搭建LSTM实现时间序列预测(负荷预测)
目录 I. 前言 II. 数据处理 III. 模型 IV. 训练/测试 V. 源码及数据 I. 前言 前面已经写过不少时间序列预测的文章: 深入理解PyTorch中LSTM的输入和输出(从input输 ...
- TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
目录 I. 前言 II. 原理 III. 模型定义 IV. 训练和预测 V. 源码及数据 I. 前言 前面几篇文章中介绍的都是单向LSTM,这篇文章讲一下双向LSTM. 系列文章: 深入理解PyTor ...
- TensorFlow搭建CNN实现时间序列预测(风速预测)
目录 I. 数据集 II. 特征构造 III. 一维卷积 IV. 数据处理 1. 数据预处理 2. 数据集构造 V. CNN模型 1. 模型搭建 2. 模型训练及表现 VI. 源码及数据 时间序列预测 ...
- 深度学习方法在负荷预测中的应用综述(论文阅读)
前言 本篇论文主要介绍了当下用于智能电网电力负荷预测的多种DL方法,并对它们的效果进行了比较.对于RMSE的降低效果上,集成DBN和SVM的方法RMSE降低显著,达到了21.2%.此外,PDRNN ...
- 在Python中使用LSTM和PyTorch进行时间序列预测
全文链接:http://tecdat.cn/?p=8145 顾名思义,时间序列数据是一种随时间变化的数据类型.例如,24小时内的温度,一个月内各种产品的价格,一年中特定公司的股票价格(点击文末&quo ...
- 【深度学习】在PyTorch中使用 LSTM 进行新冠病例预测
时间序列数据,顾名思义是一种随时间变化的数据.例如,24 小时时间段内的温度,一个月内各种产品的价格,特定公司一年内的股票价格.长短期记忆网络(LSTM)等高级深度学习模型能够捕捉时间序列数据中的模式 ...
- [转载] lstm时间序列预测_pytorch入门使用PyTorch进行LSTM时间序列预测
参考链接: 在Python中使用LSTM和PyTorch进行时间序列预测 想了解更多好玩的人工智能应用,请关注公众号"机器AI学习 数据AI挖掘","智能应用" ...
- LSTM 时间序列预测+股票预测案例(Pytorch版)
文章目录 LSTM 时间序列预测 股票预测案例 数据特征 对收盘价(Close)单特征进行预测 1. 导入数据 2. 将股票数据收盘价(Close)进行可视化展示 3. 特征工程 4. 数据集制作 5 ...
- keras时间序列数据预测_使用Keras的时间序列数据中的异常检测
keras时间序列数据预测 Anomaly Detection in time series data provides e-commerce companies, finances the insi ...
最新文章
- 视觉slam学习--坐标系变换 | 欧式变换+仿射变换+射影变换
- 调试中的一些Python错误
- 八.linux系统文件属性知识
- 网络摄像头4 cmos 0v9650,driver
- DM365 u-boot启动分析
- 傅立叶变换是如何改变我们生活的? ——四个角度告诉你答案
- Gblfy 专栏设立服务大家,共享资源
- 基于Bootstrap和animate.css的模态框动画效果
- logistic regression一点理解
- es使用pencentiles对网站访问延时统计
- python拆分合并文件_python实现文件的分割与合并
- Android Material Components – MaterialAlertDialog
- 基于级联双向胶囊网络的鲁棒三元组知识抽取
- cornerstone 使用
- Windows操作系统管理进程和线程:内核模式和用户模式
- 邮件系统html源码,SpringBoot系列—简单的邮件系统(附完整项目代码)
- 【课件制作软件】Focusky教程 | 设置文字阴影效果
- java ocr 表格票据识别_OCR表格票据识别技术。
- 三星在美三大报投整版道歉信 中美待遇为何迥然不同
- 【英语阅读】纽约时报 | 台湾美食为什么那么“Q”?
热门文章
- AopAutoConfiguration matched: - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPrope.
- 加ing形式的单词有哪些_初中英语中哪些单词后接动词要加ing形式
- JS 中删除节点的两个方法
- C++ TLV格式解析
- python实现压缩文件夹
- ppt无损转图片jpg,pdf api
- 利用Promise彻底解决微信小程序云函数因运行时间过长返回result,underfined为空的方法
- 12306html布局,12306更新验证码
- 到底什么是云计算?云计算能干什么?
- 护眼灯频闪是什么意思?如何消除led灯频闪