近年来人工智能的浪潮越来越汹涌,以神经网络、集成模型为代表的机器学习模型在数据挖掘领域中发挥着不可替代的作用。在追求模型高精度的道路上,工业界和学术界也十分关注模型的可解释性,期待从复杂模型中得到更直观的理解。可解释机器学习作为索信达金融AI实验室的重要研究方向之一,包括了内在可解释模型和事后可解释方法。我们希望可以通过一系列文章来介绍解释不同模型的方法,并分享与实际场景相结合的业务与技术心得。
在当今的金融、医疗等数据挖掘的应用领域中,模型的可解释性和精度是同等的重要。众所周知,精度较高的模型,如集成模型,深度学习模型等,内部结构复杂多变,不能直观理解。SHAP,作为一种经典的事后解释框架,可以对每一个样本中的每一个特征变量,计算出其重要性值,达到解释的效果。该值在SHAP中被专门称为Shapley Value。因此Shapley Value是SHAP方法的核心所在,理解好该值背后的含义将大大有助于我们理解SHAP的思想。
Shapley value最早由加州大学洛杉矶分校(UCLA)的教授Lloyd Shapley提出, 主要是用来解决合作博弈论中的分配均衡问题。Lloyd Shapley是2012年的诺贝尔经济学奖获得者,也是博弈论领域的无冕之王。
我们已有的数据集中会包含很多特征变量,从博弈论的角度,可以把每一个特征变量当成一个玩家。用该数据集去训练模型得到的预测结果, 可以看成众多玩家合作完成一个项目的收益。Shapley value, 通过考虑各个玩家做出的贡献,来公平地分配合作的收益。
可以通过一个小例子来看如何计算Shapley Value。
假设:合作项目 Proj=<Players, v>
Players={1,2,…n}, 每个玩家在这个项目中所做的贡献量的特征方程是v。
定义Proj=500行代码,由3个程序员完成,这就对应3个玩家:1,2,3。
每个玩家可以独立完成的代码:$v({1})=100$, $v({2})=125$, $v({3})=50$
如果合作:$v({1,2})=270$,$ v({2,3})=350$, $v({1,3})=375$, $v({1,2,3})=500$。
具体的合作过程有6种情况:
玩家1邀请玩家2, 玩家2接着邀请玩家3;
玩家1邀请玩家3, 玩家3接着邀请玩家2;
玩家2邀请玩家1, 玩家1接着邀请玩家3;
玩家2邀请玩家3, 玩家3接着邀请玩家1;
玩家3邀请玩家1, 玩家1接着邀请玩家2;
玩家3邀请玩家2, 玩家2接着邀请玩家1;
用图来表示:
如果我们要合理分配,是否公平主要看边际贡献。
先定义第i个玩家加入组织S的边际贡献 $\delta(i)=v(S \cup {i})-v(S)$
挑选第一种情况为例:
玩家1边际贡献: $v({1})=100$
玩家2边际贡献: $v({1,2})-v({1})=270-100=170$
玩家3边际贡献: $v({1,2,3})-v({1,2})=500-270=230$
按照上面的计算过程,依次计算剩下的5种情况。同时考虑到这6种情况是等概率出现的。完整结果如下图:
计算第i个玩家的Shapley Value, 主要是由上图的边际贡献得到。
所以按照比例来分配奖金:
SHAP全称是SHapley Additive exPlanation, 属于模型事后解释的方法,可以对复杂机器学习模型进行解释。虽然来源于博弈论,但只是以该思想作为载体。在进行局部解释时,SHAP的核心是计算其中每个特征变量的Shapley Value。
SHapley:代表对每个样本中的每一个特征变量,都计算出它的Shapley Value。
Additive:代表对每一个样本而言,特征变量对应的shapley value是可加的。
exPlanation:代表对单个样本的解释,即每个特征变量是如何影响模型的预测值。
当我们进行模型的SHAP事后解释时,我们需要明确标记。已知数据集(设有M个特征变量,n个样本),原始模型f,以及原始模型f在数据集上的所有预测值。g是SHAP中用来解释f的模型。
先用f对数据集进行预测,得到模型预测值的平均值$\phi_{0}$。单个样本表示为$x=(x_1,x_2…x_M)$,$f(x)$为在原始模型下的预测值。 $g(x)$是事后解释模型的预测值,满足$g(x)=\phi_{0}+\sum_{i=1}^{M} \phi_{i}x_{i}=f(x)$。其中$\phi_{i}$代表第i个特征变量的Shapley Value,是SHAP中的核心要计算的值,需要满足唯一性。同时上述模型g需要满足如下的性质:
性质1:局部保真性 (local accuracy)
即两个模型得到的预测值相等。当输入单个样本$x$到模型g中时,得到的预测值$g(x)=\phi_{0}+\sum_{i=1}^{M}\phi_{i}x_{i}^{’}$与原始模型得到的预测值$f(x)$相等。
性质2:缺失性(missingness)
如果在单个样本中存在缺失值,即某一特征变量下没有取值,对模型g没有影响,其Shapley Value为0。
性质3:连续性(consistency)
当复杂模型f从随机森林变为XGBoost,如果一个特征变量对模型预测值的贡献增多,其Shapley value也会随之增加。
在上述3个限制条件下,可以理论证明求出唯一的$\phi_{i}$,即对应的模型g也是独一无二的。具体证明可参考 Shapley’s paper (1953).。
$\phi_{i}(f,x)=\sum_{S\subseteq \lbrace N \backslash i \rbrace }\frac{|S|!(M-|S|-1)!}{M!}[f_{x}(S\cup i)-f_{x}(S)]$
N={1,2…M}代表数据集中特征变量下标,1代表第一个特征变量,以此类推,i是第i个特征变量,M是特征变量的总个数。S是集合{1,2…i-1,i,…M}的子集,有$2^{M-1}$种可能。$|S|$是S中的元素的总个数。$f_{x}(S\cup i)$代表当样本中只有$S\cup i$中的特征变量值时,模型的预测值。$f_{x}(S\cup i)$代表当样本中只有$S$中的特征变量值时,模型的预测值。二者相减,可当成第i个特征变量在子集S下的边际贡献。前面的权重(kernel): $\frac{|S|!(M-|S|-1)!}{M!}$ 是根据排列组合的公式得到, 代表有相同元素个数的S存在的概率。
$\phi_{i}$就是众所周知的第i个特征变量的Shapley Value。SHAP的核心是计算这个理论的Shapely Value,如果直接计算,由于特征子集的多种可能,上述计算方式的时间复杂度是指数级的。因此围绕着如何计算Shapley Value,我们根据对Shapley Value计算的两种近似方法将SHAP分为两大类。
Kernel SHAP
该方法借用LIME方法(详情请见可解释机器学系列文章第二篇)来估计出解释模型g中的$\phi_{i}$,属于model-agnostic的方法。Linear LIME是指使用线性模型$\omega_{0}+\sum_{i=1}^{n}\omega_{i}x_{i}$来近似原始复杂模型f。从模型的构成来看,Linear LIME拟合的回归模型与SHAP模型$\phi_{0}+\sum_{i=1}^{n}\phi_{i} x_{i}$一脉相承,满足特征的可加性。
设定好LIME中的正则化参数,加权的核函数以及损失函数进行设定。设定模型复杂度$\Omega(g)$设为0,加权核函数$\pi_{x}(z)=\frac{(M-1)}{(M choose |z|)|z|(M-|z|)}$,损失函数$L(f,g,\pi_{x}(z))=\sum_{z \in Z}\pi_{x}(z) [f(z))-g(z)]^{2}$。x是要解释的样本,z是抽取的样本点,M是x的维度,$|z|$是z的维度。
利用LIME来估计出模型g中每个变量对应的系数,也就是SHAP中的$\phi_{i}$,得到关于权重$\phi_{i}$的唯一解,在这里称为Shapley kernel。
如果我们已知复杂模型的种类,比如树集成模型,深度学习模型等,那么可以用更快更高效的方法来计算对应每个样本中的每个特征变量的shapley value。对于不同的模型,计算Shapley Value也是不同的。TreeSHAP是专门针对树模型的SHAP方法,下面会重点介绍。
TreeSHAP
树集成模型中包括很多性能优良的黑箱模型,比如随机森林、XGBoost、LightGBM和CatBoost,都属于非线性模型。Scott M. Lundberg,Su-In Lee等提出了TreeSHAP来对树模型进行局部解释。相对于model-agnostic的局部解释方法,TreeSHAP不需要抽样,而是通过对树模型中的节点来计算Shapley Value,具体算法可以参考论文2。
TreeSHAP有如下优点:
1. 计算时间减少
如果直接用Shapley Value的公式来计算,时间复杂度是指数级的,但是TreeSHAP将中计算Shapley Value的算法进行优化,时间复杂度变为线性,因此可以大大缩短运行时间。
2. 将局部解释拓展到抓取交互效应
对于每一个样本, 局部解释会对其中的每一个特征变量计算对应的值。直观来看,这种解释不能让我们直接地看到交互作用。为解决这个问题,TreeSHAP提供了计算SHAP interaction value(参考论文2)的方法来看模型内部的交互作用。
3. 基于众多局部解释来进行全局解释
对于整个数据集,可以运用Shapley Value来高效准确地获得局部解释性,即对每个样本的解释,可以帮助我们得到特征变量的全局解释。对于某一个特征变量,TreeSHAP可以计算出所有样本中对应该变量的Shapley Value, 将它们的平均值作为该特征的重要性值,从而得到全局解释。
介绍完如何计算Shapley Value之后,要开始解读是Shapley Value如何影响原始模型f的预测值。假设数据集中有4个特征变量$z_1,z_2,z_3,z_4$,用原始模型f预测之后,我们以模型预测值的平均值作为其期望$E(f(z))$,即$\phi_0$。以单个样本$x=(x_1,x_2,x_3,x_4)$为例,它在原始模型中的预测值为$f(x)$, 我们计算出4个对应的Shapley Value $\phi_1,\phi_2,\phi_3,\phi_4$后开始解释。
对于整个数据集而言,$\phi_0$是固定的,是模型预测的平均值,可为正也可为负。上图解释了这个样本预测值与平均预测值之间存在差异的原因 。蓝色的箭头代表Shapley Value的值为正,意味着该特征变量对原始模型的预测值有一个正向的影响。红色的箭头代表Shapley Value的值为负,意味着该特征变量对原始模型的预测值有一个负向的影响。从图中可以看出,$\phi_4<0<\phi_1<\phi_3<\phi_2$, 所以特征变量$z_1,z_2,z_3$对$f(x)$有正向的作用,且$z_2$的作用最强。$z_4$的存在则对$f(x)$构成了负向的作用。最终在这4个特征变量的力的作用下,将该样本$x$的原始模型预测值从平均值达到了$f(x)$。
SHAP可以用来解释很多模型。接下来在台湾银行数据集上用Tree SHAP来解释复杂树模型XGBoost。
Tree Explainer是专门解释树模型的解释器。用XGBoost训练Tree Explainer。选用任意一个样本来进行解释,计算出它的Shapley Value,画出force plot。对于整个数据集,计算每一个样本的Shapley Value,求平均值可得到SHAP的全局解释,画出summary plot。
#训练TreeExplainer
explainer=shap.TreeExplainer(clf)
shap_values=explainer.shap_values(test)
#局部解释
shap.force_plot(explainer.expected_value,shap_values[9,:], test.iloc[9,:])
#全局解释
shap.summary_plot(shap_values, test, plot_type="bar")
下图是Tree SHAP对任意一个样本画出的force plot,由于Treeshap是对对数几率(log odd ratio)进行解释,所以出现负数。具有负向影响的变量变为PAY_AMT1和LIMIT_BAL等,具有正向影响的特征变量加入PAY_AMT6,PAY_0。其他变量的Shapley Value由于值太小就不一一列举。
在summary plot中PAY_0该特征最重要,其次是LIMIT_BAL,PAY_AMT1。
本文先引入博弈论中的经典问题:如何公平分配每个玩家对项目的收益,来介绍每个玩家的Shapley Value。通过类比的思想,将数据集中的特征变量当做玩家,模型的预测值当做项目的收益。对于单个样本而言,每个特征变量计算出来的Shapley Value,可以将其理解为该特征如何影响原始模型的预测值。接下来围绕着如何计算Shapley Value提出SHAP的两种分类,一种是Kernel SHAP,对应model-agnostic方法。剩下的分类是对特定模型的,其中着重介绍了TreeSHAP。然后对计算出的Shapley Value应用博弈论的方法来进行局部解释,全局解释则是基于众多样本的局部解释而得到。最后用台湾银行信用卡数据集实践了TreeSHAP,并介绍几种重要的图,包括force plot、summary plot。
领取专属 10元无门槛券
私享最新 技术干货