模型解释–SHAPValue的简单介绍
摘要
这⼀篇⽂章主要介绍⼀下关于SHAP⽅法,会介绍关于Shapley Value的计算⽅式,通过举例进⾏说明。接着会举⼀个实际的例⼦,来说明如何使⽤SHAP来进⾏模型的解释,和对最后结果的可视化展⽰。
简介
SHAP Value的⽅法。同时介绍⼀下如何简单的绘制结果。还是把参考资料放在最前⾯。
这⼀篇是关于模型可解释性,⽂章会介绍关于SHAP Value安乐窝是什么意思
Shapley Value的相关的内容. 链接分别如下:
在看这个之前, 建议先查看LIME
LIME和Shapley Value
模型解释-LIME的原理和实现
模型解释–Shapley Values
我也是⽤SHAP的思想, 做了⽤于⼊侵检测系统的结果的解释问题, 链接如下:An Explainable Machine Learning Framework for Intrusion Detection Systems
参考资料
⼀本很全的资料(这是⼀份很好的资料) : Interpretable Machine Learning
⼀本很全的资料(这是⼀份很好的资料)
整体了解SHAP(整体结构参考了这篇⽂章)
整体了解SHAP(整体结构参考了这篇⽂章) : Interpreting your deep learning model by SHAP
值得⼀看): One Feature Attribution Method to (Suppodly) Rule Them All: Shapley 也是⼀个很好的资料(对SHAP那篇⽂章做了解释, 值得⼀看
Values
关于NLP模型的解释 :3 ways to interpretate your NLP model to management and customer
SHAP的帮助⽂档 :SHAP (SHapley Additive exPlanations)
SHAP Value⽅法的介绍
SHAP的⽬标就是通过计算x中每⼀个特征对prediction的贡献, 来对模型判断结果的解释. SHAP⽅法的整个框架图如下所⽰:
SHAP Value的创新点是将Shapley Value和LIME两种⽅法的观点结合起来了. One innovation that SHAP brings to the table is SHAP Value的创新点是将Shapley Value和LIME两种⽅法的观点结合起来
了.
That view
that the Shapley value explanation is reprented as an additive feature attribution method, a linear model. That view
connects LIME and Shapley Values.
connects LIME and Shapley Values
最⼤的不同是SHAP中设置了不同的distance的定义, 我们后⾯会讲): SHAP解释的时候使⽤下⾯的表达式, 这个和LIME中的原理是相似的(最⼤的不同是SHAP中设置了不同的distance的定义
当其取值为1的时候, 表⽰的是这个特征是prent(也就是这个特征的取值与我们要解释上⾯的Simplified Features
Simplified Features取值只能是{0, 1}, 当其取值为1的时候, 表⽰的是这个特征是prent(也就是这个特征的取值与我们要解释的instance x中对应的特征是相同的), 当其特征是0的时候, 表⽰这个特征是abnt(这时候我们从数据集中取⼀个这个特征的值, 其他数据在这个特征上的取值).
数据在这个特征上的取值)
Simplified Features都是1. 此时上⾯的式⼦可以化简为:
对于我们要解释的instance x来说, 也就是所有的Simplified Features
就可以看成每⼀个特征的Shapley Value的和做出的贡献, 使得预测结果从均值变为我们预测的结果, 也就是g(x').
这个时候, 就可以看成每⼀个特征的Shapley Value的和做出的贡献, 使得预测结果从均值变为我们预测的结果, 也就是g(x')
KernelSHAP和TreeSHAP. 下⾯我们只详细介绍KernelSHAP
下⾯我们只详细介绍KernelSHAP.
在原始论⽂中, 作者提出了KernelSHAP
KernelSHAP的简单介绍
KernelSHAP包含下⾯的5个步骤:
Simplified Features, 例如随机⽣成(0, 1, 0, 1), (1, 1, 1, 0)等.
初始化⼀些数据, z'z', 作为Simplified Features
f(h(z')).
原始数据空间, 并计算对应的预测值, f(h(z'))
Simplified Features转换到原始数据空间
将上⾯的Simplified Features
这⾥权重的计算是关键, 也是SHAP与LIME不同的地⽅)
对每⼀个z'计算对应的权重(这⾥权重的计算是关键, 也是SHAP与LIME不同的地⽅
拟合线性模型
计算出每⼀个特征的Shapley Value, 也就是线性模型的系数.
Simplified Features是1的时候, 使⽤原始数据的特征, 当Simplified Features
Simplified Features是0的时候, 我们对于上⾯的第⼆个步骤, 我们做⼀下解释, 当Simplified Features
这种置换的⽅式会存在⼀些问题, 当特征之间不是独⽴的, ⽽是相互有关联的, 那么这样⽣成的数据可能是实际上使⽤其他的数据进⾏替换(这种置换的⽅式会存在⼀些问题, 当特征之间不是独⽴的, ⽽是相互有关联的, 那么这样⽣成的数据可能是实际上不存在的), 如下图所⽰.
不存在的
The big difference to LIME is the weighting of the instances 下⾯就是重点介绍对z'权重的计算了, 这个也是SHAP最⼤的不同. (The big difference to LIME is the weighting of the instances in the regression model.)
in the regression model.
LIME根据相似度进⾏计算距离,
LIME根据相似度进⾏计算距离, 如sample的数据中有很多0, 也就是会和原始数据有很⼤的不同, 那么他的距离是远的, 也就是他的权重会是⼩的. (LIME weights the instances according to how clo they are to the original instance. The more 0's in the coalition vector, the smaller the weight in LIME.)
关于雷锋的简介Simplified Features中0的数量, 若有很多0或是很多1, 他的权重都是⽐较⾼的.
SHAP中距离的计算根据Simplified Features
这是因为若都是0, 只有⼀个是1, 那么我们可以很好的计算出那个是1的特征的贡献.
若只有⼀个是0, 我们可以计算出那个是0的特征的贡献.
下⾯是原⽂).
如果⼀半是0, ⼀半是1, 那么会有很多种组合, 就很难计算出每⼀个特征的贡献(下⾯是原⽂
SHAP weights the sampled instances according to the weight the coalition would get in the Shapley value estimation. Small
Small coalitions (few 1's) and large coalitions (i.e. many 1's) get the largest weights. The intuition behind it is: We learn coalitions (few 1's) and large coalitions (i.e. many 1's) get the largest weights
most about individual features if we can study their effects in isolation.
consists of a single feature, we can learn about the features' isolated main effect on the prediction.
高铁抢票If a coalition consists of a single feature
consists of all but one feature, we can learn about this features' total effect (main effect plus feature
If a coalition consists of all but one feature
interactions).
If a coalition consists of half the features, we learn little about an individual features contribution, as there are many possible coalitions with half of the features.
所以最终的SHAP kernel中的weight的计算公式如下:
If you would u the SHAP kernel with LIME on the coalition 使⽤这个weight和线性回归, 计算出的结果就是Shapley Value. (If you would u the SHAP kernel with LIME on the coalition data, LIME would also estimate Shapley values!)
到这⾥为⽌, 我们就有了data, target和weight来计算我们需要的线性回归的式⼦(也就是下⾯的式⼦).
我们可以通过减少下⾯function的loss的⽅法, 来得到上⾯的回归⽅程的系数(也就是Shapley Value). (The estimated coefficients of the model are the Shapley values.)
SHAP的简单使⽤⽅法
说完上⾯的SHAP的⽅法介绍之后, 我们看⼀下在具体使⽤场景中, 我们需要如何来进⾏实现,. 我们可以直接使⽤python中的SHAP的库来进⾏实现.
项⽬地址(这⾥⾯会有最详细的介绍, 下⾯只是简单介绍⼀下我使⽤到的功能): SHAP
SHAP provides multiple explainers for different kind of models.楚乔传宇文席
搀杂
莲花车标TreeExplainer : Support XGBoost, LightGBM, CatBoost and scikit-learn models by Tree SHAP.
DeepExplainer (DEEP SHAP)
DeepExplainer (DEEP SHAP) : Support TensorFlow and Keras models by using DeepLIFT and Shapley values.
GradientExplainer : Support TensorFlow and Keras models.
LIME and Shapley values.
KernelExplainer (Kernel SHAP) : Applying to any models by using LIME and Shapley values
⼀些函数具体的使⽤⽅式, 可以查看SHAP的帮助⽂档, ⽂档的地址如下:
SHAP的帮助⽂档 :SHAP (SHapley Additive exPlanations)
下⾯我们来看⼀下具体的使⽤例⼦, 来看⼀下使⽤SHAP如何来进⾏模型的解释.
需要注意--出现报错的解决
在使⽤Pytorch进⾏模型的创建和解释的时候, 我们需要对模型创建的时候进⾏注意, 需要使⽤Sequential的⽅式进⾏创建. 否则在解释的时候会出现问题. 参考资料: PyTorch Deep Explainer
我们创建模型的时候应该使⽤下⾯的⽅式进⾏创建, 即使⽤Sequential的⽅式进⾏创建
使⽤Sequential的⽅式进⾏创建.
classNet(nn.Module):
def__init__(lf):
super(Net,lf).__init__()
nn.Conv2d(1, 10, kernel_size=5),
少先队之歌nn.MaxPool2d(2),
nn.ReLU(),
nn.Conv2d(10, 20, kernel_size=5),
nn.Dropout(),
nn.MaxPool2d(2),
nn.ReLU(),
)
lf.fc_layers = nn.Sequential(
nn.Linear(320, 50),
nn.ReLU(),
nn.Dropout(),
nn.Linear(50, 10),
nn.Softmax(dim=1)
)
defforward(lf, x):
精彩演讲视频x =lf.conv_layers(x)
x = x.view(-1, 320)# doesn't affect the gradient, so can be outside an nn.Module object x =lf.fc_layers(x)
returnx
⽽不要使⽤下⾯的⽅式进⾏创建.
classNet(nn.Module):
def__init__(lf):
super(Net,lf).__init__()
lf.fc1 = nn.Linear(320, 50)
lf.fc2 = nn.Linear(50, 10)
defforward(lf, x):
x = F.relu(F.max_v1(x), 2))
x = F.relu(F.max_v2_v2(x)), 2))
x = x.view(-1, 320)
x = F.relu(lf.fc1(x))