python - 如何正确使用具有多个回归目标的形状决策图和力图?
问题描述
我有一个 Keras 神经网络,它有 26 个特征和 100 个目标,我想用SHAP python 库来解释。例如,为了绘制力图,我这样做:
shap.force_plot(exp.expected_value[i], shap_values[j][k], x_val.columns)
在哪里:
exp.expected_values
是一个大小为 100 的列表,其中包含我的每个目标的基本值(这至少是我所理解的)。我假设该索引i
指的是第 i 个目标。shap_values
指每个验证案例中每个目标的所有特征的 Shapley 值。因此,j
从 0 运行到 99(即我的目标的大小)并k
从 0 运行到验证用例的总数。
我感到困惑的是,i
实际上j
可能有所不同,而且我确实得到了一个看起来不错的情节。但是,它们不应该总是相同的索引吗?不应该总是将第 i 个基线目标与第 i 个目标的形状值进行比较吗?我对索引的理解有误吗?
解决方案
i
并且j
应该是相同的,因为您正在绘制ith
目标如何受特征影响,从基础到预测:
shap.force_plot(exp.expected_value[i], shap_values[i][k], x_val.columns)
在哪里:
- 我代表
ith
目标类- k 代表
kth
要解释的样本。
背后的原因是exp.expected_value
shape ,它们将是要添加到的 shap 值的基值,如果转换为 numpy 数组,则num_targets
shap 值应该是 shape 。[num_classes, num_samples, num_features]
因此,例如,要在原始空间中获取第 k 个数据点的 shap 值,可以这样做:
shap_values[:,k,:].sum(1) + base_values
对于使用 softmax 进入概率空间的模型,可以这样做:
softmax(shap_values[:,k,:].sum(1) + base_values)
注意,这是假设 shap_values 是 numpy 数组类型。
请询问是否有不清楚的地方。
推荐阅读
- mongodb - POST 数据 Azure 函数
- vba - IE11 是否仍然支持 dispatchEvent/FireElement?
- javascript - 使用javascript根据当前菜单项动态更新标题属性
- java - 创建 bean 取决于 spring 配置文件
- rx-java - RxJava3 - 如何在使用共享运算符时使用 doFinally 和线程安全操作来避免死锁?
- css - 为什么没有中风
工作 ?- SVG - flutter - 在通道 app_settings 上找不到方法 app_settings 的实现
- ios - Swift - 全局变量的更好替代方案是什么?
- python - cx_Oracle 与 kerberized db 的连接崩溃
- javascript - 为什么 VueJS 组件在导入/组件调用后不渲染标签?