LSTM-多变量-单时间步-pytorch-负荷预测(多时间步采用滚动预测)

article/2025/10/31 0:32:32

问题描述

使用LSTM做负荷预测问题,数据共计456行,每一行3个特征,用过去N个时间段特征,预测未来第N+1个时间点的特征,数据格式如下,用00:00:00-04:00:00的[feature1,feature2,feature3],预测第05:00:00的[feature1,feature2,feature3]。本问题属于多变量预测,输入是多变量-多时间步,输出也是多变量,只不过输出是一个时间点,可以使用循环的方式预测多个时间步。
在这里插入图片描述

模块导入

import pandas as pd
import matplotlib.pyplot as plt
import torch.nn as nn
import torch
import time
import numpy as np
import random

2 数据处理

2.1 数据导入以及可视化

data = pd.read_csv("负荷-3变量.csv")
data.plot()
plt.show()

在这里插入图片描述

2.2 划分测试集和训练集

data = data.iloc[:, [1, 2, 3]].values  # 获取数值 456 *3
p = 48 # 预测未来48个小时的数据
train_data = data[:-p]
test_data = data[-p:]
  • train_data 维度:408*3
  • test_data 维度:48*3

2.3 数据归一化

每一列都需要单独归一化,所以axis的值为0

min_data = np.min(train_data, axis=0)
max_data = np.max(train_data, axis=0)
train_data_scaler = (train_data - min_data) / (max_data - min_data)

2.4 将一个序列划分为x和y

制作数据集,对应的x和y,假设用前12个时间步预测第13个时间点,则:

  • x 维度:12 *3
  • y 维度:1 *3
    假设用前24个时间步预测第25个时间点,则:
  • x 维度:24 *3
  • y 维度:1 *3
def get_x_y(data, step=12):# x : 12*3# y: 1 *3x_y = []for i in range(len(data) - step):x = data[i:i + step, :]y = np.expand_dims(data[i + step, :], 0)x_y.append([x, y])return x_y

2.5 生成mini_batch数据

假设batch_size = 16, 则生成的数据维度为:

  • x:16* 12 * 3
  • y: 16 * 1 * 3
def get_mini_batch(data, batch_size=16):# x: 16 * 12 *3# y :16 * 1 *3for i in range(0, len(data) - batch_size, batch_size):samples = data[i:i + batch_size]x, y = [], []for sample in samples:x.append(sample[0])y.append(sample[1])yield np.asarray(x), np.asarray(y)

3 模型搭建和训练

3.1 搭建模型

在处理多变量预测时,我们将lstm输出分别连接3个fc层,每个变量都单独计算loss,再把loss进行相加作为总的loss,示意图如下所示:
在这里插入图片描述

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
class LSTM(nn.Module):  # 注意Module首字母需要大写def __init__(self, hidden_size, num_layers, output_size, batch_size):super().__init__()self.hidden_size = hidden_size  # 隐含层神经元数目 100self.num_layers = num_layers  # 层数 通常设置为2self.output_size = output_size  # 48 一次预测下48个时间步self.num_directions = 1self.input_size = 3self.batch_size = batch_size# 初始化隐藏层数据self.hidden_cell = (torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device),torch.randn(self.num_directions * self.num_layers, self.batch_size, self.hidden_size).to(device))self.lstm = nn.LSTM(self.input_size, self.hidden_size, self.num_layers, batch_first=True).to(device)self.fc1 = nn.Linear(self.hidden_size, self.output_size).to(device)self.fc2 = nn.Linear(self.hidden_size, self.output_size).to(device)self.fc3 = nn.Linear(self.hidden_size, self.output_size).to(device)def forward(self, input):output, _ = self.lstm(torch.FloatTensor(input).to(device), self.hidden_cell)pred1, pred2, pred3 = self.fc1(output), self.fc2(output), self.fc3(output)pred1, pred2, pred3 = pred1[:, -1, :], pred2[:, -1, :], pred3[:, -1, :]pred = torch.stack([pred1, pred2, pred3], dim=2)return pred

3.2 训练模型

