CPO-CNN-BiLSTM 多输出回归 + SHAP 可解释分析:从超参寻优到特征归因的完整实践
本文基于一套完整的 MATLAB 工程代码,拆解「冠豪猪优化(CPO)自动调参 + CNN-BiLSTM 多输出回归 + SHAP 特征贡献解释 + 新数据预测」的技术链路。不堆砌公式、不搬运教程,聚焦为什么这样设计、每一步在解决什么问题、实测结果说明了什么,供做回归预测、可解释机器学习与智能算法应用的读者参考。
一、代码研究背景
在设备健康评估、能耗预测、化工过程建模等工程场景里,我们常常面对这样的数据:输入是多个传感器的时序/准时序特征,输出往往不止一个(例如同时预测「剩余寿命」与「健康指数」,或同时预测两种产物的收率)。这类多输出回归问题有两个绕不开的痛点:
- 模型结构依赖人工调参。CNN-BiLSTM 这类混合网络性能对超参数极度敏感------卷积核大小、特征图数量、池化窗口与步长、BiLSTM 隐层神经元数,任意一项选错都会让精度大打折扣。靠经验试错,成本高且难以保证最优。
- "黑箱"难落地。即便模型预测准,业务方仍会追问"为什么这么预测""哪个特征起决定作用"。没有可解释性,模型很难进入决策环节。
针对痛点一,主流做法是引入智能优化算法替代人工搜索。本文选用 CPO(Crested Porcupine Optimization,冠豪猪优化算法,2024 年提出) :它模拟冠豪猪的四重防御机制,在探索(全局搜索)与开发(局部精搜)之间切换,收敛快、不易陷入局部最优。针对痛点二,采用 SHAP(SHapley Additive exPlanations):基于合作博弈论的 Shapley 值,把每个预测公平地拆解到各输入特征头上,给出可量化、可对比的特征贡献。
一句话概括工程目标:用 CPO 自动找到 CNN-BiLSTM 的最优超参数,搭一个能同时预测两个输出的回归模型,用 SHAP 讲清特征贡献,并具备对全新样本一键预测的能力。
二、主要功能
整套代码以 main.m 为总入口,一键运行即可产出全部图表与指标,模块化拆解后具备以下能力:
- 超参数智能寻优:以测试集 RMSE 为适应度函数,用 CPO 搜索 5 个关键超参(卷积核、特征图、池化窗口、池化步长、BiLSTM 神经元数)。
- 多输出回归建模:CNN-BiLSTM 同时拟合 y1、y2 两个输出,输出层神经元数等于输出维度。
- 数据归一化与样本划分 :
mapminmax将特征与输出归一化到 0,1,默认 8:2 划分训练/测试集,支持是否打乱样本。 - 对照实验 :
yuan.m用一组经验默认参数训练未优化的 CNN-BiLSTM,与优化版本逐项对比,验证 CPO 的价值。 - 精度评价 :
zhibiao.m计算每个输出的 RMSE、R²、MAE,并分别生成训练集/测试集指标表。 - 可解释分析 :
shapley_function.m计算各样本 SHAP 值,输出蜂群图(特征贡献分布)与条形图(全局特征重要性)。 - 新数据预测 :
newpre.m读入新的多输入.xlsx,完成归一化→预测→反归一化,结果写入新的输出.xlsx。 - 丰富可视化:收敛曲线、雷达图对比、真实值/预测值曲线、百分比误差柱状图、回归拟合图、训练过程 RMSE/Loss 曲线一应俱全。
三、算法步骤
整体执行流程可归纳为 10 步:
- 载入数据 :从
回归数据.xlsx读取 200 条样本,前 5 列为输入 X,后 2 列为输出 Y。 - 归一化 :对 X、Y 分别用
mapminmax映射到 0,1,并保留归一化参数psin、psout供反归一化使用。 - 划分数据集:按 0.8 比例切分训练/测试,cell 数组格式适配序列输入。
- 定义适应度函数 :
fit.m接收一组超参 → 搭建 CNN-BiLSTM → 用 Adam 训练 500 轮 → 返回测试集 RMSE 作为该组超参的"得分"。 - CPO 寻优 :设定种群、迭代次数、上下界与维度,调用
CPO(...)搜索最优 5 元组。 - 构建最优网络:用 CPO 给出的最优超参搭建最终 CNN-BiLSTM 层结构。
- 训练模型 :
trainNetwork在训练集上训练,记录收敛过程。 - 预测与反归一化 :对训练集/测试集预测,再用
psout反归一化得到真实量纲结果。 - 对照与评估:同时跑未优化模型,计算并保存各输出精度指标,绘制对比图。
- 可解释 + 新数据预测 :计算 SHAP 值并出图;用
newpre对 54 条新样本完成双输出预测。
四、技术路线
模型结构是一条"序列输入 → 2D 卷积提特征 → 序列还原 → BiLSTM 学依赖 → 全连接输出"的流水线,核心代码如下:
matlab
layers = [
sequenceInputLayer([5, 1, 1]) % 5 个输入特征
sequenceFoldingLayer('Name','fold') % 序列折叠,便于接 2D 卷积
convolution2dLayer([bestfitler,1], bestfm, 'Padding','same')
reluLayer
maxPooling2dLayer([bestpool,1], 'Stride',[beststep,1])
convolution2dLayer([bestfitler,1], bestfm*2, 'Padding','same')
reluLayer
sequenceUnfoldingLayer('Name','unfold')% 序列展开,接回序列模型
flattenLayer('Name','flatten')
bilstmLayer(besthiddens, 'OutputMode','last')
dropoutLayer(0.05,'Name','drop3')
fullyConnectedLayer(2,'Name','fc') % 2 个输出
regressionLayer ];
设计要点有三处值得说明:
- 为何 CNN + BiLSTM:1D 卷积擅长抽取局部特征模式(如相邻特征的组合效应),BiLSTM 在此基础上双向捕捉前后依赖关系。二者串联,兼顾"局部特征提取"与"序列依赖建模"。
- sequenceFolding/Unfolding 桥接:MATLAB 的 2D 卷积不直接吃序列,这里用折叠层把序列压成 2D 特征图送入卷积,再用展开层还原,从而让 CNN 与 BiLSTM 在同一网络里无缝衔接。
- 双层卷积 + 特征图翻倍 :第二层卷积特征图数设为第一层的 2 倍(
bestfm*2),形成由浅入深的表征层次。
五、公式原理
5.1 归一化(mapminmax)
将数据线性映射到 0,1:
x' = (x - x_min) / (x_max - x_min)
预测后再用保存的参数反归一化,避免量纲干扰训练。
5.2 卷积与池化
卷积运算:
(f * x)(i) = Σ w·x + b, 再经 ReLU: h = max(0, f*x)
最大池化取窗口内最大值,压缩尺度、提升平移不变性。
5.3 BiLSTM
双向 LSTM 同时沿时间正向、反向传播,末时刻拼接两向隐状态。LSTM 单元通过遗忘门、输入门、输出门控制信息流,缓解长程依赖中的梯度消失。本文取 OutputMode='last',用末时刻输出作整段序列的表征。
5.4 评价指标
-
RMSE(均方根误差):
RMSE = √( 1/n · Σ (y_i - ŷ_i)² )
-
R²(决定系数):
R² = 1 - ||y - ŷ||² / ||y - ȳ||²
-
MAE(平均绝对误差):
MAE = 1/n · Σ |y_i - ŷ_i|
5.5 CPO 位置更新(四重防御机制)
CPO 把迭代分为探索 与开发两阶段,各含两种防御行为:
- 探索(第一防御) :
X_i = X_i + randn·|2·rand·Gb_Sol − y|,y=(X_i+X_rand)/2,以大步长跳出局部。 - 探索(第二防御) :
X_i = U1·X_i + (1−U1)·(y + rand·(X_rand − X_rand)),用随机掩码做扰动。 - 开发(第三防御) :
St = exp(fitness_i / Σfitness),X_i = (1−U1)·X_i + U1·(X_rand + St·(X_rand−X_rand) − S),St为基于适应度的缩放因子,越优个体引导越强。 - 开发(第四防御) :
Mt = exp(fitness_i/Σfitness),Ft = rand·(Mt·(−X_i + X_rand)),向全局最优Gb_Sol收缩精搜。
其中 Yt = 2·rand·(1 − t/Tmax)^(t/Tmax) 随迭代从探索平滑过渡到开发;种群按收敛率 α=0.2、权衡系数 Tf=0.8 动态调整。初始种群还用 Tent 混沌映射(label=1)生成,使起点分布更均匀、避免聚团。
5.6 SHAP(Shapley 值)
对每个特征 j,其贡献按合作博弈论定义为所有可能特征子集的边际贡献加权平均:
φ_j = Σ_{S ⊆ F\{j}} [ |S|!·(|F|−|S|−1)! / |F|! ] · [ v(S∪{j}) − v(S) ]
其中 v(·) 为模型在某一特征组合下的预测值。代码以各特征均值作背景参考值,遍历 5 个特征的 2⁵ 种组合(精确计算,因特征数少可行),得到每个样本的 SHAP 值;全局重要性则取各特征 SHAP 绝对值的均值。
六、参数设定
CPO 寻优参数(搜索 5 个超参):
| 超参数 | 下限 | 上限 | 说明 |
|---|---|---|---|
| 卷积核大小 | 2 | 16 | 整数 |
| 特征图数量 | 2³=8 | 2⁷=128 | 以 2 的幂形式搜索(指数 3~7) |
| 最大池化窗口 | 2 | 5 | 整数 |
| 池化步长 | 1 | 3 | 整数 |
| BiLSTM 神经元数 | 2 | 16 | 整数 |
- 种群规模
N=10,最大迭代Max_iteration=10,维度dim=5; - 混沌初始化映射
label=1(Tent 映射)。
CNN-BiLSTM 训练参数:
- 优化器 Adam,最大轮数 500,初始学习率 0.01;
- 学习率分段衰减:
piecewise,每 200 轮乘下降因子 0.1; - Dropout = 0.05,每轮打乱(
Shuffle='every-epoch'),运行环境 CPU。
数据与评估参数:
- 样本 200 条,输入 5 维、输出 2 维;
- 训练/测试比 8:2,支持是否打乱;
- SHAP 参考值取各特征均值;5 特征下枚举复杂度 2⁵=32,可精确计算。
说明:CPO 的最优超参五元组在每次运行结束时由
main.m打印到命令行(最佳卷积核、最佳特征图、最佳池化窗口/步长、最佳 BiLSTM 神经元数),可直接复用于部署,无需重新寻优。
七、运行环境
- 语言/平台 :MATLAB(需安装 Deep Learning Toolbox ),支持
trainNetwork、sequenceInputLayer、bilstmLayer等。 - 版本要求 :R2019b 及以上(工程内含
spider_plot_R2019b适配版本,用于雷达图对比)。 - 硬件 :代码默认
ExecutionEnvironment='cpu',普通笔记本即可运行;种群 10、迭代 10 的配置很轻量,寻优耗时很短。 - 依赖文件 :
spider_plot工具箱(雷达图)、回归数据.xlsx(建模数据)、新的多输入.xlsx(新预测输入)。 - 可移植性:数据格式为"前 N 列为输入、后 M 列为输出"的 Excel,改数据即可套用到其他多输出回归任务,无需改代码结构。
八、应用场景
该链路是"多输入→多输出回归 + 可解释"的通用范本,可直接迁移到:
- 装备健康管理:输入振动、温度、电流等多传感特征,同时输出剩余寿命(RUL)与健康指数。
- 能源与负荷预测:输入气象、历史负荷等,输出多区域/多时段负荷。
- 化工过程建模:输入温度、压力、流量、组分浓度,输出两种产物收率或能耗指标(本文数据形态即此类)。
- 环境与交通:输入多源监测特征,输出多项污染物浓度或多路段流量。
- 科研与竞赛:代码自带"优化 vs 未优化"对照与丰富图表,非常契合论文实验、建模竞赛的对比展示需求。
实测效果一瞥























