尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LSTM、GRU、RNN三模型时间序列预测实战:含数据集与训练模型

LSTM、GRU、RNN三模型时间序列预测实战:含数据集与训练模型 简介本资源面向计算机、人工智能、数据科学及通信物联网等专业的在校学生、教师与企业员工提供一套基于LSTM、GRU、RNN三种循环神经网络的时间序列预测Python实现方案可用于课程设计、毕业设计、大作业或初期项目立项演示也适合作为深度学习入门与进阶的实践参考。压缩包共15个文件约5.83MB包含3个py源码文件、2个pt模型权重、3个xlsx与1个csv数据集以及xml、iml等工程配置文件覆盖从数据读取、模型训练到保存预测的完整流程并附带各地区月平均温度、风电等真实数据样例。目前已有240人学习下载。读者可借此对比三种网络结构在时间预测任务上的差异理解训练与保存模型的代码组织方式并基于现有工程进行二次开发替换数据集或调整网络层以适配其他预测场景具备较高的学习借鉴与复用价值。1. 三套循环网络跑同一份气温数据这个压缩包到底能省你多少事如果你正在做时间序列预测的课程设计或毕设大概率绕不开 LSTM、GRU、RNN 这三个模型。单独找一份能跑的 LSTM 时间序列预测 python 源码不难难的是把三种网络放在同一份数据上做对比还要有现成的数据集和训练好的模型文件。这个压缩包解决的正是这件事它把 LSTM、GRU、RNN 三种循环网络的训练与预测代码整合在一个脚本里附带各地区月平均温度、风电数据集等多份 CSV 和 Excel还直接给了两个训练好的.pt模型文件。适合谁计算机、人工智能、数据科学方向的在校学生做课程设计或大作业也适合刚接触 pytorch lstm 源码、想拿一份能跑通的代码来改的入门者。它不是一个框架也不是生产级工具而是一份结构清晰、能快速复现的学习型工程。2. 拆开压缩包目录结构与三套模型的代码组织2.1 从文件树看这份资源的真实构成拿到压缩包先别急着运行把目录结构看清楚能省掉后面很多返工。解压后大致是这样一个布局00Data/ 各地区每月平均温度.csv 1月.xlsx 月平均气温(landocean)1850-2022.10.xlsx 风电数据集.xlsx .idea/ misc.xml modules.xml 研究生阶段代码集合.iml inspectionProfiles/ profiles_settings.xml 03Save_Model/ Model_LSTM时间序列预测.pt Model_LSTM时间序列预测1.pt 04Code/ 1.py Time series prediction.py TrainSave_model(Time series based on LSTM_RNN_GRU).py00Data是数据层四份文件覆盖了不同粒度的时间序列各地区每月平均温度.csv是典型的月度单变量序列适合做 LSTM 时间序列预测 python 的入门实验月平均气温(landocean)1850-2022.10.xlsx跨度超过一百七十年能用来测试模型在长序列上的表现风电数据集.xlsx则是多变量场景功率输出受风速、风向等多个因素影响适合验证 GRU 和 RNN 在多特征输入下的差异。03Save_Model里两个.pt文件是 PyTorch 的模型权重说明作者至少跑通过 LSTM 的训练流程并做了持久化。04Code是核心三个脚本各有分工1.py通常是快速验证脚本Time series prediction.py负责加载已有模型做推理TrainSave_model(Time series based on LSTM_RNN_GRU).py是训练主脚本文件名直接点明了它同时覆盖 LSTM、RNN、GRU 三种网络结构。.idea目录是 PyCharm 的项目配置不影响代码运行但说明作者是在 PyCharm 里开发的。这里有个血泪经验项目路径里不要带中文.idea里的配置在中文路径下容易出编码问题解压后重命名为英文路径再打开。2.2 三个脚本的职责划分与调用关系理解脚本之间的调用关系比逐行读代码更重要。TrainSave_model(Time series based on LSTM_RNN_GRU).py是入口它做了四件事读数据、做归一化和滑窗、定义三种网络结构、训练并保存模型。Time series prediction.py是下游它加载03Save_Model里的.pt文件对同一份数据做预测并画图。1.py更像一个草稿本可能是作者调试某个环节时留下的最小可运行片段。常见做法是先跑训练脚本生成自己的.pt再用预测脚本加载。但压缩包里已经给了两个训练好的模型你可以跳过训练直接跑预测先看到结果再回头理解训练过程。这种「先见结果、再拆过程」的顺序对新手更友好。提示如果只想快速看到预测效果先运行Time series prediction.py确认环境和依赖没问题再去碰训练脚本。2.3 数据文件的格式差异与读取方式四份数据文件的格式不统一这是实际工程里很常见的情况。.csv用pandas.read_csv直接读.xlsx需要openpyxl或xlrd引擎。各地区每月平均温度.csv大概率是「地区、月份、温度」三列结构需要先做透视或筛选出单个地区的序列。风电数据集.xlsx可能是多列时间戳加多列特征读取后要检查是否有缺失值和异常值。import pandas as pd # 读取 CSV 格式的月度温度数据 df_temp pd.read_csv(00Data/各地区每月平均温度.csv, encodingutf-8) print(df_temp.head()) print(df_temp.columns.tolist()) # 读取 Excel 格式的风电数据集指定引擎避免报错 df_wind pd.read_excel(00Data/风电数据集.xlsx, engineopenpyxl) print(df_wind.shape) print(df_wind.isnull().sum()) # 检查缺失值分布这段代码先确认列名和数据类型再检查缺失情况。参数encodingutf-8在 Windows 上如果报UnicodeDecodeError换成gbk试一次。engineopenpyxl是读.xlsx的常见做法如果装的是旧版xlrd会读不了新格式的 Excel。读取之后不要急着喂给模型先看df.describe()了解数值范围温度数据一般在 -30 到 40 之间风电功率可能在 0 到额定值之间量纲差异大的特征不做归一化会让训练很难收敛。3. 把 LSTM、GRU、RNN 塞进同一个训练脚本参数怎么设3.1 三种循环单元的结构差异与选型理由RNN 是最基础的循环结构每个时间步的隐藏状态由当前输入和上一步隐藏状态共同决定。它的问题是长序列上梯度容易消失或爆炸导致学不到远处的依赖。LSTM 引入输入门、遗忘门、输出门三个门控机制外加一个细胞状态能有选择地记住和遗忘信息适合捕捉长距离依赖。GRU 是 LSTM 的简化版把三个门合并成更新门和重置门两个参数更少、训练更快在很多任务上效果和 LSTM 接近。选型上没有绝对答案。序列较短、算力有限时 GRU 往往是性价比最高的选择序列很长、依赖关系复杂时 LSTM 的门控更精细RNN 更多是作为基线用来对比另外两个到底提升了多少。这个压缩包把三者放在同一个脚本里目的就是让你在同一份数据上跑出三条曲线做对比而不是只跑一个模型交差。3.2 滑窗构造与归一化时间序列预测的前处理时间序列预测的核心是把一维序列切成「输入窗口 → 预测目标」的样本对。假设用过去 12 个月预测下 1 个月滑窗步长为 1那么每个样本的输入是连续 12 个值标签是第 13 个值。归一化用 MinMaxScaler 把数据缩到 [0,1]因为 LSTM 内部的 sigmoid 和 tanh 激活函数对输入范围敏感不归一化会导致梯度更新不稳定。import numpy as np from sklearn.preprocessing import MinMaxScaler def create_sequences(data, seq_len): 把一维序列切成 (输入窗口, 标签) 的样本对 xs, ys [], [] for i in range(len(data) - seq_len): x data[i:i seq_len] # 过去 seq_len 个时间步 y data[i seq_len] # 下一个时间步作为标签 xs.append(x) ys.append(y) return np.array(xs), np.array(ys) # 假设 raw 是单列温度值shape 为 (N, 1) scaler MinMaxScaler(feature_range(0, 1)) scaled scaler.fit_transform(raw) SEQ_LEN 12 # 用过去 12 个月预测第 13 个月 X, y create_sequences(scaled, SEQ_LEN) print(X.shape, y.shape) # 例如 (N-12, 12, 1) 和 (N-12, 1)seq_len是最关键的超参数。设太小模型看不到足够的上下文设太大样本数减少且训练变慢。月度数据一般取 12 的倍数风电这种高频数据可能取 24 或 48。create_sequences返回的X是三维张量(样本数, 时间步, 特征数)这是 PyTorch LSTM 的标准输入格式特征数为 1 表示单变量多变量时对应列数。归一化器要保存下来因为预测结果需要inverse_transform还原回原始量纲否则画出来的曲线和真实值对不上。3.3 训练脚本里的关键参数与模型保存训练脚本里几个参数直接决定能不能跑通和跑得好。input_size等于特征数单变量就是 1hidden_size是隐藏层维度常见取值 32、64、128太小欠拟合、太大过拟合且慢num_layers是堆叠层数一般 1 到 2 层够用output_size是预测步数预测下 1 个月就是 1。学习率常用 0.001 配合 Adam 优化器损失函数用 MSELoss。import torch import torch.nn as nn class LSTMRegressor(nn.Module): def __init__(self, input_size1, hidden_size64, num_layers1, output_size1): super().__init__() self.lstm nn.LSTM(input_size, hidden_size, num_layers, batch_firstTrue) self.fc nn.Linear(hidden_size, output_size) def forward(self, x): # x: (batch, seq_len, input_size) out, _ self.lstm(x) # out: (batch, seq_len, hidden_size) out out[:, -1, :] # 取最后一个时间步的隐藏状态 return self.fc(out) model LSTMRegressor(input_size1, hidden_size64, num_layers1, output_size1) criterion nn.MSELoss() optimizer torch.optim.Adam(model.parameters(), lr0.001) # 训练循环伪代码按实际 DataLoader 调整 # for epoch in range(EPOCHS): # for xb, yb in dataloader: # pred model(xb) # loss criterion(pred, yb) # optimizer.zero_grad() # loss.backward() # optimizer.step() # 保存模型权重 torch.save(model.state_dict(), 03Save_Model/Model_LSTM时间序列预测.pt)batch_firstTrue让输入维度按(batch, seq_len, feature)排列和 pandas 处理后的数据对齐不加这个参数就得手动转置。out[:, -1, :]取最后一个时间步是因为预测目标只关心序列末尾的汇总信息。保存用state_dict()而不是整个模型对象这样加载时只要重新实例化结构再load_state_dict即可跨环境兼容性更好。GRU 和 RNN 的写法几乎一样把nn.LSTM换成nn.GRU或nn.RNN注意 RNN 的forward返回值格式略有不同只有out没有(h, c)元组。3.4 加载已有模型做推理与结果还原Time series prediction.py的流程是重建模型结构 → 加载.pt权重 → 对测试集做前向传播 → 反归一化 → 画对比图。这里最容易翻车的是模型结构必须和保存时完全一致hidden_size、num_layers对不上就会报size mismatch。# 重建结构必须与训练时一致 model LSTMRegressor(input_size1, hidden_size64, num_layers1, output_size1) model.load_state_dict(torch.load(03Save_Model/Model_LSTM时间序列预测.pt)) model.eval() with torch.no_grad(): pred_scaled model(X_test_tensor).numpy() # 反归一化还原到原始温度量纲 pred scaler.inverse_transform(pred_scaled) true scaler.inverse_transform(y_test)model.eval()会关闭 dropout 和 batch norm 的训练行为推理时必须加。torch.no_grad()省显存也加速。反归一化这一步很多人忘掉结果画出来的预测值全在 0 到 1 之间和真实温度差了几十度还以为是模型没训好。4. 环境配置与运行排查那些让你卡半天的坑4.1 依赖版本与 Python 环境这份代码依赖 PyTorch、pandas、numpy、scikit-learn、matplotlib、openpyxl。PyTorch 的安装要匹配你的 CUDA 版本没有 GPU 就用 CPU 版。常见做法是建一个虚拟环境避免和系统里的包冲突。python -m venv venv # Windows venv\Scripts\activate # Linux / macOS source venv/bin/activate pip install torch pandas numpy scikit-learn matplotlib openpyxl如果pip install torch下载慢可以指定国内镜像源。装完之后在 Python 里import torch; print(torch.__version__)确认版本。pandas 和 numpy 的版本不要差太远否则可能出现A value is trying to be set on a copy of a DataFrame之类的警告甚至报错。4.2 路径、编码与中文文件名问题项目正文里特别强调了「项目名字和项目路径不要用中文」这不是客套话。.idea里的配置、torch.save的路径、pd.read_csv的文件名只要有一处带中文在部分 Windows 环境下就会触发编码错误。解压后把整个文件夹重命名为英文比如time_series_lstm_gru_rnn再打开。另外TrainSave_model(Time series based on LSTM_RNN_GRU).py这个文件名里有和括号在某些 shell 里直接命令行运行会被解析成特殊字符。用 IDE 的运行按钮或者给文件名加引号。4.3 避坑清单五个真实会遇到的报错现象一ModuleNotFoundError: No module named torch原因虚拟环境没激活或者装到了另一个 Python 解释器下。 解决确认which pythonLinux/macOS或where pythonWindows指向虚拟环境再重新pip install torch。现象二RuntimeError: Expected hidden[0] size (1, batch, 64), got (1, batch, 32)原因加载.pt时重建的hidden_size和训练时不一致。 解决打开训练脚本确认hidden_size的实际值把推理脚本里的参数改成一样。压缩包里给了两个.pt可能对应不同的hidden_size分别试。现象三预测曲线是一条直线原因忘了反归一化或者模型根本没训练收敛损失没降下来。 解决先检查scaler.inverse_transform有没有调用再看训练时的 loss 曲线是否下降。如果 loss 一直不降把学习率调小到 0.0001 或增大hidden_size。现象四UnicodeDecodeError: utf-8 codec cant decode byte原因CSV 文件实际是 GBK 编码用 utf-8 读不了。 解决pd.read_csv(path, encodinggbk)或者用chardet检测编码后再读。现象五Excel 读取报ImportError: Missing optional dependency openpyxl原因没装 openpyxl或者 xlrd 版本太旧读不了.xlsx。 解决pip install openpyxl读的时候显式指定engineopenpyxl。注意遇到报错先看最后一行Python 的 traceback 最后一行才是真正的错误类型上面的调用栈只是定位位置。5. 从能跑到好用多变量输入与预测步长扩展把单变量跑通之后真正体现这份资源价值的是往多变量和长预测步长上改。风电数据集就是现成的多变量场景输入不只是历史功率还可以加入风速、风向、温度等列。改法是input_size从 1 变成特征列数create_sequences里对多列同时滑窗。# 多变量选取功率、风速、风向三列 features df_wind[[power, wind_speed, wind_dir]].values scaler MinMaxScaler() scaled scaler.fit_transform(features) # 按列归一化 def create_multi_sequences(data, seq_len, target_col0): xs, ys [], [] for i in range(len(data) - seq_len): xs.append(data[i:i seq_len, :]) # 所有特征 ys.append(data[i seq_len, target_col]) # 只预测功率 return np.array(xs), np.array(ys) X, y create_multi_sequences(scaled, seq_len24) # X.shape: (N-24, 24, 3) input_size 应设为 3target_col0表示只把功率作为预测目标其他列作为辅助输入。input_size要改成 3模型定义里的nn.LSTM(3, hidden_size, ...)对应调整。多变量归一化必须按列做fit_transform会自动处理但反归一化时只还原目标列不能把整个矩阵还原后取一列因为缩放系数不同。预测步长扩展是另一个常见需求。上面都是预测下 1 步改成预测下 3 步只需把output_size设为 3标签从单值变成连续 3 个值。这时create_sequences的ys要取data[iseq_len : iseq_len3]损失函数仍是 MSELoss输出维度对齐即可。验证模型好坏别只看一条预测曲线。我一般会算三个指标MAE 看平均绝对误差RMSE 对大误差更敏感MAPE 看百分比误差。温度数据 MAPE 在 5% 以内算不错风电功率波动大10% 到 15% 也常见。把这三个指标打印出来比肉眼看曲线靠谱得多。从那以后我每次拿到一份时间序列代码都强制先跑通单变量、确认反归一化正确、再动多变量和步长这三步顺序乱了就要花几倍时间排查。希望帮到你。本文还有配套的精品资源点击获取
返回列表