实验五:基于堆叠集成的LSTM模型开发

实验目的:

- 理解堆叠集成(Stacked Ensemble)策略的原理,即通过集成多个子模型提升总体预测性能。认识集成学习在降低模型方差、提高泛化能力方面的作用。

- 掌握构建由两个LSTM子模型组成的堆叠集成模型的方法。学习如何训练多个模型并将其预测结果加权或融合,形成最终输出,提高预测准确度和稳健性。

- 比较集成模型与单一模型的性能差异,体会在复杂任务中通过集成策略可以进一步逼近误差极限。掌握评估集成效果的方法(如对比误差指标、观察预测曲线平滑度等)。

- 将项目中的关键创新思路“双LSTM集成架构”融入教学实验,使学生接触前沿研究技术并了解其实现细节。

实验资源要求:

- 数据: 与前述实验相同的训练和测试数据。可沿用实验四训练好的模型作为子模型初始版本(也可重新训练以保证公平比较)。

- 软件环境: Python 3.x,PyTorch深度学习框架。可使用scikit-learn辅助实现元模型融合(如线性回归融合子模型输出),但也可自行编码融合逻辑。Matplotlib用于结果可视化。

- 计算环境: 高性能计算设备。需要训练至少两个深度学习模型,计算量较前增加。如果有条件,可并行训练两个LSTM以节省时间。

实验时长: 約4小时

实验内容: 本实验实现项目提出的堆叠集成预测模型,即使用两个LSTM模型协同预测乘员舱温度。根据项目技术方案,堆叠模型包含两个并行的LSTM子模型。每个子模型擅长处理时间序列数据的不同方面,整合它们的输出可以进一步提升预测精度。学生将亲手构建这一架构,体验先进模型设计思想。

首先,需要确定两个子模型的差异化定位。可以考虑令模型A和模型B在架构或训练数据上有所不同,以保证它们产生的预测误差不完全相关,从而集成有提升空间。例如:模型A使用较多隐藏单元(更复杂,擅长拟合全局趋势),模型B使用较少隐藏单元(更简单,泛化性好),二者形成互补;或者模型A以较长时间窗T_A作为输入,模型B以较短时间窗T_B作为输入,一个侧重长期趋势一个侧重短期细节。出于教学简化,也可以不在结构上做过多区分,仅通过不同初始权重训练出两个性格不同的LSTM。同学们可自由尝试这些策略,核心是确保子模型之间存在差异,从而“众人拾柴”提高集成性能。

图1 测试段曲线对比(真实 vs A/B vs 最优加权集成)

接下来同时训练模型A和模型B。可以按实验四确定的最佳超参数配置训练它们,或者针对各自结构微调参数。训练过程与之前类似,但需要分别保存两个模型。在训练完成后,对每个模型在验证集上评估,记录各自的误差指标(例如模型A的MAE_a,模型B的MAE_b)。通常,两模型单独性能可能相近但各有千秋,如模型A在降温初期误差更小,模型B在稳态段更精确。正是这些细微差异为集成提供了改进空间。

图2 残差互补性(eA vs eB 散点,显示负相关特征)

实现集成预测有多种方法。本项目采用堆叠融合,即用某种方式结合两个模型输出形成最终输出。简单且有效的方法是取加权平均:ypred=αyA+(1α)yBy_{pred} = \alpha \cdot y_{A} + (1-\alpha) \cdot y_{B},权重α可根据验证集表现确定(如给误差较小的模型更高权重)。另一种更高级方法是训练一个元模型:以两个模型的预测值为输入,真实值为输出,训练一个线性回归或小型神经网络来学组合。例如用线性回归拟合:ytrue=β0+β1yA+β2yBy_{true} = \beta_0 + \beta_1 y_A + \beta_2 y_B,学得的β\beta系数即可作为融合权重(这种方法在验证集上优化融合效果,但需注意避免过拟合)。本实验建议学生先尝试简单平均融合,看能否提升性能;若提升有限,再尝试用验证集学得最优加权融合。根据PLOS One研究报道,堆叠平均模型在温度预测中优于单一LSTM模型, 这验证了集成策略的有效性。

图3 验证集融合权重搜索(MSE 随 α 变化,含 α* 标记)

在融合策略确定后,让两个子模型在测试集上各自预测,然后按照融合规则计算最终预测。对比集成预测与单模型预测的误差和曲线:预期集成模型的误差指标将低于任一子模型单独的误差,预测曲线可能更平滑、更接近真实。例如,如果模型A有时略高估而模型B略低估,平均后结果更贴近真实值。这种误差相互抵消的现象凸显了集成的价值。学生将在结果中体会到,即使每个模型都已相对优化,集成仍能带来可观改进,是提升逼近误差目标的重要途径。

