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/ 文件夹下保存如下图像。

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

图 2 展示单步预测模式下测试集真实值与预测值的对比,以及对应的相对误差。
2. demoCNNRNNsForecastMul.py 文件
该脚本演示 CNN-RNN 混合模型的多步递归预测流程。多步递归预测会先预测测试段第一个点,再把预测值放回历史窗口,继续预测第二个点,直到完成整段测试数据。
脚本调用:
fore_data, fore_data_train, fore_data_val, model, info = FunCNNRNNsForecastMul(data, options)
Python 多步版采用“基准值 + 模型残差”的方式进行递归预测:模型不直接死记完整数值,而是学习相对季节基准或最近点的修正量,这样可以减轻多步预测中的漂移问题。

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

图 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 信息 | √ | 部分受限 |
| 适合正式项目和二次修改 | √ | 仅适合体验流程 |
公开版主要用于确认运行环境、查看程序调用方式和体验基本流程。正式项目建议使用完整版。
五、获取公开版程序
注:公开版代码包含演示脚本、示例数据和运行所需文件。公开版最多支持 100 个时间点,最大训练轮数为 50,结果图带有试用版水印;目前适用于 Windows 64 位 + Python 3.11 环境。
六、获取完整版程序
点击本页面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式。本通道处于测试阶段,付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、完整版代码重要更新
- 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² 不高怎么办?
多步递归预测比单步预测更难。可以优先检查数据周期性,尝试调整 lookBack、seasonPeriod、residualScale、networkType、rnnHidden、lr,也可以增加训练数据量。
Q6:可以换成自己的 Excel 或 CSV 数据吗?
可以。先用 pandas、numpy 或 scipy 读取数据,再整理成一维数值序列即可。建议先处理缺失值、异常值和非数值内容。