epochs = 200
for i in range(epochs):start = time.time()for seq_batch, label_batch in get_mini_batch(train_x_y, batch_size):optimizer.zero_grad()y_pred = model(seq_batch)loss = 0for j in range(3):loss += loss_function(y_pred[:,:, j], torch.FloatTensor(label_batch[:, :, j]).to(device))loss /= 3loss.backward()  # 调用loss.backward()自动生成梯度,optimizer.step()  # 使用optimizer.step()执行优化器,把梯度传播回每个网络# 查看模型训练的结果print(f'epoch:{i:3} loss:{loss.item():10.8f} time:{time.time() - start:6}')

3.3 预测模型

model.eval()
with torch.no_grad():model.hidden_cell = (torch.zeros(1 * num_layers, 1, hidden_size).to(device),torch.zeros(1 * num_layers, 1, hidden_size).to(device))# 测试集total_test_loss = 0test_pred = np.zeros(shape=(p, 3))for i in range(len(test_data)):x = train_data_scaler[-time_step:, :]x1 = np.expand_dims(x, 0)test_y_pred_scalar = np.expand_dims(model(x1).cpu().squeeze().numpy(), 0)  # 预测的值0-1train_data_scaler = np.append(train_data_scaler, test_y_pred_scalar, axis=0)y = test_y_pred_scalar * (max_data - min_data) + min_datatest_pred[i,:] = yx_in = list(range(len(test_pred)))

3.4 结果可视化

loss图像
在这里插入图片描述

最后3个变量的预测结果,看出能预测大体趋势,但是数据集质量不高,导致最后的结果不好,模型也需要继续优化。
在这里插入图片描述

完整代码和数据集,关注公众号:AI学习部 ,发送“时间序列”关键词获取。

http://chatgpt.dhexx.cn/article/ak19reFy.shtml

相关文章

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

Charles抓包web、手机、小程序配置

一、下载地址 二、web抓包 Charles Web抓包,启动Charles会自动与浏览器设置成代理,不需要进行过多的设置。接下来就是通过浏览器发送网络请求,Charles就会直接抓取到这些信息和响应信息。 1、抓取HTTPS协议 Charles配置 点击顶部菜单栏【He…

Charles抓包使用及常用问题

简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows,Mac,Linux上使用,安装Charles的时候要先装好Java环境。 …

Charles抓包显示<unknown>解决方案

上篇 &#xff1a;Charles抓包微信小程序数据 charles抓包会出现&#xff0c;请求前都加了锁&#xff0c;具体地址为<unknown>的情况。 解决<unknown>问题 首先电脑上需要安装charles&#xff0c;然后需要设置手机上的WiFi设置&#xff0c;修改配置中的代理设置&a…

charles抓包配置具体操作步骤

Charles主要功能 截取Http和Https网络封包 支持重发网络请求&#xff0c;方便后端调试 支持修改网络请求参数 支持网络请求的截获并动态修改 支持模拟慢速网络 Charles下载安装 charles下载地址&#xff1a;https://www.charlesproxy.com/download/ 注&#xff1a; 浏览…

Charles抓包https接口指南

Charles抓包https接口 作为一名iOS攻城狮&#xff0c;如果你没有听说过青花瓷这款软件&#xff0c;我只能说你还是回家洗洗睡吧。 最近在写一个需求&#xff0c;服务端不知道怎么设计接口。我只好找来了一个又类似功能的app&#xff0c;想要一睹芳容。于是主角Charles软件开始…

Charles抓包 - 手机

目的&#xff1a;抓IOS、Android端接口数据&#xff0c;保证IOS、Android和电脑在同一网络下&#xff1a; 1、首先需要将 Charles 的代理功能打开&#xff0c;在 Charles 的菜单栏上选择 “Proxy”–>“Proxy Settings”&#xff0c;填入代理端口 8888&#xff0c;并且勾上…

抓包工具-Charles

目录 1.环境搭建 2.Charles的界面&功能介绍 2.1提供两种封包视图&#xff1a;Structure和Sequence 2.2模拟网速 2.3重复发送请求 2.4修改服务器返回内容 2.4.1断点功能Breakpoints 2.4.2重写功能Rewrite 2.4.3重定向MAP&#xff08;后面在介绍&#xff09; 2.5修改…

Charles抓包微信小程序数据

本文中使用的是mac上的抓包工具charles进行抓包&#xff0c;手机是apple11。 Charles 上的设置&#xff1a; 要截取 iPhone 上的网络请求&#xff0c;我们首先需要将 Charles 的代理功能打开。 在 Charles 的菜单栏上选择 Proxy – Proxy Settings 点击进入如下界面 填入代…

