You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复Shap/numpy concatenate数组维度不匹配报错

错误原因

RFECV是在每个外层交叉验证折的训练集上独立训练的,不同数据折筛选出的特征数量不统一——比如第一折保留20个特征,第二折仅保留16个,导致每折输出的SHAP值数组对应特征的维度不一致,直接按样本维度拼接时就会触发维度不匹配报错。另外原有逻辑就算强行对齐维度,不同折筛选的特征子集不同,SHAP值和原始特征索引无法对应,最终计算的全局特征重要性结果也是错误的。

修复步骤

核心修改思路是:每折计算完筛选后特征的SHAP值后,先将其映射回原始全量特征的维度,未被当前折选中的特征SHAP值填充为0,保证所有折的SHAP数组维度完全一致,再进行拼接。同时修复原有逻辑中用硬分类结果计算AUC的不准确问题。

  1. 在外层交叉验证循环开始前,新增总特征数变量,避免硬编码:
n_total_features = X_train.shape[1]
  1. 替换循环内原有SHAP计算的代码段,将筛选特征的SHAP值映射回全量特征维度:
    原代码:
explainer = shap.TreeExplainer(best_model_shap)
shap_values = explainer.shap_values(split_x_test_selected_features)
list_shap_values.append(shap_values)
list_test_sets.append(test_ix) 

替换为:

explainer = shap.TreeExplainer(best_model_shap)
shap_values_selected = explainer.shap_values(split_x_test_selected_features)
# 初始化全量特征维度的SHAP数组,未选中特征默认填0
shap_values_full = [np.zeros((split_x_test.shape[0], n_total_features)) for _ in range(2)]
for class_id in range(2):
    shap_values_full[class_id][:, selected_features] = shap_values_selected[class_id]
list_shap_values.append(shap_values_full)
list_test_sets.append(test_ix)
  1. 修复AUC计算逻辑,使用模型预测的正类概率而非0/1硬分类结果计算ROC和AUC:
    原代码:
yhat = search.predict(split_x_test)
# 中间accuracy、f1、precision、recall计算逻辑保留
fpr, tpr, _ = roc_curve(split_y_test, yhat)
auc = metrics.auc(fpr,tpr)

替换为:

yhat = search.predict(split_x_test)
yhat_proba = search.predict_proba(split_x_test)[:, 1]
# 中间accuracy、f1、precision、recall计算逻辑保留不变
fpr, tpr, _ = roc_curve(split_y_test, yhat_proba)
auc = metrics.auc(fpr,tpr)
修复效果

修改后每折生成的SHAP数组维度统一为(2, 折内测试样本数, 总特征数),拼接时不会再出现维度不匹配的报错;同时SHAP值和原始特征索引一一对应,最终输出的特征重要性排序准确,AUC计算结果也符合二分类任务的常规评估规范。

内容的提问来源于stack exchange,提问作者Slowat_Kela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:24:23