实验步骤:

1. 子模型配置与初始化

目标: 明确子模型差异化定位与可比对的控制变量,确保残差具有足够互补性,为后续集成提供“可利用的多样性”。

操作要点

  • 差异化设计维度(至少选其二):

    • 容量差异:模型A hidden_size=100,模型B hidden_size=80;必要时为 B 采用较小的 projection(如 nn.Linear(H, h_proj))以形成偏置空间差异。

    • 时间窗差异:T_A=90s,T_B=45s;A 更擅长期趋势,B 更擅短期扰动。改变窗口长度时重新生成监督样本,并保证切分一致(仅历史可见,防泄漏)。

    • 正则与归一化差异:A 轻正则(dropout=0.1,weight_decay=1e-5),B 稍强正则(dropout=0.25,weight_decay=5e-5)。

    • 输入特征子集:A 使用完整特征集;B 去除与 cabin_temp 高度共线的次要特征(或加入分段相位标签),形成归纳偏差差异。

  • 统一控制变量: 训练/验证/测试切分、目标定义、损失口径、优化器类型等保持一致,以便对比明确归因。

  • 初始化策略:

    • 不同随机种子(如 A: 42,B: 137),且使用 Kaiming/Orthogonal 初始化;

    • 可额外对 A 的初始偏置加入“趋稳段轻微过估”先验,对 B 加“初期轻微滞后”先验(在输出头 bias 层实现),以放大可解释差异。

  • 张量维与接口核验:

    • XARNA×TA×FAXARNA×TA×FAXA∈RNA×TA×FAX_A\in\mathbb{R}^{N_A\times T_A\times F_A}XBRNB×TB×FBXBRNB×TB×FBXB∈RNB×TB×FBX_B\in\mathbb{R}^{N_B\times T_B\times F_B}

    • 明确 mask/weights 的形状与广播规则(若使用缺失掩码或样本加权)。

质量门控(Gate):

  • 两模型在验证集的残差相关系数 ρ(eA,eB)\rho(e_A,e_B) 不高于 0.6,且在关键阶段(冷启动/趋稳)存在符号相反的系统偏差迹象(例如 A 在后段偏高、B 偏低)。

  • 产出:config_A.yaml、config_B.yaml、seed_manifest.txt、sample_shapes.json。

2. 分别训练模型A和B

目标: 在相同评估协议下,获得两条可对比的学习曲线与“最佳验证点”权重,确保每个子模型都到达其合理收敛。

