如何查看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
相关产品推荐
相关产品推荐

