1. 解释算法背景
1.1 LIME
特点:局部、model-agnostic、instance-wise
方法:使用一个更简单的、围绕特定实例的本地可解释模型来近似复杂的ML模型
- 选择要解释的实例
- 生成一组相邻样本来干扰实例
- 使用复杂ML模型预测获得的扰动样本
- 拟合一个模型(例如,线性回归或决策树)对受干扰的样本及其预测
- 解释更简单的模型,为原始实例提供解释
目标函数:
1.2 DeepLIFT
特点:使用深度学习
方法:深度学习的递归预测解释方法
1.3 Layer-Wise Relevance Propagation
特点:使用深度学习
方法:找出输入像素x的每个输入像素对特定预测的贡献
f
(
x
)
=
∑
d
=
1
V
R
d
f(x) = \sum_{d=1}^{V} R_d
f(x)=d=1∑VRd
1.4 Shapley regression values
特点:需要重新训练模型
方法:给每个特征分配一个重要性值,代表包括该特征对模型预测的影响
1.5 Shapley sampling values
特点:无需重新训练模型、计算更少
方法:对Shapley regression values公式抽样,通过对训练数据集中的样本进行积分来近似从模型中删除变量的效果
1.6 Quantitative input influence
特点:更广泛的框架
方法:几乎与Shaply抽样值完全相同
2. 提出的解释算法(Model-Agnostic)
2.1 Shapley sampling values
上面介绍过
2.2 Kernel SHAP
Linear LIME+shapley value
和传统LIME最大的不同:权重
- LIME:实例与原始实例的接近程度
- Kernel SHAP:联盟在 Shapley值估计中获得的权重
3. 提出的解释算法(Model-Specific)
3.1 Linear SHAP
适用:线性模型
假设:特征独立性
3.2 Low-Order SHAP
在2.2基础上,使用较低阶的 Shapley 值来解释模型的预测:
一阶 Shapley 值表示单个特征对于模型预测结果的贡献
二阶 Shapley 值表示两个特征之间的交互对于预测结果的贡献。
结果:可能会牺牲一些信息的精确度,但却能够在更短的时间内提供模型的解释结果,这对于大规模数据集或实时应用来说是非常有用的。
3.3 Max SHAP
使用 Shapley 值的排列公式,计算每个输入将最大值增加到其他每个输入的概率。
3.4 Deep SHAP
DeepLIFT + Shapley values
适用:任何模型,包括深度模型
将 DeepLIFT 中的参考值解释为 Shapley 值中的期望值
4. TreeSHAP
4.1举例
假设样本有3个特征(x,y,z)和总共100个训练样本
假设现在要判断顺序{x=5,z=10}中z的边际贡献:
特征组合 | 解释 | 贡献值 |
---|---|---|
{x=5} | node1-node2-node8/9/10/11 | 10*(15/60)+20*(5/60)+5*(30/60)+8*(10/60)=8 |
{x=5,z=10} | node1-node2-node9/10/11 | 20*(5/45)+ 5*(30/45)+ 8*(10/45)=7.3 |
m a r g i n a l c o n t r i b u t i o n ( z ) = { x = 5 , z = 10 } − { x = 5 } marginal contribution(z)=\{x=5, z=10\} -\{x=5\} marginalcontribution(z)={x=5,z=10}−{x=5}
假设样本有2个特征(x,y)和总共10个训练样本
{}:(20* 4+30* 2+45* 3+60* 1)/10=33.5
对于排序{X = 130,Y = 65}:
- X边际贡献:n1-n3-n6:45-33.4=11.5
- Y边际贡献:0
对于排序{Y = 65,X = 130}:
- Y边际贡献:60%20+40%(75%*45+25%*60)=31.5 31.5-33.5=-2
- X边际贡献:45-31.5=13.5
最终SHAP值:
X:(11.5+13.5)/2=12.5
Y: (0-2)/2=-1
4.2举例-优化
上述算法依然有 2 M 2^M 2M的指数复杂度,我们不按照子集S构成的样本来一遍遍walk through这些树,而是通过树的结构来计算这些信息。遍历每棵树的每一个决策节点,记录子集的大小。
该算法递归查找树中的所有路径,并在每个路径的末尾,计算该路径对所有特征的所有SHAP值的贡献。因此,当算法覆盖所有路径时,它可以计算数据集中所有特征的SHAP值
- 对于某个节点使用了特征x来做分裂条件:
那么在经过这个节点时,不管特征组合如何变化,只可能有特征x的存在与缺失两种情况,对应到代码中的one path和zero path的fraction。 - extend:增长path,更新zero/one fraction等信息
- Unwind:判断path中是否已经对这个feature做过split了,如果是的话就undo掉,在这个节点再做split。