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

如何查看SHAP热图中的行层级聚类并解决SciPy处理shap_values时的ValueError问题

解决SHAP热图聚类时的ValueError问题

问题根源

你遇到的ValueError本质是因为shap_values是shap._explanation.Explanation对象,不是普通的numpy数值数组——直接用shap_values[:,:-1]切片得到的还是Explanation实例,而scipy的聚类函数只接受纯数值的二维数组。另外,不同任务类型下SHAP值的结构确实不一样:

  • 回归/单分类任务:shap_values.values的形状是(n_samples, n_features),是二维标量数组
  • 二分类任务:shap_values.values的形状是(n_samples, n_features, 2),每个样本的每个特征对应两个类别的SHAP值

修正步骤

你需要先从Explanation对象中提取纯数值的SHAP值矩阵,再根据你的任务类型调整维度:

1. 提取SHAP值的数值矩阵

不管什么任务,先通过shap_values.values获取底层的numpy数组:

shap_values_matrix = shap_values.values

2. 根据任务类型调整维度

  • 如果是回归/单分类任务:你的shap_values.shape显示是600x11,说明shap_values_matrix已经是(600,11)的二维数组,可以直接用:

    import scipy.cluster
    
    # 提取目标特征范围的SHAP值(如果不需要最后一个特征就用[:,:-1])
    D = scipy.spatial.distance.pdist(shap_values_matrix[:,:-1], 'sqeuclidean')
    clustOrder = scipy.cluster.hierarchy.leaves_list(scipy.cluster.hierarchy.complete(D))
    
  • 如果是二分类任务:你需要选择其中一类的SHAP值(比如正类,对应索引1),把三维数组压缩成二维:

    import scipy.cluster
    
    # 选择正类的SHAP值,得到(600,11)的二维数组
    shap_positive = shap_values_matrix[..., 1]
    D = scipy.spatial.distance.pdist(shap_positive[:,:-1], 'sqeuclidean')
    clustOrder = scipy.cluster.hierarchy.leaves_list(scipy.cluster.hierarchy.complete(D))
    

为什么参考的Notebook能正常运行?

你提到的Notebook能成功运行,大概率是因为它处理的是回归任务,或者已经正确提取了shap_values.values,并且任务对应的SHAP值结构是二维数组,不需要额外的维度压缩。

快速验证方法

你可以先打印shap_values.values.shape确认数组维度,再对应选择处理方式:

print(shap_values.values.shape)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:07:30