操作要点

  • 训练协议(建议):

    • 优化器:Adam(lr=5e-4 起步),梯度裁剪(clip_grad_norm_=1.0),batch_size 保持一致(如 64)。

    • 学习率调度:Cosine/OneCycle 二选一;A 使用 Cosine(温和),B 使用 OneCycle(快速起步)以形成学习动力学差异。

    • 早停:监控 val MSE,patience=10,min_delta=1e-4;保存 best 与 last 两份权重。

  • 日志与可视化:

    • 分别使用 runs/A/*、runs/B/* 记录;训练/验证损失、学习率曲线、梯度范数分位数(P50/P95);每 10 epoch 固定一段验证子序列输出“真实 vs 预测”对比图。

  • 收敛与稳定性检查:

    • 验证损失曲线先降后稳或轻微反弹即早停触发;

    • 若出现发散/NaN:自动回退 lr 一档并重试,同时记录 failures.log。

  • 验证集指标与阶段化统计:

    • 报告 MSE/MAE/MaxAE 与分阶段指标(0–300s 冷启动、快速降温、趋稳段)。

    • 计算偏置方向(均值残差)与斜率误差(回归估计降温斜率的偏差)。

质量门控(Gate):

  • A、B 的 val MSE 均不劣于各自随机初值重启的均值 + 1σ;

  • 各自 gen_gap = val_min - train_min 在可接受范围(如 < 0.05)或有正则解释;

  • 产出:modelA_best.ckpt、modelB_best.ckpt、training_curves_A/B.csv、val_metrics_A/B.json。

3. 验证集融合权重确定

目标: 在不泄漏测试信息前提下,基于验证集学习最合适的融合方案;先易后难,逐级增强。

操作要点

  • 简单平均(基线):yens=0.5yA+0.5yBy^ens=0.5y^A+0.5y^By^ens=0.5 y^A+0.5 y^B\hat y_{\text{ens}}=0.5\,\hat y_A+0.5\,\hat y_B

  • 误差反比分配(无约束快速法):

α=eBeA+eB,yens=αyA+(1α)yB,α=eBeA+eB,y^ens=αy^A+(1α)y^Bα=eBeA+eB,y^ens=αy^A+(1−α)y^B,\alpha=\frac{e_B}{e_A+e_B},\quad \hat y_{\text{ens}}=\alpha \hat y_A + (1-\alpha)\hat y_B,

其中 eA,eBe_A,e_B 可取验证集 MSE 或 MAE(推荐 MSE,与训练损失同口径)。

  • 线性元模型(OLS Stacking):

    • 验证集构造设计矩阵 X=[1,yA,yB]X=[1,y^A,y^B]X=[1,y^A,y^B]X=[\mathbf{1},\hat y_A,\hat y_B],目标 yvalyvalyvaly_{\text{val}}

    • 最小二乘求解 β=[β0,β1,β2]β=[β0,β1,β2]β=[β0,β1,β2]\beta=[\beta_0,\beta_1,\beta_2]

    • 可选约束β1,β20,β1+β2=1β1,β20, β1+β2=1β1,β2≥0, β1+β2=1\beta_1,\beta_2\ge 0,\ \beta_1+\beta_2=1(转化为非负加权与凸组合,避免过拟合外推);

    • 交叉验证版 stacking:在验证集内部做分块(时间阻塞)CV,求平均系数,降低偶然性。

  • α 扫描曲线与最优点:遍历 α[0,1]α[0,1]α∈[0,1]\alpha\in[0,1](步长 0.01),绘制 val MSE(α),确定 α\alpha并与 OLS 系数做一致性比较(若差异很 大,复核是否过拟合)。

  • 多样性/互补性量化(用于解释融合收益):

    • 残差相关 ρ(eA,eB)ρ(eA,eB)ρ(eA,eB)\rho(e_A,e_B)、Q-statistic、分阶段的协方差;

    • 歧义分解(ambiguity decomposition):MSEens=MSEdiversitygainMSEens=MSEdiversity_gainMSEens=MSE‾−diversity_gain\text{MSE}_{\text{ens}}=\overline{\text{MSE}}-\text{diversity\_gain}

质量门控(Gate):

  • MSEens,valmin(MSEA,val,MSEB,val)MSEens,valmin(MSEA,val,MSEB,val)MSEens,val≤min⁡(MSEA,val,MSEB,val)\text{MSE}_{\text{ens,val}}\le \min(\text{MSE}_{A,\text{val}},\text{MSE}_{B,\text{val}})

  • 若 OLS 比 α* 好幅度 < 1%,优先选 α*(更简单、鲁棒)。

产出: alpha_search.csv、alpha_star.json、stacking_coefficients.json(含是否约束、是否CV)。

4. 集成模型预测

目标: 在完全隔离的测试集上,执行统一、可复现的融合推理流程,生成最终预测。

操作要点

  • 推理一致性:

    • 使用与训练一致的标准化参数与窗口化协议(各自的 TA,TBT_A,T_B),禁止任何“基于测试分布”的再拟合;

    • 对滚动多步预测,两个子模型均采用相同的闭环策略(把上一步预测写回 cabin_temp 通道,其余外生特征用真实/可预报值),以确保对比公平。

  • 融合执行:

    • 加权平均y^ens(t)=α,y^A(t)+(1α),y^B(t)\hat{y}_{\text{ens}}(t)=\alpha,\hat{y}_A(t)+(1-\alpha),\hat{y}_B(t)

    • 线性元模型yens(t)=β0+β1yA(t)+β2yB(t)y^ens(t)=β0+β1y^A(t)+β2y^B(t) y^ens(t)=β0+β1y^A(t)+β2y^B(t)\hat y_{\text{ens}}(t)=\beta_0+\beta_1\hat y_A(t)+\beta_2\hat y_B(t)(若采用约束,在训练期已做归一)。

  • 一致性校验:

    • 对固定的测试片段产出 True/A/B/Ens 四线叠加图;

    • 随机抽样 K 段(如 K=5)做“误差带”可视化(真实 ±|误差|),检查是否存在系统性偏高/偏低时段。

  • 产出版本化:

    • pred_A_test.npy、pred_B_test.npy、pred_Ens_test.npy;

    • fusion_meta.json(含 α* 或 β\beta、推理配置、代码/数据版本哈希)。

质量门控(Gate):

  • 推理脚本在“只读模式”下运行并能重放;

  • pred_Ens 时间轴、采样率、单位与真值严格对齐(有自动断言)。

5. 性能评估比较

目标: 用多维指标与多视角图展示“集成优于单模”的统计证据与直觉证据。

操作要点

  • 统一指标(测试集): MSE/MAE/RMSE/MaxAE + 分阶段指标(冷启动/快速降温/趋稳);

  • 地平线误差曲线 MAE(h),h=1HMAE(h),h=1HMAE(h),h=1…H\text{MAE}(h), h=1\ldots H:对多个起点做滚动,比较 A/B/Ens 的增长斜率(集成理应更缓);

  • 校准与偏差诊断:

    • 预测–真实散点与回归线(理想斜率≈1、截距≈0);

    • 残差直方图与 ACF(若残差仍显著自相关,提示可进一步挖掘结构)。

  • 典型场景剖面图:

    • 选择基线误差最大的 2–3 段画 True/A/B/Ens 对比;

    • 标注“初期滞后修正”“趋稳振荡抑制”等可解释改善。

  • 显著性与稳健性:

    • 多会话条件下对会话级 MAE 做配对检验(t/Wilcoxon),报告 p 值与效应量;

    • 轻微扰动鲁棒性测试(输入加小幅噪声)验证集成优势非脆弱。

质量门控(Gate):

  • MAEEns<min(MAEA,MAEB)MAEEns<min(MAEA,MAEB)MaxAEEnsMaxAEEnsMAEEns<min⁡(MAEA,MAEB)\text{MAE}_{\text{Ens}}<\min(\text{MAE}_A,\text{MAE}_B) 且 MaxAEEns\text{MaxAE}_{\text{Ens}} 不劣于单模最佳;

  • MAE(h)MAE(h)MAE(h)\text{MAE}(h) 的增长斜率 Ens < A, Ens < B。

  • 产出:test_metrics_all.csv、plots_timeseries_compare/*.png、mae_h_curves.csv、calibration_plots/*.png、significance_report.md。

6. 结果分析与讨论

目标: 形成“为何有效”的系统论证,并沉淀为可审计、可复用的工程资产与教学材料。

分析框架

  • 提升幅度与机理解释:

    • 量化整体与分阶段的绝对/相对降幅(如 MAE ↓ 18%、MaxAE ↓ 0.4°C),并结合残差相关与多样性指标解释“互补性→融合增益”。

    • 结合项目技术协议[4]与相关研究[9]的观点,说明“堆叠平均优于单一 LSTM”的外部证据与本实验的内部证据之间的一致性。

  • 何时收益最大:

    • 初期陡降与趋稳段的改进尤为明显(举图佐证),并指出 A/B 的结构/窗口/正则差异如何分别捕捉长期/短期动力学。

  • 可扩展设想与代价评估:

    • 若引入第三模型(如基于梯度提升树的静态特征回归,或 CNN/TCN),可在元学习器中引入非线性项(如小型多层感知机)提升组合表达力;

    • 讨论计算开销与上线复杂度:推理时延、模型体积、参数同步、故障降级策略(单模回退)。

  • 风险与边界条件:

    • 过拟合风险(元模型自由度过大、或验证集不足);

    • 域偏移(新工况/季节变化)下的融合权重失稳 → 需定期重估 α/β\alpha / \beta

  • 资产化与归档:

    • 保存:modelA_best.ckpt、modelB_best.ckpt、fusion_meta.json、test_metrics_all.csv、关键图表;

    • 生成 experiment_card.md(问题定义、数据、子模型配置、融合方法、指标、已知局限、后续路线);

    • CHANGELOG.md:相对单模/基线的改动与收益记录。

建议的目录与产物清单

stacking/

├─ configs/

│ ├─ config_A.yaml

│ └─ config_B.yaml

├─ runs/

│ ├─ A/ (...logs, curves...)

│ └─ B/ (...logs, curves...)

├─ checkpoints/

│ ├─ modelA_best.ckpt

│ └─ modelB_best.ckpt

├─ fusion/

│ ├─ alpha_search.csv

│ ├─ alpha_star.json

│ └─ stacking_coefficients.json

├─ predictions/

│ ├─ pred_A_test.npy

│ ├─ pred_B_test.npy

│ └─ pred_Ens_test.npy

├─ evaluation/

│ ├─ test_metrics_all.csv

│ ├─ mae_h_curves.csv

│ └─ plots_timeseries_compare/*.png

└─ reports/

├─ significance_report.md

├─ experiment_card.md

└─ CHANGELOG.md

最后更新于