作者:Samuele Mazzanti编译:ronghuaiyang
上一篇文章我们说到SHAP值可以用来对黑盒模型进行解释,具备比简单的逻辑回归更好的实际意义,那么SHAP值到底是什么?有什么实际意义?如何计算?
揭开神秘的面纱
==========
在上次的文章中,我们看到SHAP值可以用来解释机器学习方法的决策。换句话说,我们使用SHAP来揭开黑箱模型的神秘面纱。
到目前为止,我们利用了Python的SHAP库,而没有过多考虑它是如何工作的。足够讽刺的是,我们使用的SHAP本身就是一个黑盒!然而,理解SHAP值计算背后的思想对于理解它们的结果是至关重要的。
这就是为什么,在这篇文章中,我们将过一遍Slundberg和Lee在论文:https://arxiv.org/abs/1705.07... Additive exPlanations的理论基础,并看看为什么SHAP值是按照他们计算的方式来计算的。
博弈论和机器学习
SHAP值基于Shapley值,Shapley值是博弈论中的一个概念。但博弈论至少需要两样东西:一个游戏和一些玩家。这如何应用于机器学习的可解释性?假设我们有一个预测模型,然后:
- “游戏”是复现模型的结果
- “玩家”是模型中包含的特征
Shapley所做的是量化每个玩家对游戏的贡献。SHAP所做的是量化每个特征对模型所做预测的贡献。
需要强调的是,我们所谓的“游戏”只涉及单一的观察样本。一个游戏:一个观察样本。实际上,SHAP是关于预测模型的局部可解释性的。
特征的power set(幂集)
举个例子,我们可以想象一个机器学习模型(假设是线性回归,但也可以是其他任何机器学习算法),知道这个人的年龄、性别和工作,它可以预测一个人的收入。
Shapley值是基于这样一种想法,即应该考虑每个玩家可能的组合的结果来决定单个玩家的重要性。在我们的例子中,这对应于_f_特征的每个可能组合(_f_从0到_F_, _F_是所有可用特征的数量)。
在数学中,这被称为“power set”,可以用树表示。
每个节点代表一个特征组合,每条边代表包含一个在前一个组合中不存在的特征。
我们从数学上知道一个幂集的容量是2^n^,其中_n_是原始集合的元素个数。实际上,在我们的例子中,我们有2^F^ = 2^3^= 8个可能的特征的组合。
现在,SHAP需要为幂集中的每个不同的组合训练一个不同的预测模型,这意味着有2^F^个模型。当然,这些模型在涉及到它们的超参数和训练数据时是完全等价的。唯一改变的是模型中包含的一组特征。
假设我们已经在相同的训练数据上训练了8个线性回归模型。我们可以用一个新的观察样本(我们称之为x₀),看看同样的8种不同的模型对这个观察样本的预测。
用不同模型预测x₀。在每个节点上,第一行表示特征的组合,第二行为x₀的模型预测收入。
这里,每个节点代表一个模型。但是边代表什么呢?
构建SHAP公式(1/2) — 特征的边际贡献
正如上面所看到的,由一条边连接的两个节点只因为一个特征而不同,即底部的节点与上部的节点具有完全相同的特征,而上部的节点则没有。因此,两个连接节点的预测之间的差距可以归结为该附加特征的影响。这被称为特性的“边际贡献”**。
因此,每条边代表一个特征对模型的边际贡献。假设我们在节点1中,节点1是一个没有任何特征的模型。该模型将简单地预测所有训练观察样本值的平均收入(50k美元)。如果我们到了节点2,这是一个模型只有一个特征(年龄),现在对x₀的预测为40k美元。这意味着知道x₀的年龄降低了我们的预测10k美元。
因此,年龄对只包含年龄作为特征的模型的边际贡献是-10k$。公式:
当然,获得年龄对最终模型的整体效果(即x₀的年龄的SHAP值),有必要考虑年龄在所有出现过模型的边际贡献。在我们的树表示中,这意味着要考虑连接两个节点的所有边:
- 上一个节点不包含年龄,且
- 下一个节点中包含年龄
在下面的图中,这些边已经用红色突出显示。
所有这些边际贡献然后通过加权平均数加以汇总。公式:
构建SHAP公式(2/2) — 边际贡献的加权
我们如何确定边的权重(即4个模型中年龄的边际贡献)?
想法是:
- 所有边际贡献对具有1个特征的模型的权重之和应等于所有边际贡献对具有2个特征的模型的权重之和,以此类推……,换句话说,同一“行”上所有权值的和应该等于任意其他“行”上所有权值的和。在我们的例子中,这意味着:_w₁= w₂+ w₃= w₄_
- 对每个_f_,_f_个特征的模型的所有的边际贡献的权重应该是相等的。换句话说,同一“行”上的所有边应该相等。在我们的例子中,这意味着:_w₂ = w₃_
因此,(记住它们的和应该是1):
- w₁ = 1/3
- w₂ = 1/6
- w₃ = 1/6
- w₄ = 1/3
看看上面的图,你能猜出一般框架中确定权重的模式吗?
剧透:边的权值是同一“行”中边总数的倒数。或者,同样地,_f_个特征的模型的边际贡献的权重是可能的边际贡献的数量的倒数。
有计算这个的公式吗?其实很简单。
每个_f_个特征的模型都有_f_个边际贡献(每个特征一个),因此,计算可能的_f_个特征的模型的数量并将其乘以_f_就足够了。因此,问题归结为计算可能的具有_f_个特征的模型的数量,给定_f_并知道特征的总数是_F_。这就是二项式系数的定义。
把所有的东西放在一起,我们得到了所有的具有_f_个特征的模型的所有边际贡献的数量,换句话说,每“行”的边的数量是:
如何从边的数量中获得权重
现在,我们已经有了计算_x₀_的Age的SHAP值所需的所有元素:
应用到我们的例子中,得到:
- SHAP\_Age(_x₀_) = -11.33k $
- SHAP\_Gender(_x₀_) = -2.33k $
- SHAP\_Job(_x₀_) = +46.66k $
把它们加起来就是+33k,这正好是完整模型的输出(83k )和没有任何特征的虚拟模型的输出(50k)之间的差值。
这是SHAP值的一个基本特征:给定观察样本的每个特征的SHAP值加起来得到模型预测值和没有模型(或者是逻辑回归函数)之间的差别。这就是这个名字的由来:SHapley Additive exPlanations。
好极了!我可以自己计算SHAP值吗?
呃……不行!
如上所述,原来的SHAP公式需要训练2^F^个模型。对于一个只有50个特征的模型,这意味着要训练1e15个模型!实际上,随着_F_的增加,上面的公式很快就不适用了。
然而,像Slundberg提供的库:https://github.com/slundberg/...,使这项工作变得可行。
—END—
英文原文:https://towardsdatascience.co...
推荐阅读
关注图像处理,自然语言处理,机器学习等人工智能领域,请点击关注AI公园专栏。
欢迎关注微信公众号