XGBoost+SHAP可解释性分析的回归预测 Matlab代码(多输入单输出)

在这里插入图片描述


一、环境配置与安装(Windows系统)

1. 安装前提
  • MATLAB ≥ R2020a(推荐R2022b+)
  • 能访问外网的电脑(用于下载依赖)
  • 安装Git for Windows
2. 安装步骤


try
    xgboost_version = py.xgboost.__version__;
    fprintf('XGBoost %s 安装成功\n', xgboost_version);
catch
    error('安装失败:检查Python环境或路径配置');
end

注意:若遇.dll缺失错误,将编译生成的xgboost.dll所在目录加入系统PATH:

setenv('PATH', [getenv('PATH') ';C:\path\to\xgboost\release']);

二、多输入单输出回归预测全流程

1. 数据准备与预处理
%% 导入数据(示例:CSV格式,最后一列为输出)
data = readtable('regression_data.csv');
X = table2array(data(:, 1:end-1));  % N×M矩阵:N样本×M特征
Y = table2array(data(:, end));      % N×1向量:输出目标

%% 数据归一化(提升收敛速度)
[X_norm, X_ps] = mapminmax(X', 0, 1);  % 归一化到[0,1]
X_norm = X_norm';
[Y_norm, Y_ps] = mapminmax(Y', 0, 1);
Y_norm = Y_norm';

%% 划分训练集/测试集(70%训练)
cv = cvpartition(size(X,1), 'HoldOut', 0.3);
idx_train = training(cv);
idx_test = test(cv);
X_train = X_norm(idx_train, :);
Y_train = Y_norm(idx_train);
X_test = X_norm(idx_test, :);
Y_test = Y_norm(idx_test);
2. XGBoost模型训练与调参
%% 转换为Python兼容格式(MATLAB→Python接口)
X_train_py = py.numpy.array(X_train);
Y_train_py = py.numpy.array(Y_train);

%% 设置回归任务参数
params = py.dict(...
    'objective', 'reg:squarederror',...  % 回归任务
    'max_depth', 6,...                   % 树深度
    'learning_rate', 0.1,...             % 学习率
    'subsample', 0.8,...                 % 样本采样率
    'colsample_bytree', 0.8,...          % 特征采样率
    'gamma', 0.5,...                     % 分裂最小损失下降
    'alpha', 0.1,...                     % L1正则
    'lambda', 1.0,...                    % L2正则
    'seed', 42);

%% 训练模型(早停法防止过拟合)
dtrain = py.xgboost.DMatrix(X_train_py, label=Y_train_py);
eval_set = py.tuple({dtrain, 'train'});
model = py.xgboost.train(...
    params,...
    dtrain,...
    int64(1000),...                      % 最大迭代次数
    evals=py.list({eval_set}),...
    early_stopping_rounds=int64(50),...  % 早停轮数
    verbose_eval=false);
3. 预测与反归一化
%% 测试集预测
dtest = py.xgboost.DMatrix(py.numpy.array(X_test));
Y_pred_norm = model.predict(dtest);
Y_pred_norm = double(Y_pred_norm)';      % 转换为MATLAB数组

%% 反归一化恢复原始量纲
Y_pred = mapminmax('reverse', Y_pred_norm, Y_ps);
Y_test_orig = mapminmax('reverse', Y_test', Y_ps)';

%% 评估指标(R², RMSE)
rmse = sqrt(mean((Y_test_orig - Y_pred).^2));
r2 = 1 - sum((Y_test_orig - Y_pred).^2) / sum((Y_test_orig - mean(Y_test_orig)).^2);
fprintf('RMSE: %.4f | R²: %.4f\n', rmse, r2);

三、SHAP可解释性分析

1. 计算SHAP值
%% 创建SHAP解释器
explainer = py.shap.TreeExplainer(model);
shap_values = explainer.shap_values(dtest);

%% 转换SHAP结果为MATLAB格式
shap_values_mat = double(py.array.array('d', shap_values));
shap_values_mat = reshape(shap_values_mat, size(X_test));  % N×M矩阵
2. 关键可视化分析
%% 1. 特征全局重要性(均值|SHAP|)
mean_abs_shap = mean(abs(shap_values_mat));
[~, idx] = sort(mean_abs_shap, 'descend');
feature_names = data.Properties.VariableNames(1:end-1);
figure;
barh(mean_abs_shap(idx));
set(gca, 'YTickLabel', feature_names(idx));
title('Feature Importance by |SHAP|');
xlabel('mean(|SHAP value|)');

%% 2. 单样本预测解释(瀑布图)
sample_idx = 10;  % 选择测试集样本
py.shap.plots.waterfall(...
    explainer.expected_value,...
    shap_values_mat(sample_idx,:),...
    features=X_test(sample_idx,:),...
    feature_names=feature_names);

%% 3. 特征依赖图(与目标关系)
shap_scatter = py.shap.plots.scatter(...
    explainer.expected_value,...
    shap_values_mat(:,1),...  % 分析第1个特征
    color=shap_values_mat);
3. 决策解释(力力图)
%% 生成HTML格式的力力图
force_plot = py.shap.force_plot(...
    explainer.expected_value,...
    shap_values_mat(sample_idx,:),...
    X_test(sample_idx,:),...
    feature_names=feature_names,...
    matplotlib=false);
py.shap.save_html('force_plot.html', force_plot);  % 保存为交互式HTML

四、参数调优策略(提升模型性能)

采用分步调参法优化关键参数:

%% 1. 初始粗调(学习率0.1)
params = py.dict('objective','reg:squarederror', 'learning_rate',0.1);
history = model.cv(...
    params, dtrain, int64(1000), nfold=5, 
    metrics='rmse', early_stopping_rounds=50);

%% 2. 深度与权重调整
param_grid = struct(...
    'max_depth', [3,5,7,9],... 
    'min_child_weight', [1,3,5]);
best_rmse = inf;
for depth = param_grid.max_depth
    for weight = param_grid.min_child_weight
        params.max_depth = depth;
        params.min_child_weight = weight;
        cv_result = model.cv(params, dtrain, ...);
        if cv_result.best_score < best_rmse
            best_params = params;
        end
    end
end

%% 3. 正则化微调(alpha, lambda)
param_grid = struct('alpha', [0, 0.1, 0.5], 'lambda', [0.1, 1, 10]);

%% 4. 最终优化(降低学习率增加树数量)
params.learning_rate = 0.01;  % 降为1/10
model = py.xgboost.train(params, dtrain, int64(5000));  % 增加迭代次数

五、常见问题解决

  1. 安装失败

    • 缺失.dll:检查PATH是否包含xgboost.dll路径
    • Python兼容性:确保使用Python≥3.7且已安装xgboost
  2. SHAP可视化空白

    • 安装Jupyter依赖:pip install ipykernel matplotlib
    • 指定Matplotlib后端:matlab.use('Agg')
  3. 归一化失效

    • 测试集必须使用训练集的归一化参数:
      X_test_norm = mapminmax('apply', X_test', X_ps)';  % 勿用新参数
      

关键说明

  1. SHAP分析需额外安装Python库:pip install shap matplotlib
  2. 完整代码依赖:[xgboost-matlab接口]

此方案实现了从数据到可解释性分析的闭环,通过SHAP的定量特征贡献度输出(如力力图、依赖图),显著提升回归模型的可信度和决策价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前程算法屋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值