如何从3D数组指定SHAP的feature_names?附1D CNN报错案例
解决1D CNN+SHAP特征重要性分析中3D数组的feature_names设置问题
问题根源
你的3D输入数组结构应为(样本数, 时间步长, 特征数),而SHAP的summary_plot要求feature_names是对应最后一维(特征维度)的字符串列表,直接传入3D数组会导致索引不匹配,触发IndexError。
解决步骤
- 确认数据维度
先打印输入数组的形状,明确特征维度的大小:
print(sc_cnn_tube_par_X_train_3D.shape) # 示例输出:(1200, 60, 8) → 1200个样本,60个时间步,8个特征
- 生成对应特征名称列表
根据特征维度的长度,创建等长的字符串列表。如果有特征的实际含义,替换成对应名称即可:
# 获取特征数量 n_features = sc_cnn_tube_par_X_train_3D.shape[2] # 生成特征名称(示例用通用命名,可替换为实际特征名) feature_names = [f"传感器_{i+1}" for i in range(n_features)]
- 正确调用SHAP的summary_plot
使用DeepExplainer处理1D CNN模型,传入生成的feature_names即可:
import shap # 初始化解释器,用训练集数据做背景 explainer = shap.DeepExplainer(model, sc_cnn_tube_par_X_train_3D) # 计算测试集的SHAP值 shap_values = explainer.shap_values(sc_cnn_tube_par_X_test_3D) # 绘制特征重要性图 shap.summary_plot(shap_values, sc_cnn_tube_par_X_test_3D, feature_names=feature_names)
进阶:展示时间步+特征的组合重要性
如果需要分析每个时间步下各特征的重要性,可以将3D数组展平为2D,并生成包含时间步信息的特征名称:
n_timesteps = sc_cnn_tube_par_X_train_3D.shape[1] # 生成带时间步的特征名 feature_names_with_steps = [ f"传感器_{i+1}_时间步_{j+1}" for j in range(n_timesteps) for i in range(n_features) ] # 展平测试集数据 X_test_flat = sc_cnn_tube_par_X_test_3D.reshape(-1, n_timesteps * n_features) # 绘制展平后的特征重要性图 shap.summary_plot(shap_values, X_test_flat, feature_names=feature_names_with_steps)
内容的提问来源于stack exchange,提问作者bin
相关产品推荐
相关产品推荐