以本文数据(200 样本、5 入 2 出)为例,CPO 优化版与经验默认版在测试集上的逐输出精度对比如下:
| 输出 | 方案 | RMSE | R² | MAE |
|---|---|---|---|---|
| 输出1 | 优化后 | 1.6176 | 0.96938 | 1.3109 |
| 输出1 | 未优化 | 1.8781 | 0.95873 | 1.4732 |
| 输出2 | 优化后 | 1.6127 | 0.96957 | 1.3057 |
| 输出2 | 未优化 | 1.8873 | 0.95833 | 1.4754 |
可以看到,经 CPO 寻优后,两个输出的测试集 RMSE 均下降约 14%,R² 提升约 1 个百分点,泛化能力明显改善------这正是自动调参相对人工经验的实质收益。
一点客观补充:在把两个输出合并为单一聚合 RMSE 的总指标上,两次运行的数值较为接近(受随机初始化与两输出量纲混合影响)。这恰恰说明 CPO 的核心价值不在于"刷高某一个混合指标",而在于稳定、可复现地提升每个独立输出的泛化表现,并彻底免去人工试参。
新数据预测环节也已验证:对 54 条全新样本(5 特征),newpre.m 一键给出对应的双输出预测并落盘,具备工程部署可用性。
小结
CPO-CNN-BiLSTM + SHAP 这套组合,把"自动调参---高精度多输出回归---特征可解释---新数据预测"四件事串成了一条可复用的工程流水线。对做回归预测又苦于调参、或被业务方追问"凭什么这么预测"的读者,这套代码值得直接拿来改数据试用。下一步可探索的方向包括:把 CPO 种群/迭代适度放大以逼近更优解、用 KernelSHAP/TreeSHAP 加速大规模特征场景、或将 SHAP 依赖图(dependence plot)纳入分析以揭示特征间的交互效应。