CNN-RNN混合回归预测Python代码
最后更新于:2026-07-06 00:06:19
- 使用波士顿房价预测作为演示案例。
- 可以设置 CNN 卷积通道数、卷积核宽度、最大池化窗口等结构参数。
- 可以在 RNN、LSTM、GRU、BiLSTM、BiGRU 五种循环网络结构之间快速切换。
- 可以快速划分训练集、验证集、测试集,并保证测试集只在模型训练完成后参与最终评价。
- 程序运行完后自动绘制训练集预测效果、测试集预测效果、训练/验证/测试散点图、MAE/RMSE/MAPE/R² 指标对比图、训练与验证损失曲线。
- 可自动计算 MAE、MSE、RMSE、MAPE、R² 等回归评价指标。
- 多种训练参数可设置,包括迭代次数、初始学习率、批尺寸、L2 正则、提前停止轮数等等。
- 可设置随机种子,保证每次运行的数据划分和训练结果尽量保持一致。
- 程序会自动检测 CPU 或 GPU;如果当前没有可用 GPU,则自动使用 CPU。
需要你做的基本只有导入数据和调参。
绝大多数流程都已经封装固化到 FunRegCNNRNN 函数中,仿照案例导入自己的数据,即可快速得到预测结果、评价指标和结果图。
需要注意的是,本程序适合“每条样本内部具有明确顺序”的一维数据,例如滑动时间窗、光谱波段、传感器序列等。波士顿房价数据主要用于演示代码调用流程;普通表格特征并不天然具有时间顺序,实际使用时应根据业务含义确认列顺序是否合理。
一、代码运行环境
运行环境推荐为:VSCode + Anaconda + PyTorch。
如果按照推荐环境配置,则代码基本可以下载即用。Python 版本建议使用 Python 3.11。
如果使用你现有的 Python 环境,需要安装依赖包。可以根据代码运行时报错内容逐个安装,也可以先安装 requirements.txt 中列出的依赖。
常用依赖包括:
pip install numpy matplotlib scikit-learn torch
如果需要使用 GPU 训练,请根据自己的 CUDA 版本安装对应的 PyTorch。没有 GPU 也可以运行,程序会自动使用 CPU。
二、程序介绍
程序文件
CNN_RNN_Regression/
├── demoCNNRNN_Regression.py
├── FunRegCNNRNN.py
├── requirements.txt
├── housing.txt
├── 代码说明.txt
└── figure/图1.png ... 图5.png
注:demoCNNRNN_Regression.py 是可以直接运行的演示脚本;FunRegCNNRNN.py 是函数库文件,通常由 demo 调用,不建议在没有输入变量的情况下直接运行。
1. demoCNNRNN_Regression.py 文件
使用波士顿城郊区域的房价数据集进行回归预测的演示案例,其中演示了 FunRegCNNRNN.py 文件中 FunRegCNNRNN 函数的应用方式。
文件可以直接运行。程序运行完成后,会在 figure 文件夹中自动保存如下图像:
训练集预测效果与误差分布图:

测试集预测效果与误差分布图:

训练集、验证集、测试集真实值与预测值散点图:

MAE、RMSE、MAPE、R² 等指标对比图:

训练与验证损失收敛曲线:

