SHAP值基于Shapley值,Shapley值是博弈论中的一个概念。SHAP所做的是量化每个特征对模型所做预测的贡献。
对于所有的特征上图(Age、Gender、Job)可以自由组合共有2^3=8种可能(数学中称为power set即幂集)。SHAP需要为幂集中的每个不同的组合训练一个不同的预测模型,这意味着有8个模型。当然,这些模型在涉及到它们的超参数和训练数据时是完全等价的。唯一改变的是模型中包含的一组特征。
假设上图是已经用相同训练样本训练了8个线性回归的模型。我们可以用这8个模型分别对一个测试样本做预测(x1),最后得出8个预测结果如上图。因为SHAP值所做的是量化每个特征对模型所做预测的贡献,因此需要计算出每个特征的SHAP值。
对于模型2中Age可以算出年龄作为特征的模型的边际贡献是:
M C A g e , { A g e } = P r e d i c t { A g e } ( x 1 ) − P r e d i c t ∅ ( x 1 ) = 40 k $ − 50 k $ = − 10 k $ MC_{{Age},\{Age\}}=Predict_{\{Age\}}(x1)-Predict_\varnothing(x1) = 40k\$-50k\$ = -10k\$ MCAge,{Age}=Predict{Age}(x1)−Predict∅(x1)=40k$−50k$=−10k$
要获得年龄对最终模型效果的影响需要将所以涉及到Age的模型的边际贡献汇总。上图展示了所有涉及年龄的模型(1、2、5、6、8),可以得到年龄的贡献值(SHAP值)如下:
S H A P A g e ( x 1 ) = w 1 ∗ M C A g e , { A g e } ( X 0 ) + w 2 ∗ M C A g e , { A g e , G e n d e r } ( X 0 ) + w 3 ∗ M C A g e , { A g e , J o b } ( X 0 ) + w 4 ∗ M C A g e , { A g e , G e n d e r , J o b } ( X 0 ) \begin{aligned} SHAP_{Age}(x1)=&w_1*MC_{{Age},\{Age\}}(X0) +\\ &w_2*MC_{{Age},\{Age,Gender\}}(X0)+\\ &w_3*MC_{{Age},\{Age,Job\}}(X0)+\\ &w_4*MC_{{Age},\{Age,Gender,Job\}}(X0)\\ \end{aligned} SHAPAge(x1)=w1∗MCAge,{Age}(X0)+w2∗MCAge,{Age,Gender}(X0)+w3∗MCAge,{Age,Job}(X0)+w4∗MCAge,{Age,Gender,Job}(X0)
其 中 w 1 + w 2 + w 3 + w 4 = 1 其中w_1+w_2+w_3+w_4=1 其中w1+w2+w3+w4=1
如何确定边际贡献的权重:
上图为前5个样本的数据(Pclass:客舱等级;Sex:乘客性别;Age:乘客年龄;SibSp:泰坦尼克号上的兄弟姐妹/配偶人数;Parch:泰坦尼克上的家长/儿童人数;Fare:乘客票价;Embarked:登船口岸)
上图横向为变量,纵向为样本的每个样本变量的SHAP值(以Catboost模型为例)。SHAP值越高,生还概率越高,反之亦然。此外,大于0的SHAP值会导致概率的增加,小于0的值会导致概率的减少。
假设对于第一个个体,我们知道除了年龄以外的所有变量。它的SHAP和是-0.36 -0.76 +0.05 -0.03 -0.3 -0.08 = -1,48。一旦我们知道了个体的年龄(也考虑了年龄和其他变量之间的相互作用),我们就可以更新总和:-1.48 +0.11 =-1.37。
上图基于Python的SHAP库来进行画出(SHAP值对于人类来说是不可理解的(即使对于数据科学家来说也是如此))
SHAP值是一个任意实数,而概率是在[0,1]范围内。因此需要一个函数f(.)将SHAP转化为概率(f(.)可以是满足条件的任何函数,并不是确定的)。即:
p r e d i c t e d _ p r o b a b i l i t y = f ( S H A P _ s u m ) predicted\_probability=f(SHAP\_sum) predicted_probability=f(SHAP_sum)
假设已知除年龄外的所有变量,其SHAP和为0。现在假设年龄的SHAP值是2。f()函数就可以量化年龄对预测的生存概率的影响:它就是f(2)-f(0)。在我们的例子中,f(2)-f(0) = 80%-36% = 44%。按照这种思路可以算出每个格子中的影响(impact),可以应用以下公式:
i m p a c t = p r e d i c t e d _ p r o b a b i l i t y − f ( S H A P _ s u m − S H A P _ f e a t u r e ) impact = predicted\_probability-f(SHAP\_sum-SHAP\_feature) impact=predicted_probability−f(SHAP_sum−SHAP_feature)
得到如下的格子影响:
拥有一张三等舱的票会降低第一个乘客的生存概率-4.48%(相当于-0.36 SHAP)。请注意,3号乘客和5号乘客也在三等舱。由于与其他特征的相互作用,它们对概率的影响(分别为-16.65%和-5.17%)是不同的。
图一是乘客年龄的边际效应,图二是乘客票价的边际效应,图三是交互作用:乘客票价 vs. 客舱等级。红线表示平均效应(一组中所有个体的年龄效应的均值),蓝带(均值±标准差)表示同一组中个体年龄效应的变异性。变异是由于年龄和其他变量之间的相互作用。以上3个图可提供的价值有:
1.https://www.6aiq.com/article/1588001724187
2.https://towardsdatascience.com/black-box-models-are-actually-more-explainable-than-a-logistic-regression-f263c22795d