CNN_LSTM-CNN–LSTM 混合
CNNLSTM-CNN–LSTM 混合 模块是一个面向时序数据的混合深度学习组件,支持回归与分类两类任务。系统先对输入特征执行编码、缺失值删除与可选缩放,再通过滑动窗口构造序列样本;随后,利用一维卷积网络提取局部时序模式,再将卷积后的序列特征送入 LSTM 以建模较长时间依赖,…
CNN_LSTM-CNN–LSTM 混合
1. 方法概述
CNN_LSTM-CNN–LSTM 混合 模块是一个面向时序数据的混合深度学习组件,支持回归与分类两类任务。系统先对输入特征执行编码、缺失值删除与可选缩放,再通过滑动窗口构造序列样本;随后,利用一维卷积网络提取局部时序模式,再将卷积后的序列特征送入 LSTM 以建模较长时间依赖,最后通过输出层完成数值预测或类别判别。
与前面的 BiLSTM 模块类似,该系统不单独选择时间列,而是默认输入数据的行顺序已经按照时间先后排列。因此,时序结构由数据行顺序和窗口切片共同决定。
设整理后的样本为
$$ \mathcal{D}=\{(x_t,y_t)\}_{t=1}^{N},\quad x_t\in\mathbb{R}^{d},\ y_t\in\mathcal{Y} \tag{1} $$
其中 \(x_t\) 为第 \(t\) 个时点的特征向量,\(y_t\) 为目标变量;回归任务中 \(\mathcal{Y}\subseteq\mathbb{R}\),分类任务中 \(\mathcal{Y}\) 为有限类别集合。
2. 数据预处理与序列构造
2.1 特征编码与缺失值处理
当 scale_method 取 standard 或 minmax 时,模块会先对非数值特征执行 One-Hot 编码。对类别变量 \(x_{tj}\) 的第 \(k\) 个类别,其编码分量可写为
$$ x_{tj}^{(k)}= \begin{cases} 1,& x_{tj}=\mathrm{cat}_k\\ 0,& \text{otherwise} \end{cases} \tag{2} $$
若 scale_method=none,则程序仅保留数值型特征,非数值列会被直接剔除。编码完成后,系统将特征矩阵与目标列拼接,并删除任一字段存在缺失值的样本行。
2.2 缩放方式
当 scale_method=standard 时,特征标准化为
$$ x_{tj}^{*}=\frac{x_{tj}-\mu_j}{\sigma_j} \tag{3} $$
当 scale_method=minmax 时,特征按区间缩放为
$$ x_{tj}^{*}=\frac{x_{tj}-\min(x_j)}{\max(x_j)-\min(x_j)} \tag{4} $$
在回归模式下,若 scale_target=True,目标变量还会做标准化:
$$ y_t^{*}=\frac{y_t-\mu_y}{\sigma_y} \tag{5} $$
最终评价时,系统会把预测值与测试目标逆变换回原始量纲后,再计算 RMSE、MAE 与 \(R^2\)。
2.3 滑动窗口序列
设窗口长度为 \(L\),预测步长为 \(H\)。对任意可用起点 \(i\),输入序列张量定义为
$$ \mathbf{X}_i= \begin{bmatrix} x_i^{*}\\ x_{i+1}^{*}\\ \vdots\\ x_{i+L-1}^{*} \end{bmatrix} \in\mathbb{R}^{L\times d'} \tag{6} $$
对应的监督目标为
$$ z_i=y_{i+L+H-1} \tag{7} $$
因此,可构造的有效序列样本数为
$$ M=N'-L-H+1 \tag{8} $$
其中 \(N'\) 为删除缺失值后的样本量。程序要求 \(M\ge 10\),否则会认为有效序列过少而停止分析。
2.4 按时间顺序切分训练集与测试集
系统按前段训练、后段测试的方式进行时序切分。若测试比例为 \(\rho\in(0,1)\),则
$$ M_{\text{train}}=\left\lfloor (1-\rho)M \right\rfloor,\qquad M_{\text{test}}=M-M_{\text{train}} \tag{9} $$
当前实现还将测试集直接作为 validation_data 传入训练阶段,用于可选的早停监控。
3. CNN-LSTM 混合结构
3.1 因果卷积特征提取
对第 \(f\) 个卷积核,在时间步 \(t\) 处的因果卷积输出可写为
$$ c_t^{(f)}=\sigma\!\left(\sum_{u=0}^{K-1} {w_u^{(f)}}^\top x_{t-u}^{*}+b^{(f)}\right) \tag{10} $$
其中 \(K\) 为卷积核大小,卷积采用 padding="causal",因而 \(c_t^{(f)}\) 只依赖当前及历史时刻信息,不使用未来观测。
3.2 池化操作
若池化尺寸为 \(P\),则对卷积输出序列执行最大池化:
$$ p_s^{(f)}=\max\left\{c_{(s-1)P+1}^{(f)},\ c_{(s-1)P+2}^{(f)},\ \ldots,\ c_{sP}^{(f)}\right\} \tag{11} $$
当 pool_size>1 时,序列长度会被压缩。程序会检查池化后的有效长度是否仍然至少为 1,以避免卷积层数和池化尺度组合导致序列坍缩。
3.3 LSTM 时序建模
卷积与池化后的特征序列继续送入单向 LSTM 层。其门控更新形式为
$$ \begin{aligned} i_t&=\sigma(W_i p_t+U_i h_{t-1}+b_i)\\ f_t&=\sigma(W_f p_t+U_f h_{t-1}+b_f)\\ \tilde c_t&=\tanh(W_c p_t+U_c h_{t-1}+b_c)\\ o_t&=\sigma(W_o p_t+U_o h_{t-1}+b_o)\\ c_t&=f_t\odot c_{t-1}+i_t\odot \tilde c_t\\ h_t&=o_t\odot \tanh(c_t) \end{aligned} \tag{12} $$
LSTM 最终输出 \(h_T\) 作为卷积特征序列的全局时序表示。
3.4 全连接映射
若 dense_units>0,则系统在 LSTM 后接一个 ReLU 全连接层:
$$ u_i=\mathrm{ReLU}(W_d h_T+b_d) \tag{13} $$
若 dense_units=0,则直接使用 \(h_T\) 进入输出层。训练过程中,卷积层后和全连接层后均可按设定比例加入 Dropout。
4. 输出层与训练目标
4.1 回归模式
回归任务的输出层为线性层,可写为
$$ \hat z_i=w^\top u_i+b \tag{14} $$
训练损失采用均方误差:
$$ \mathcal{L}_{\mathrm{reg}}=\frac{1}{M_{\text{train}}}\sum_{i=1}^{M_{\text{train}}}(z_i-\hat z_i)^2 \tag{15} $$
4.2 二分类模式
当训练集类别数不超过 2 时,输出层采用 Sigmoid 激活:
$$ p_i=\sigma(w^\top u_i+b) \tag{16} $$
对应的二元交叉熵损失为
$$ \mathcal{L}_{\mathrm{bin}}=-\frac{1}{M_{\text{train}}}\sum_{i=1}^{M_{\text{train}}}\left[z_i\ln p_i+(1-z_i)\ln(1-p_i)\right] \tag{17} $$
4.3 多分类模式
当训练集类别数大于 2 时,输出层采用 Softmax:
$$ P(y_i=c\mid \mathbf{X}_i)=\frac{\exp(w_c^\top u_i+b_c)}{\sum_{k=1}^{C}\exp(w_k^\top u_i+b_k)} \tag{18} $$
对应的稀疏交叉熵损失为
$$ \mathcal{L}_{\mathrm{multi}}=-\frac{1}{M_{\text{train}}}\sum_{i=1}^{M_{\text{train}}}\ln P(y_i=z_i\mid \mathbf{X}_i) \tag{19} $$
在 TensorFlow 可用的主路径中,程序使用 TensorFlow/Keras 构建 Conv1D + MaxPooling1D + LSTM + Dense 网络,并通过 Adam 优化器最小化上述损失函数;若运行环境缺少 TensorFlow,代码会退化为 sklearn.neural_network 的 MLPClassifier/MLPRegressor 后备实现。
5. 评价指标与输出结果解释
5.1 回归指标
回归任务输出 rmse、mae 与 r2。其定义分别为
$$ \mathrm{RMSE}=\sqrt{\frac{1}{M_{\text{test}}}\sum_{i=1}^{M_{\text{test}}}(y_i-\hat y_i)^2} \tag{20} $$
$$ \mathrm{MAE}=\frac{1}{M_{\text{test}}}\sum_{i=1}^{M_{\text{test}}}|y_i-\hat y_i| \tag{21} $$
$$ R^2=1-\frac{\sum_{i=1}^{M_{\text{test}}}(y_i-\hat y_i)^2}{\sum_{i=1}^{M_{\text{test}}}(y_i-\bar y)^2} \tag{22} $$
5.2 分类指标
分类任务输出 accuracy、f1_macro 与 f1_weighted。准确率定义为
$$ \mathrm{Accuracy}=\frac{1}{M_{\text{test}}}\sum_{i=1}^{M_{\text{test}}}\mathbf{1}(\hat y_i=y_i) \tag{23} $$
第 \(c\) 类的 F1 值定义为
$$ F1_c=\frac{2P_cR_c}{P_c+R_c} \tag{24} $$
其中 \(P_c\) 与 \(R_c\) 分别表示该类的精确率与召回率。宏平均 F1 与加权 F1 分别为
$$ F1_{\mathrm{macro}}=\frac{1}{C}\sum_{c=1}^{C}F1_c \tag{25} $$
$$ F1_{\mathrm{weighted}}=\sum_{c=1}^{C}\frac{n_c}{\sum_{k=1}^{C}n_k}F1_c \tag{26} $$
5.3 输出结果说明
程序会导出以下结果对象:
原始数据:原始输入表;处理后数据:编码、缩放并删除缺失后的特征与目标;模型指标:回归或分类评价指标;训练历史:训练损失与验证损失;预测结果:测试样本位置索引、真实值与预测值;混淆矩阵:分类任务输出;参数:模型结构与训练参数;图表清单:导出图表路径。
对应图表包括:
loss_curve:训练/验证损失曲线;pred_vs_true:回归任务真实值与预测值对比;residual_hist:回归残差直方图;confusion_matrix:分类混淆矩阵热力图。
6. 算法流程
按照当前项目实现,CNN_LSTM-CNN–LSTM 混合 模块的计算流程如下:
- 读取 Excel/CSV 数据,并由用户选择目标列与特征列;
- 根据缩放方式执行 One-Hot 编码或仅保留数值特征;
- 删除缺失值,并保留清洗后的有序样本;
- 对特征做
standard、minmax或none缩放;回归任务可选择对目标标准化; - 根据
window_size与horizon构造监督序列样本; - 按时间顺序划分训练集与测试集;
- 依次构建卷积层、池化层、LSTM 层、可选全连接层与输出层;
- 使用 Adam 优化器训练模型,并可基于验证损失启用早停;
- 在测试集上计算指标、导出预测结果、训练历史和图表文件。
7. 关键参数说明
表 1 关键参数及含义
| 参数 | 含义 | 当前实现 |
|---|---|---|
task |
任务类型 | classification 或 regression |
feature_cols |
输入特征列 | 至少选择 1 列,且不能包含目标列 |
target_column |
目标列 | 必选 |
window_size |
窗口长度 \(L\) | 界面范围 2 至 200,默认 12 |
horizon |
预测步长 \(H\) | 界面范围 1 至 50,默认 1 |
conv_layers |
卷积层数 | 界面范围 1 至 4,默认 1 |
conv_filters |
每层卷积核数 | 界面范围 4 至 256,默认 32 |
kernel_size |
卷积核大小 | 界面范围 1 至 15,默认 3 |
pool_size |
池化尺寸 | 界面范围 1 至 10,默认 2 |
lstm_units |
LSTM 单元数 | 界面范围 4 至 512,默认 64 |
dense_units |
全连接层单元数 | 界面范围 0 至 512,默认 32 |
dropout |
Dropout 比例 | 界面范围 0.0 至 0.9,默认 0.1 |
learning_rate |
Adam 学习率 | 默认 0.001 |
epochs |
训练轮数 | 界面范围 1 至 500,默认 50 |
batch_size |
批大小 | 界面范围 4 至 512,默认 32 |
test_size |
测试集比例 | 界面范围 0.05 至 0.5,默认 0.2 |
random_state |
随机种子 | 界面范围 0 至 99999,默认 42 |
scale_method |
特征缩放方式 | standard、minmax、none |
scale_target |
是否缩放回归目标 | 仅回归任务有效 |
shuffle_train |
训练时是否打乱 | 默认 False |
early_stopping |
是否启用早停 | 默认 True |
patience |
早停耐心轮数 | 默认 10 |
8. 论文写作模板
8.1 方法描述模板
可在论文“方法部分”中写为:
“本文采用 CNN-LSTM 混合网络对时序样本进行建模。首先,对输入特征执行编码、缺失值清洗与缩放处理,并以长度为 \(L\) 的滑动窗口构造序列样本,将第 \(H\) 个未来时点的目标值作为监督信号。其次,利用一维因果卷积提取局部时间模式,并通过池化操作压缩特征长度;随后,将卷积后的特征序列输入 LSTM 网络,以捕捉更长跨度的时序依赖关系,并通过全连接层完成高层特征映射。最后,根据任务类型分别采用线性输出或分类输出,并以均方误差或交叉熵损失函数进行训练,在测试集上使用回归指标或分类指标评价模型性能。”
8.2 结果解释模板
结果部分可写为:CNN-LSTM 先抽取局部卷积模式,再建模长程时序依赖,因此适合解释为“局部特征提取与序列记忆相结合”的预测框架。若预测曲线能够较好贴合波动区间,说明混合结构在局部模式与长期依赖之间取得了较好平衡。
8.3 表格标题模板
表题可写为:CNN-LSTM 混合模型预测结果与性能指标汇总表。
8.4 图表题注模板
图注可写为:CNN-LSTM 模型真实值与预测值对比曲线。
8.5 表格示例
建议列名:时间点、真实值、预测值、残差、RMSE、MAE、\(R^2\) 或分类评价指标。
9. 实现说明与注意事项
- 该模块适用于样本行顺序已经反映时间先后的序列数据;若原始表未按时间排序,应在导入前先完成排序。
- 卷积层使用
causal填充,因此模型在卷积阶段不会使用未来信息;但池化和窗口长度设置必须与序列长度协调,否则会因池化后长度过短而无法训练。 - 当前实现将测试集同时作为验证集参与早停监控;若用于严格论文实验,建议在外部另行划分独立验证集和最终测试集。
- 若运行环境缺少 TensorFlow,代码会自动退化为
sklearn.neural_network的MLPClassifier/MLPRegressor后备模型,并将序列样本展平后训练。因此,论文写作若宣称采用 CNN-LSTM,应确认实验运行时实际使用的是 TensorFlow 后端。 预测结果表中的index为序列目标在清洗后数据中的位置编号,而非独立时间戳;若论文中需要时间轴图示,应自行将该索引映射回原始时间字段。- 真实实现主链路位于
core/cnn_lstm_calculator.py与ui/results_widget.py。前者负责训练、预测、混淆矩阵/回归指标、Excel 导出;后者负责结果页展示、另存副本和repro_*.py自动生成。 - 实际
results/目录中会保留本次运行的 xlsx、图表和repro_inputs/。复现脚本命名模式为repro_<safe_app>_<timestamp>.py,复现输出文件命名模式为<safe_app>_results_<timestamp>_repro.xlsx。 - 当前实现写出的工作表包括
原始数据、处理后数据、模型指标、训练历史、预测结果、混淆矩阵、参数、图表清单。因此论文中若描述“模型结果表结构”,应以图表清单而不是泛化成别的图表 sheet 名。 - 当前固定输出图表文件为
loss_curve.png、pred_vs_true.png、residual_hist.png。这些路径会被同步写入图表清单,适合在论文图注或附录中直接引用。 ui/results_widget.py中结果页实际包含“结果预览、模型指标、训练历史、预测结果、混淆矩阵”等 tab,这说明程序层面的展示逻辑本身就是按“概览-指标-明细-图表”的顺序组织的,可直接转化为论文结果章节结构。
10. 论文写作建议
论文中建议强调该模型是“局部时序模式提取 + 长期依赖建模”的混合结构。结果部分最好同时展示卷积-循环混合模型的测试性能和预测对比图,并在方法部分说明实际运行后端是否为 TensorFlow 主实现。如果运行时发生后备退化,则不能继续把实验结果写成 CNN-LSTM。
11. 单篇终审补充
11.1 图题与表题对齐建议
原始数据表可写为:表X CNN-LSTM 原始输入数据。处理后数据表可写为:表X CNN-LSTM 编码与缩放后的特征数据。模型指标表可写为:表X CNN-LSTM 测试集性能指标汇总。训练历史表可写为:表X CNN-LSTM 训练过程损失历史。预测结果表可写为:表X CNN-LSTM 测试集预测结果明细。混淆矩阵表可写为:表X CNN-LSTM 分类混淆矩阵。参数表可写为:表X CNN-LSTM 参数设置与训练配置。图表清单表可写为:表X CNN-LSTM 图表索引与文件路径。loss_curve.png建议写为:图X CNN-LSTM 训练损失曲线。pred_vs_true.png建议写为:图X CNN-LSTM 真实值与预测值对比图。residual_hist.png建议写为:图X CNN-LSTM 残差分布图。
11.2 终审说明
- 该模块存在明确的 TensorFlow 主后端与 sklearn
MLP*后备分支。只有在 TensorFlow 实际可用时,论文才能把实验结果写成 CNN-LSTM;如果走了 fallback,只能如实写成展平窗口上的 MLP 后备实现。 图表清单是真实 sheet 名,不是图表索引。正文若引用结果文件结构,应保持这个命名口径。- 当前结果表仍以测试集表现为主,没有额外导出训练集预测/验证集预测表,因此论文里不要扩写成“训练、验证、测试三阶段预测结果全量对照”。
seed_strategy在代码中已写明包含python+numpy+tensorflow(seed)/fallback_sklearn(random_state),若论文需要复现实验,应注明运行环境和后端分支,否则同名算法结果口径可能不一致。
11.3 全量强化补充
本次全量强化优先绑定的主 UI 结果目录为 具体的算法3/深度学习与时序网络/CNN_LSTM-CNN–LSTM 混合/results/window2_cnn_lstm_ui_test_cnn_lstm_ui_flow_offscree0。该目录内主工作簿为 cnn_lstm_ui.xlsx,实际工作表为 原始数据、处理后数据、模型指标、训练历史、预测结果、混淆矩阵、参数、图表清单。这与前文终审说明一致,说明当前 UI 主结果口径稳定落在这 8 个 sheet 上。
同一目录下 cnn_lstm_ui_plots/ 内可直接核验 loss_curve.png、pred_vs_true.png、residual_hist.png。此外,该目录还是一个典型的“UI 主结果 + 多轮 repro 结果池”:其中存在多份 CNN_LSTM-CNN–LSTM_混合_results_*_repro.xlsx 与对应 *_repro_plots/,例如 CNN_LSTM-CNN–LSTM_混合_results_20260329_170831_repro.xlsx 的工作表集合与主工作簿一致,其图目录中同样有 loss_curve.png、pred_vs_true.png、residual_hist.png。
目录内 repro_inputs/cnn_lstm_window2_sample.csv 真实存在,所选 repro 脚本 repro_CNN_LSTM-CNN–LSTM_混合_20260329_170831.py 当前写法为 INPUT_FILE = 'repro_inputs/cnn_lstm_window2_sample.csv'、OUTPUT_FILE = 'CNN_LSTM-CNN–LSTM_混合_results_20260329_170831_repro.xlsx',并显式绑定 epochs = 2、random_state = 42、target_column = 'y'、window_size = 8。同时主工作簿 参数 页中也真实写入 seed_strategy = 'python+numpy+tensorflow(seed)/fallback_sklearn(random_state)'。因此,这篇文档应继续明确区分“主 UI 工作簿”与“多轮 repro 再生产物池”,而不是把整个目录误写成单次静态实验目录。
12. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/深度学习与时序网络/CNN_LSTM-CNN–LSTM 混合/results/window2_cnn_lstm_ui_test_cnn_lstm_ui_flow_offscree0。 - 正文应围绕
原始数据、处理后数据、模型指标、训练历史、预测结果、混淆矩阵、参数、图表清单来写。 - 图证应对应
loss_curve.png、pred_vs_true.png、residual_hist.png,并把 TensorFlow 主后端和 fallback 分支区分开。 - 复现脚本应按
repro_CNN_LSTM-CNN–LSTM_*.py + repro_inputs/cnn_lstm_window2_sample.csv的口径说明。