【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)

【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)

引言

该文章实现了一个可解释的神经网络回归模型,使用BP神经网络(BPNN)来预测特征输出。该模型利用七个变量参数作为输入特征进行训练。为了提高可解释性,应用了SHapley Additive exPlanations(SHAP),去深入了解每个参数对模型预测的贡献。

一、案例数据

1、导入数据

res = xlsread('数据集.xlsx');  %103行样本,7输入,1输出
x = res (:,1:end-1); %   
y = res(:,end); % 最后一列为输出

2、数据标准化
该部分使用mapminmax函数对输入和输出数据进行标准化,将数据缩放到[-1, 1]范围内。

% 输入数据归一化
[x_norm, x_settings] = mapminmax(x',-1,1);
% 输出数据归一化
[y_norm, y_settings] = mapminmax(y',-1,1);

normalization_x = x_settings;
save ('normalization_x.mat', 'x_settings');
normalization_y = y_settings;
save ('normalization_y.mat', 'y_settings');

x_norm_t = x_norm';
y_norm_t = y_norm';

输入数据标准化:输入特征被标准化,标准化设置(x_settings)保存在名为normalization_x.mat的文件中,以便后续使用或反转标准化.
输出数据标准化:同样,输出数据被标准化,标准化设置(y_settings)保存在名为normalization_y.mat的文件中. 标准化后的数据被转置回原始方向,以保持模型进一步处理的一致性. 此步骤确保输入和输出数据适当缩放,以便于神经网络训练,从而有助于提高模型性能和收敛速度.

二、交叉验证和模型评估

该部分执行5折交叉验证以评估基于优化超参数构建的模型性能.

1、交叉验证设置
脚本使用K折交叉验证,numFolds = 5,将数据分成5个子集(折)。在每次迭代中,一个子集用于测试,其余子集用于训练模型.

2、模型训练和测试
对于每个折,使用cvpartition生成的索引将训练和测试数据分开. 使用BP神经网络(BPNN)训练模型,超参数设置:

 % 训练模型
    neuron = 5;
    %%  创建网络
    net = newff(trainData', trainLabels', neuron);
    %%  设置训练参数
    net.trainParam.epochs = 1000;     % 迭代次数 
    net.trainParam.goal = 1e-6;       % 误差阈值
    net.trainParam.lr = 0.01;         % 学习率

3、解释交叉验证结果
RMSE:交叉验证后,可以计算所有折的平均RMSE。如果所有折的RMSE值一致且相对较低,则表明模型对未见数据具有良好的泛化能力。如果RMSE值在各折之间变化较大,可能表明模型对训练数据敏感,这可能是过拟合的迹象.
R²(决定系数):R²值也应在所有折之间进行平均,以评估模型的拟合优度。较高的R²值表明模型能够解释目标变量的更大比例的方差。如果R²值较低,则可能表明模型未能很好地捕捉输入特征与目标之间的关系.
最终模型选择:完成交叉验证后,可以通过所有折的平均RMSE和R²总结模型的整体性能。这有助于选择在偏差和方差之间具有最佳权衡的模型.
在这里插入图片描述

在这里插入图片描述

通过训练数据集评估模型的预测性能
选择最优数据集进行可视化(折数=3)
在这里插入图片描述

在这里插入图片描述

三、SHAP分析

1、生成随机数据
在本部分,生成一组合成输入数据用于SHAP分析。这种合成数据允许在受控和一致的方式下评估模型的特征贡献。步骤包括:

样本数量:脚本设置生成的合成样本数量为80(numSamples = 80).
特征范围: 定义操作参数在特定范围内,选择训练数据中各个输入变量的最大值和最小值

VarMin =  [137.0000         0         0  160.0000    4.7000  708.0000  640.6000]
VarMax =  1.0e+03 *[    0.3660    0.1930    0.2600    0.2400    0.0190    1.0495    0.9020]

随机数据生成: 使用rand函数在定义的范围内为每个特征生成随机值,创建80个样本.

for i=1:size(x,2)
x_shap(:,i)=VarMin(i)+ (VarMax(i) - VarMin(i)) * rand(numSamples, 1);
end

此生成数据用于评估SHAP值并分析每个特征如何影响模型的预测。生成随机输入数据确保了SHAP分析中特征值的广泛范围,便于更全面地评估特征重要性.

2、计算SHAP值
该代码计算神经网络模型的SHapley Additive exPlanations(SHAP)值。SHAP值量化了每个特征对模型预测的贡献。该过程包括:

  1. 预分配SHAP值矩阵:初始化一个矩阵以存储所有输入样本和特征的SHAP值.
    2.计算参考值:将参考值计算为所有输入特征的平均值,用于在排除或包含特征时进行比较.
    3.计算SHAP值:对于每个输入样本,使用自定义的shapley_ann函数计算SHAP值,该函数迭代所有可能的特征组合以确定每个特征对预测的贡献.
    4.自定义的shapley函数接受一个训练好的神经网络(net)、当前输入样本和参考值来计算每个特征的SHAP值。该方法提供了对单个特征如何影响模型输出的洞察.
% ------------------------------------
function shapValues = shapley(net, x_shap, refValue) % 假设您有一个名为'net'的训练好的网络
    

    % 使用Shapley公式计算SHAP值
    如果有7个特征,则依次分析每个特征的累计贡献值
    当分析第1个特征时,排除当前特征,即 1  0  0  0  0  0  0
    迭代所有可能的特征组合 
   for i=12^(D-1)
    xt1: 每个样本的特征变量输入值(处理后)   1*7
    xt2: 计算的每个样本平均值(处理后)       1*7
    xt3: 当分析不同特征时,将该特征值替换为平均值。  1*7
    shapValues=shapValues+net(xt3)-net(xt2)   
  end

3、可视化
------蜂群图:为每个特征创建散点图(蜂群图),显示所有样本的SHAP值。特征值被标准化并颜色编码以提高可解释性.
包括轴标签、网格、框以提高清晰度以及带有操作参数标签的颜色条. 此SHAP摘要图有助于理解哪些特征对模型的预测影响最大以及特征在样本中的变化情况.显示每个特征对模型预测的贡献。
在这里插入图片描述

-----条形图
计算平均绝对SHAP值:计算每个特征的绝对SHAP值的平均值,以量化每个特征的整体重要性.
条形图可视化:创建一个水平条形图,特征按其平均绝对SHAP值排序。这提供了模型中特征重要性的清晰、排序表示. 结果的SHAP摘要条形图有助于识别哪些特征对模型的预测影响最大.
在这里插入图片描述

四、代码获取

1.阅读首页置顶文章
2.关注CSDN
3.根据自动回复消息,私信回复“112期”以及相应指令,即可获取对应下载方式。

MATLAB 中可以利用 SHapley Additive exPlanations (SHAP) 来分析和解释卷积神经网络(CNN)在处理时间序列分类任务中的预测结果。通过引入 SHAP 值,我们可以更好地理解模型如何基于输入特征做出决策。 ### MATLAB 对时序数列 CNN 分类任务的 SHAP 可解释性 #### 步骤概述: 1. **构建并训练 CNN 模型** 首先需要设计适合于时间序列数据的卷积神经网络,并对其进行训练。例如,可以将一维卷积层用于提取局部模式的时间序列信号特征。 2. **生成背景数据集** 背景数据集是用来计算 SHAP 值的基础样本集合。通常可以选择一部分训练集中代表性较强的样本作为背景数据。 3. **加载已有的预训练模型** 如果已经完成模型训练,则可以直接加载保存好的模型权重文件以减少重复工作量。 4. **应用 SHAP 解释工具包** 使用 MATLAB 提供的相关函数库(如 `shapley`),针对测试样例运行 SHAP 算法,得到每个输入维度对于最终输出类别概率的影响程度量化值——即所谓的“贡献”。 5. **可视化结果** 最终可以通过绘制条形图、散点矩阵等形式展现哪些时间段内的数值变化最显著地影响了特定标签下的判断结论。 --- #### 示例代码框架: ```matlab % 加载必要的工具箱 addpath('deep-learning-toolbox'); % 导入预先准备的数据集 load('time_series_data.mat'); % 包含 XTrain 和 YTrain % 创建简单的 1D-CNN 架构 layers = [ imageInputLayer([height width channels],'Normalization','none') convolution2dLayer(filterSize,numFilters,'Padding','same') batchNormalizationLayer() reluLayer()]; options = trainingOptions('adam', 'MaxEpochs', epochs); net = trainNetwork(XTrain,YTrain,layers,options); % 执行 shapley 计算过程 explainer = shapley(net, backgroundData); results = explainer(testSample); % 绘制 SHAP 图像展示关键因素 bar(results.ShapleyValues) xlabel('Feature Index'); ylabel('Shapley Value Magnitude'); title('Contribution of Each Time Point to Prediction Outcome'); ``` 注意:上述仅为伪码示例,实际操作需依据具体项目调整参数设置及路径等细节内容。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风飘摇的土木狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值