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

_CNNRNNFunRegCNNRNN.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 条样本,主要用于验证运行环境和调用流程。完整版不限制样本数,且包含可编辑源码。

五、获取公开版程序(需使用电脑浏览器打开)

公开版程序可以直接下载,用于测试运行环境和体验完整调用流程。

公开版下载:
点击此处下载 CNN-RNN 混合回归预测 Python 公开版代码

注:公开版代码建议使用 Python 3.11 版本的 conda 环境。公开版限制为 100 个样本以内,生成图片带水印,核心函数已加密。

六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)

点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式。付款完成后刷新一下本页面即可看到下载链接。

(注意支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 69.5元 才能查看此处内容!立即支付

七、完整版代码重要更新

20260621 完成初版代码。

八、常见问题

Q1:报错 ModuleNotFoundError 怎么办?

说明当前环境缺少对应依赖包。可先执行:

pip install -r requirements.txt

如果仍有缺失包,再根据报错提示单独安装。

Q2:没有 GPU 能不能运行?

可以。程序会自动检测当前环境,GPU 不可用时会使用 CPU 运行。只是训练速度可能慢一些。

Q3:这个程序是不是只能做时间序列预测?

不是。它本质上是“有序一维输入到连续数值输出”的回归预测程序。只有当输入行表示历史时间窗口,并且目标值表示未来某一时刻时,才属于时间序列预测。光谱估计、传感器序列回归等任务也可以使用。

Q4:我想换成自己的数据,最少需要改哪里?

最少只需要改 demoCNNRNN_Regression.py 中的数据导入部分,把自己的输入整理为 X,输出整理为 Y,然后根据需要调整 options 参数。