CNN-RNN时间序列预测Python代码

最后更新于:2026-07-19 21:14:32

本文介绍一套 Python 版 CNN-RNN 混合时间序列预测代码。程序以 chickenpox.mat 中的一维月度时间序列作为演示案例,封装了单步预测和多步递归预测两个入口,适合用于一维有序数据的趋势预测、周期预测和连续数值预测。

  • 使用 chickenpox 月度时间序列数据作为演示案例。
  • 可以自由设置滑动窗口长度、CNN 卷积层通道数、卷积核大小、池化窗口、RNN 类型和隐藏单元数。
  • Python 版 RNN 层支持 RNN、LSTM、GRU、BiLSTM、BiGRU 五种结构。
  • 可按时间顺序快速划分训练+验证数据、验证集、测试集,避免数据泄露。
  • 程序运行后自动绘制收敛过程、训练集预测结果、验证集预测结果、测试集预测结果、测试段递归预测图、MAE/MSE/MAPE/RMSE/R²/R 等指标对比图。
  • 支持 CPU/GPU 自动选择,也可以手动指定训练设备。
  • 需要你做的主要是导入自己的时间序列、设置窗口长度、网络结构和训练参数。

一、代码运行环境

推荐运行环境为:VSCode + Anaconda + Python 3.11 + PyTorch。

如果使用现有环境,需要安装依赖包。完整版代码中提供了 requirements.txt,可在代码文件夹中执行:

pip install -r requirements.txt

主要依赖包括:

numpy
scipy
matplotlib
torch
scikit-learn

公开版目前适用于 Windows 64 位 + Python 3.11 环境,建议使用对应版本运行。

二、程序介绍

完整版代码文件结构如下:

CNN_RNNs_Forecast/
├── demoCNNRNNsForecast.py
├── demoCNNRNNsForecastMul.py
├── FunCNNRNNsForecast.py
├── FunCNNRNNsForecastMul.py
├── EvaForeEffect.py
├── chickenpox.mat
├── requirements.txt
├── figure/
└── 代码说明.txt
1. demoCNNRNNsForecast.py 文件

该脚本演示 CNN-RNN 混合模型的单步时间序列预测流程。所谓单步预测,就是用前 lookBack 个历史点预测紧接着的下一个点;测试阶段每个样本仍然使用真实历史窗口作为输入。

脚本主要完成三件事:加载 chickenpox.mat 数据,设置 options 参数,然后调用:

fore_data, fore_data_train, fore_data_val, model, info = FunCNNRNNsForecast(data, options)

程序运行完成后,会自动在 figure/ 文件夹下保存如下图像。

Python 单步预测收敛过程

图 1 展示训练损失和验证损失的变化。程序会监控验证损失,并在长期没有改善时触发早停。

Python 单步测试集预测结果

图 2 展示单步预测模式下测试集真实值与预测值的对比,以及对应的相对误差。

2. demoCNNRNNsForecastMul.py 文件

该脚本演示 CNN-RNN 混合模型的多步递归预测流程。多步递归预测会先预测测试段第一个点,再把预测值放回历史窗口,继续预测第二个点,直到完成整段测试数据。

脚本调用:

fore_data, fore_data_train, fore_data_val, model, info = FunCNNRNNsForecastMul(data, options)

Python 多步版采用“基准值 + 模型残差”的方式进行递归预测:模型不直接死记完整数值,而是学习相对季节基准或最近点的修正量,这样可以减轻多步预测中的漂移问题。

Python 多步递归测试结果

图 3 展示测试段多步递归预测效果。它比单步预测更难,因为后续输入会包含模型自己前面预测出来的值。

Python 评价指标对比

图 4 展示训练集、验证集和测试集上的 MAE、MSE、RMSE、MAPE、R²、R 等指标,用于判断模型泛化表现。

3. FunCNNRNNsForecast.py 文件

该文件包含单步预测核心函数。

fore_data, fore_data_train, fore_data_val, model, info = FunCNNRNNsForecast(data, options)

输入参数说明:

  • data:一维有序时间序列,可以是 list、tuple、numpy 数组等可迭代数据。
  • options:参数字典,可不传。不传时使用默认参数。