在命令行窗口还会打印出以下内容:
- 数据集样本数、特征维度、目标值范围;
- 当前使用的循环结构、卷积核数量、卷积核大小、池化窗口;
- 训练集、验证集、测试集划分数量;
- 当前计算设备(CPU 或 GPU);
- 训练过程中的训练损失、验证损失;
- 训练集、验证集、测试集上的 MAE、MSE、RMSE、MAPE、R² 等指标。
2. FunRegCNNRNN.py 文件
使用 CNN-RNN 混合网络进行回归预测的快速实现库文件,其中包含核心函数 FunRegCNNRNN。
函数说明如下:
def FunRegCNNRNN(X, Y, options=None):
"""
CNN-RNN 混合回归预测函数。
Parameters
----------
X : np.ndarray
[n_samples, sequence_length]。
每行必须是有序序列或有序位置;列顺序会影响结果。
Y : np.ndarray
[n_samples,] 连续回归目标。
options : dict, optional
参数字典,控制数据划分、网络结构、训练过程、归一化和绘图。
Returns
-------
foreData : 最终测试集预测值。
foreDataTrain : 训练集拟合值。
info : 模型、归一化器、索引、指标和训练过程。
"""
options 为字典类型,是使用这个函数时最常调整的部分。它把数据怎么划分、网络怎么搭、训练怎么停、结果要不要画图都集中到一起。常用设置如下:
options = {
'rTrain': 0.8,
'validationRatio': 0.15,
'networkType': 'LSTM',
'convChannels': 16,
'kernelSize': 3,
'poolSize': 2,
'rnnHidden': 32,
'epochs': 150,
'lr': 0.01,
'batchSize': 32,
'weightDecay': 1e-4,
'earlyStoppingPatience': 25,
'mapflag': True,
'figflag': True,
'shuffle': True,
'seed': 42
}
各字段含义如下:
| 参数 | 默认值 | 允许取值/范围 | 作用与调参影响 |
|---|---|---|---|
rTrain |
0.8 |
[0.5, 1) |
训练+验证数据比例,其余样本作为最终测试集。注意它不是纯训练集比例。 |
validationRatio |
0.15 |
(0, 0.5) |
验证集占训练+验证数据的比例,用于早停和观察泛化,不参与参数更新。 |
shuffle |
True |
True/False |
划分前是否打乱样本。独立样本可打乱;严格时间序列通常应先构造滑动窗口,再按时间顺序切分。 |
seed |
42 |
非负整数 | 随机种子。固定整数便于复现实验,设为 0 表示不固定随机性。 |
networkType |
'LSTM' |
'RNN'/'LSTM'/'GRU'/'BiLSTM'/'BiGRU' |
循环层类型。RNN 最简单,LSTM 较稳,GRU 参数较少,双向结构会同时读正反两个方向。 |
convChannels |
16 |
正整数 | 一维卷积通道数。越大可提取更多局部模式,但训练更慢、更容易过拟合。 |
kernelSize |
3 |
正奇数 | 一维卷积核宽度。越大表示一次观察更宽的相邻区域;太大可能抹掉局部细节。 |
poolSize |
2 |
[1, 序列长度] |
最大池化窗口。设为 1 基本等价于不池化;越大压缩越强,可能丢失细节。 |
rnnHidden |
32 |
正整数 | 循环层隐藏单元数。越大记忆容量越强,但训练更慢,也更容易过拟合。 |
epochs |
150 |
正整数 | 最大训练轮数。实际训练可能因为早停提前结束。 |
lr |
0.01 |
正数 | Adam 初始学习率。太大容易震荡,太小收敛慢。 |
batchSize |
32 |
正整数 | 批尺寸。小批次波动更大,大批次更稳定但占显存/内存。 |
weightDecay |
1e-4 |
非负数 | L2 正则系数。适当增大可抑制过拟合,过大可能欠拟合。 |
earlyStoppingPatience |
25 |
非负整数 | 验证损失连续不改善的容忍轮数。设为 0 表示关闭早停。 |
mapflag |
True |
True/False |
是否执行 Min-Max 归一化。建议开启;开启时只用训练集拟合归一化器。 |
figflag |
True |
True/False |
是否自动绘图并保存到 figure 文件夹。批量调参时可设为 False。 |
其中,networkType 支持五种取值:
options['networkType'] = 'RNN' # 普通循环网络
options['networkType'] = 'LSTM' # LSTM,默认设置
options['networkType'] = 'GRU' # GRU,结构相对精简
options['networkType'] = 'BiLSTM' # 双向 LSTM
options['networkType'] = 'BiGRU' # 双向 GRU
函数内部会自动完成:
- 输入参数检查;
- 训练集、验证集、测试集划分;
- 仅使用训练集拟合
MinMaxScaler,再应用到验证集和测试集; - CNN-RNN 模型构建;
- 模型训练、验证集提前停止和最佳权重恢复;
- 测试集预测;
- MAE、MSE、RMSE、MAPE、R² 指标计算;
- 结果图自动保存。
3. _CNNRNN 类
_CNNRNN 是 FunRegCNNRNN.py 内部定义的 PyTorch 网络类,结构为:
Conv1d → ReLU → 可选 MaxPool1d → RNN/LSTM/GRU → Linear
一般用户不需要直接调用这个类,只需要通过 FunRegCNNRNN 函数设置参数即可。
4. EvaRegEffect 函数
用于评价回归预测效果的通用函数,可以计算 MAE、MSE、RMSE、MAPE、R² 等指标。
def EvaRegEffect(realData, foreData, indNames):
"""
输入:
- realData:真实值
- foreData:预测值
- indNames:拟计算的指标名称列表
当前支持:
- MAE、MSE、RMSE、MAPE、R2
输出:
- 指标结果数组,其顺序与 indNames 一一对应
"""
例如:
indNames = ['MAE', 'MSE', 'RMSE', 'MAPE', 'R2']
ind = EvaRegEffect(realData, foreData, indNames)
5. housing.txt 文件
波士顿房价演示数据集,共 506 条样本。前 13 列为输入特征,第 14 列为房价目标值。
6. requirements.txt 文件
记录 Python 代码运行所需的主要依赖包。建议在新环境中先安装依赖,再运行演示脚本。
7. figure 文件夹
程序运行后自动生成的结果图会保存在该文件夹中。
三、快速开始
1. 环境配置
推荐使用 Anaconda 创建 Python 3.11 环境,然后安装 PyTorch、NumPy、Matplotlib、scikit-learn 等依赖。
如果使用 CPU 运行,可以直接安装 CPU 版 PyTorch。若使用 GPU,请根据 CUDA 版本安装对应的 PyTorch。
在代码目录中可先尝试:
pip install -r requirements.txt
如果环境中缺少某些包,按报错提示补装即可。
2. 运行测试脚本
先在 VSCode 或命令行中打开下载好的文件夹,进入 Python 代码目录:
cd Python/CNN_RNN_Regression
python demoCNNRNN_Regression.py
程序运行完毕后,如果没有报错,并且 figure 文件夹中正常生成上述 5 张图像,则说明运行环境正常,程序可以使用。
3. 替换成你自己的数据
复制一份 demoCNNRNN_Regression.py,在副本中修改第一部分的数据导入代码。
演示案例中使用的是:
data = np.loadtxt('housing.txt')
X = data[:, :13]
Y = data[:, 13]
替换成自己的数据时,需要整理出两个变量:
X = ... # 输入数据,形状为 [样本数, 有序序列长度]
Y = ... # 输出目标,形状为 [样本数,]
注意,X 的列方向会被程序当作一维序列。若你的数据是时间序列预测任务,建议先在外部构造滑动窗口,再把每个窗口作为一行输入。
4. 调整网络与训练参数
参照脚本文件中 options 字典,根据需要调整相关参数。例如:
options['networkType'] = 'LSTM'
options['convChannels'] = 16
options['kernelSize'] = 3
options['poolSize'] = 2
options['rnnHidden'] = 32
options['epochs'] = 150
options['lr'] = 0.01
options['batchSize'] = 32
options['seed'] = 42
如果想比较不同循环结构,只需修改 networkType,并在相同数据划分下比较验证集和测试集指标。
5. 运行程序
数据导入和参数设置完成后,运行脚本即可。程序会自动训练模型、生成预测结果、计算评价指标并保存结果图。
剩下的主要工作就是调参。调参通常需要一定耐心,建议每次只改少量参数,并记录验证集和测试集指标变化。
四、关于完整版与公开版代码
| 功能 | 完整版 | 公开版 |
|---|---|---|
| 数据导入、参数设置 | √ | √ |
| 软件全部源码(py 文件) | √ | × |
| 核心函数加密 | × | √,核心函数为 .pyd 文件 |
| 数据长度限制 | 无限制 | 100 个样本以内 |
| 结果图水印 | 无水印 | 有“试用版@khsci.com/docs”水印 |
| 自动绘制训练集/测试集预测图 | √ | √ |
| 自动绘制散点图、指标图、损失曲线 | √ | √ |
| 支持 RNN/LSTM/BiLSTM/GRU/BiGRU 切换 | √ | √ |
| 导出测试集预测结果、训练集预测结果、模型和训练信息 | √ | 受限 |
| 修改核心算法细节 | √ | × |
公开版随包 housing.txt 固定为 100 条样本,主要用于验证运行环境和调用流程。完整版不限制样本数,且包含可编辑源码。
五、获取公开版程序(需使用电脑浏览器打开)
公开版程序可以直接下载,用于测试运行环境和体验完整调用流程。
注:公开版代码建议使用 Python 3.11 版本的 conda 环境。公开版限制为 100 个样本以内,生成图片带水印,核心函数已加密。
六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)
点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式。付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、完整版代码重要更新
20260621 完成初版代码。
八、常见问题
Q1:报错 ModuleNotFoundError 怎么办?
说明当前环境缺少对应依赖包。可先执行:
pip install -r requirements.txt
如果仍有缺失包,再根据报错提示单独安装。
Q2:没有 GPU 能不能运行?
可以。程序会自动检测当前环境,GPU 不可用时会使用 CPU 运行。只是训练速度可能慢一些。
Q3:这个程序是不是只能做时间序列预测?
不是。它本质上是“有序一维输入到连续数值输出”的回归预测程序。只有当输入行表示历史时间窗口,并且目标值表示未来某一时刻时,才属于时间序列预测。光谱估计、传感器序列回归等任务也可以使用。
Q4:我想换成自己的数据,最少需要改哪里?
最少只需要改 demoCNNRNN_Regression.py 中的数据导入部分,把自己的输入整理为 X,输出整理为 Y,然后根据需要调整 options 参数。