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

如何从3D数组指定SHAP的feature_names?附1D CNN报错案例

解决1D CNN+SHAP特征重要性分析中3D数组的feature_names设置问题

问题根源

你的3D输入数组结构应为(样本数, 时间步长, 特征数),而SHAP的summary_plot要求feature_names是对应最后一维(特征维度)的字符串列表,直接传入3D数组会导致索引不匹配,触发IndexError。

解决步骤

  1. 确认数据维度
    先打印输入数组的形状,明确特征维度的大小:
print(sc_cnn_tube_par_X_train_3D.shape)
# 示例输出:(1200, 60, 8) → 1200个样本,60个时间步,8个特征
  1. 生成对应特征名称列表
    根据特征维度的长度,创建等长的字符串列表。如果有特征的实际含义,替换成对应名称即可:
# 获取特征数量
n_features = sc_cnn_tube_par_X_train_3D.shape[2]
# 生成特征名称(示例用通用命名,可替换为实际特征名)
feature_names = [f"传感器_{i+1}" for i in range(n_features)]
  1. 正确调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:20:25