输出参数说明:

  • fore_data:测试集预测值。
  • fore_data_train:训练集预测值。
  • fore_data_val:验证集预测值。
  • model:训练好的 PyTorch 模型。
  • info:训练过程、数据划分、归一化参数、评价指标等信息。

options 逐项说明如下。

参数名 默认值 含义与调参说明
lookBack 12 滑动窗口长度,表示用前多少个点预测下一个点。窗口太短容易漏掉周期,太长会增加训练难度。
rTrain 0.8 训练+验证数据占原始序列的比例。后面剩余部分作为测试集。
validationRatio 0.15 在训练+验证数据中再切出多少作为验证集。
shuffle True 是否打乱训练窗口的 mini-batch 顺序。不会改变时间顺序切分。
seed 42 随机种子。设为 0 可取消固定随机性。
networkType 'LSTM' RNN 层类型,可选 'RNN''LSTM''GRU''BiLSTM''BiGRU'
convChannels 16 1D CNN 卷积输出通道数。越大可表达的局部模式越多,但过拟合风险更高。
kernelSize 3 1D 卷积核大小,必须为正奇数。
poolSize 2 最大池化窗口。设为 1 表示不池化。
rnnHidden 32 RNN 隐藏单元数。越大模型容量越强,训练时间和过拟合风险也越高。
dropoutProb 0.1 Dropout 概率,取值范围 [0,1)
epochs 200 最大训练轮数。
batchSize 32 小批量大小。
lr 0.005 初始学习率。过大容易震荡,过小收敛慢。
weightDecay 1e-4 权重衰减,也就是 L2 正则化系数。
gradClip 1.0 梯度裁剪阈值,用于避免训练不稳定。
patience 30 早停容忍轮数。验证损失连续多轮不改善时提前停止。
learnRateSchedule 'piecewise' 学习率调度方式,可选 'piecewise''none'
learnRateDropPeriod 50 分段学习率下降周期。
learnRateDropFactor 0.5 学习率下降系数。
mapflag True 是否归一化。建议开启;程序只使用训练集拟合归一化参数。
figflag True 是否绘制结果图。设为 True 时,每张结果图会分别弹出,并自动保存到 figure/ 文件夹;设为 False 时不绘图也不保存。
deviceSel 'auto' 训练设备,可选 'auto''cpu''gpu''auto' 会优先使用可用 GPU。
4. FunCNNRNNsForecastMul.py 文件

该文件包含多步递归预测核心函数。

fore_data, fore_data_train, fore_data_val, model, info = FunCNNRNNsForecastMul(data, options)

它的大部分参数与单步版一致,区别在于测试段采用递归滚动预测,而且模型默认学习“相对基准的残差”。

多步版额外参数如下。

参数名 默认值 含义与调参说明
baselineMode 'seasonal' 递归预测时的基准方式,可选 'seasonal''last''seasonal' 适合有周期的数据,'last' 适合更接近随机游走的序列。
seasonPeriod None 季节周期。为 None 时默认等于 lookBack。月度数据常用 12。
residualScale 1 模型残差缩放比例,也可以设为 'auto' 让程序根据验证集自动估计。多步预测漂移明显时可适当调小。
5. EvaForeEffect.py 文件

该文件用于计算预测评价指标。

ind = EvaForeEffect(realData, foreData, indNamesCell)

输入参数:

  • realData:真实值。
  • foreData:预测值。
  • indNamesCell:需要计算的指标名称,例如 ['MAE','MSE','RMSE','MAPE','R2','R']

输出参数:

  • ind:各指标计算结果,顺序与 indNamesCell 一一对应。
6. chickenpox.mat 文件

示例数据文件,包含一条一维月度时间序列。实际使用时,可以替换成自己的 Excel、CSV、TXT、MAT 等数据,只要最后整理为一维数值序列即可。

7. requirements.txt 文件

记录 Python 运行依赖。建议在新环境中先执行:

pip install -r requirements.txt
8. figure 文件夹

程序运行后自动生成,里面保存收敛图、训练集预测图、验证集预测图、测试集预测图、多步递归预测图和指标对比图。完整版图像无水印,公开版图像带有试用版水印。