【测试】Charles抓包

一、Charles 简介 Charles 是一款抓包软件&#xff0c;更专业&#xff0c;可以抓取电脑上所有软件发的包。 抓包原理&#xff1a;charles 自动创建了一个代理&#xff0c;发送数据都要经过代理&#xff0c;同时把所有 路过的数据全部展示出来。 Charles激活码计算器&#xff1…

如何使用Charles抓包,手机、电脑web端。Charles抓包看这一篇就够了

直接分步骤来讲了。 下载Charles&#xff1a; Charles下载地址 对软件进行常规操作&#xff1a; 一个好用的工具地址 打开网址之后&#xff0c;输入一个名称&#xff0c;然后点击“生成”即可。生成之后如下图&#xff1a; 安装软件就不多说了。装完之后打开&#xff0c;点击H…

抓包工具 之 Charles 的使用

目录 一、下载Charles 二、绿化Charles 1. 打开绿化网址 2. 生成注册码 3. 打开Charles 三、功能说明 四、代理设置 1. proxies 2. options 3. macOS 五、安装信任证书 1. 安装证书 2. 在钥匙串中找到证书 3. 双击设置信任 六、电脑接口代理开启 1. 开启 2. 问…

Charles 抓包工具教程(二) Charles 抓包HTTPS请求

本文为在霍格沃兹测试开发学社中学习到的一些技术&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ Charles 抓包HTTPS请求 一、MacOS 安装 Chares 证书二、Charles 设置 HTTPS 代理三、客户端(安卓手机)安装 Charles 证…

Charles抓包工具实战教程(完结)

Charles抓包工具测试实战教程 文章目录 Charles抓包工具测试实战教程学习准备目标文章介绍Charles介绍Charles是什么?Charles工作原理?Charles能做什么?Charles简介 Charles安装和配置Charles组件介绍Charles主导航栏介绍Charles代理配置Charles访问控制windows代理设置mac代…

charles抓包工具使用教程

声明&#xff1a;本文转载自https://www.cnblogs.com/Clairewang/p/Charles.html 一、Charles官网下载链接&#xff1a;https://www.charlesproxy.com/download/ 二、抓包步骤&#xff1a; 1、安装Charles&#xff0c;并打开 2、电脑设置代理端口&#xff1a;打开charles->…

手把手教你如何使用Charles抓包

目录 一、为什么使用charles 二、下载地址 三、web抓包 四、App抓包 五、Charles过滤 六、弱网测试 七、打断点篡改数据 八、修改请求数据 九、重复发送请求 一、为什么使用charles 前几天因为需要通过抓包定位问题&#xff0c;打开了尘封已久的fiddler&#xff0c;结…

charles抓包(别名:茶壶)

一、Charles简介 Charles 是PC端的一款网络抓包工具&#xff0c;在做移动开发时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。Charles 通过将自己设置成系统的网络访问代理服务器&#xff0c;使得所有的网络访问请求都通过它来完…

【干货】手把手教你如何使用Charles抓包

一、为什么使用charles 前几天因为需要通过抓包定位问题&#xff0c;打开了尘封已久的fiddler&#xff0c;结果打开软件后什么也干不了&#xff0c;别说手机抓包了&#xff0c;打开软件什么请求也抓不到。很多时候都是如此&#xff0c;如果一个方案不行&#xff0c;肯定要有替…

手把手教你Charles抓包工具使用

Charles简介 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器&#xff0c;当浏览器连接Charles的代理访问互联网时&#xff0c;Charles可以监控浏览器发送和接收的所有数据。它允许一个开发者查看所有连接互联网的HTTP通信&#xff0c;这些包括request, response和HTTP…

【数据挖掘】2022年2023届秋招知能科技公司机器学习算法工程师 笔试题

岗位&#xff1a;高级机器学习算法工程师 笔试时间&#xff1a;2022-9-28 1 简答题 1、神经网络中防止过拟合的方法 &#xff08;1&#xff09;降低模型复杂度 &#xff08;2&#xff09;正则化 &#xff0c;正则化正是通过在损失函数上添加额外的参数稀疏性惩罚项&#xf…