修复Shap/numpy concatenate数组维度不匹配报错
错误原因
RFECV是在每个外层交叉验证折的训练集上独立训练的,不同数据折筛选出的特征数量不统一——比如第一折保留20个特征,第二折仅保留16个,导致每折输出的SHAP值数组对应特征的维度不一致,直接按样本维度拼接时就会触发维度不匹配报错。另外原有逻辑就算强行对齐维度,不同折筛选的特征子集不同,SHAP值和原始特征索引无法对应,最终计算的全局特征重要性结果也是错误的。
修复步骤
核心修改思路是:每折计算完筛选后特征的SHAP值后,先将其映射回原始全量特征的维度,未被当前折选中的特征SHAP值填充为0,保证所有折的SHAP数组维度完全一致,再进行拼接。同时修复原有逻辑中用硬分类结果计算AUC的不准确问题。
- 在外层交叉验证循环开始前,新增总特征数变量,避免硬编码:
n_total_features = X_train.shape[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)
- 修复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
相关产品推荐
相关产品推荐