9. 代码说明.txt 文件

简要说明代码文件组成、运行入口和注意事项。

三、快速开始

1. 安装依赖

在代码文件夹中打开命令行,执行:

pip install -r requirements.txt
2. 运行测试脚本

运行单步预测 demo:

python demoCNNRNNsForecast.py

运行多步递归预测 demo:

python demoCNNRNNsForecastMul.py

程序正常运行后,会在命令行窗口打印训练过程、数据划分和评价指标,并在 figure/ 文件夹中保存结果图。

3. 替换成自己的数据

复制一个 demo 脚本副本,在副本中修改数据加载部分即可。只要最终得到一维序列:

data = your_data.reshape(-1)

然后保持后面的函数调用不变。

时间序列预测不建议随机抽取最后测试集。程序默认按时间顺序切分:前面一段用于训练和验证,最后一段作为测试集,这样更接近真实预测场景。

4. 调整常用参数

最常改的参数通常是:

options = {
    'lookBack': 12,
    'networkType': 'LSTM',
    'convChannels': 16,
    'rnnHidden': 32,
    'epochs': 200,
    'lr': 0.005,
    'figflag': True,
    'deviceSel': 'auto',
}

如果做多步递归预测,还可以重点调整:

options = {
    'baselineMode': 'seasonal',
    'seasonPeriod': 12,
    'residualScale': 1,
}

当多步预测曲线漂移明显时,可以尝试把 residualScale 调小,或者设置为 'auto',让程序根据验证集自动估计残差缩放比例。

四、关于完整版与公开版代码

功能 完整版 公开版
单步时间序列预测
多步递归时间序列预测
示例数据与 demo 脚本
核心函数源码 提供 不提供
自动保存结果图
结果图水印 无水印 试用版@khsci.com/docs 水印
数据长度限制 无限制 最多 100 个时间点
最大训练轮数 无限制 最多 50 轮
可导出训练好的模型、预测结果和 info 信息 部分受限
适合正式项目和二次修改 仅适合体验流程

公开版主要用于确认运行环境、查看程序调用方式和体验基本流程。正式项目建议使用完整版。

五、获取公开版程序

公开版下载: 点击此处下载 CNN-RNN 时间序列预测 Python 公开版代码

注:公开版代码包含演示脚本、示例数据和运行所需文件。公开版最多支持 100 个时间点,最大训练轮数为 50,结果图带有试用版水印;目前适用于 Windows 64 位 + Python 3.11 环境。

六、获取完整版程序

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

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

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

七、完整版代码重要更新

  • 20260719:结果图改为弹窗显示并同步保存;多步版采用季节基准与残差学习,支持用 residualScale 控制递归修正强度,减缓预测漂移。
  • 20260717:完成 CNN-RNN 时间序列预测 Python 版初版代码,包含单步预测、多步递归预测、自动画图和评价指标。

八、常见问题

Q1:这个代码做的是回归、分类还是时间序列预测?

这是时间序列预测代码,本质输出是连续数值,因此也属于回归预测的一种。它不是分类代码。

Q2:单步预测和多步递归预测有什么区别?

单步预测每次使用真实历史窗口预测下一个点;多步递归预测会把前一步预测值放回窗口继续预测后续点。多步递归更接近真实未来预测,但误差也更容易累积。

Q3:为什么公开版要求 Python 3.11?

公开版目前按照 Windows 64 位 + Python 3.11 环境制作并完成测试,因此请使用对应版本运行。

Q4:GPU 不是必须的吗?

不是必须。deviceSel 默认为 'auto',如果检测不到可用 GPU,会自动使用 CPU。数据量不大时 CPU 也可以运行。

Q5:多步预测测试集 R² 不高怎么办?

多步递归预测比单步预测更难。可以优先检查数据周期性,尝试调整 lookBackseasonPeriodresidualScalenetworkTypernnHiddenlr,也可以增加训练数据量。

Q6:可以换成自己的 Excel 或 CSV 数据吗?

可以。先用 pandas、numpy 或 scipy 读取数据,再整理成一维数值序列即可。建议先处理缺失值、异常值和非数值内容。