优秀的编程知识分享平台

网站首页 > 技术文章 正文

到底有多重要?shapley value来解释解释

nanyue 2025-05-14 15:32:15 技术文章 4 ℃

无论是全局特征重要性分析,还是单个样本的特征贡献解释,SHAP都能提供清晰的视角。本文将通过实际案例,展示如何利用SHAP来分析数据,优化决策,并提供相关代码资源供读者参考。

1. 为什么执着于因素解释

我们常会遇到,在事后归因时能知道贡献来源,比如下图,它解释了总收入同比增长1000元,主要是老客购买A品类30元以上商品和新客购买C品类10元以下商品贡献的。

但接下来的问题是:要保持增长应该怎么办?还要在之前优势的品类和人群上继续投入吗?效果会好吗?

之所以在此时会决策犹豫,是因为我们知道了它带来增长,但不知道为什么它会带来增长。想要知道到底是什么因素导致了这个策略成功,即这类用户会购买这个商品,它就变成了一个y=f(xi)因素解释问题,y是否会购买,xi就是是否购买时候的一个个决策要素:

  • 可能是反复浏览了很多次,刚好降价了,就买了,
  • 可能是贵和便宜的同类商品同时出现,买了个便宜的,
  • 可能是它就是常买的品牌,顺手就买了

等等……

什么因素影响最大,这时候模型解释就派上了用场。

(绕了这么久终于开始进入正题了。。。)

2. 白话讲shapley value是怎么算的

之前说过线性回归模型解释有一些局限

① 如果变量并非呈线性,对目标影响就很难解释;

② 只能说明全局特征的贡献度,不能做个体解释。

现在来介绍一个不挑模型的解释方法:SHAP

shapley value源自于博弈论里的方法,用来解决多人合作模式下,如何公平分配收益的问题。

举例来说,假如几个人合作对一个艺术品竞拍,合作方式有:1人投、2人投、3人投,在不同的投资组合下以及不同的顺序下,他们投入的金额是不同的,如下图所示,那么未来这个艺术品升值所带来利润要如何分配?

如果以玩家A->C->B这个入场顺序来看,A入场贡献7,C入场边际贡献=AC-A=15-7=8,B入场边际贡献=ABC-AC=19-15=4

可以计算出每种不同顺序下每个人的贡献,除以6即为组合情况下的shapley value值

A=(7+7+10+3+9+10)/6=7.7

B=(4+0+4+4+4+3)/6=3.2

C=(8+12+5+12+6+6)/6=8.1

如果用公式表示,长这样:

这个抓狂的公式理解起来,就是样本x第j个特征xj的贡献值为所有特征的贡献值减去排除xj特征剩下所有特征的贡献值是多少,以此来计算xj对x的贡献,就和上边的案例是一个意思。

要把这个算出来,计算量十分庞大,因此演化了新的方法SHAP,它是Shapley Additive exPlanations的缩写,公式是

其含义是对于一个随机样本i,在预测均值的基础上,每个特征j不断对其拉扯,最后得到i预测值,而j就是i样本j特征的边际贡献值shapley value,有kernelSHAP 和 treeSHAP两个方法可以求出j,在此就不对计算过程做详细讨论,主要来解释SHAP值怎么用。

3.SHAP值是怎么用的

如上图,以YouTube18年的某日浏览量为例 (数据源为kaggle公开数据)

  • 目标:是否会是2018年5月25日浏览top200视频
  • 变量:其他字段

现在想知道对于成为25日高浏览量的视频,与 视频的发布时间、单日浏览增量、或者用户反馈的喜欢增量或者历史累计量等等,哪个因素贡献最大,这样就能指导我们在某个方面进行优化。

(当然,实际上一个视频是否会成为一个爆款,影响因素很多,这里只是简单列举了一些行为反馈因素,除此之外还有视频原始特征,本身的内容和创意才是更有价值的。。。)

操作过程为:先使用lightGBM训练一个分类模型,然后使用shap,来计算每个特征对样本的shapley value。

这里有个需要注意的是:如果使用的是树模型,对应的是TreeExplainer,另外还有DeepExpainer适合TensorFlow模型,或者选择KernelExplainer,适用任何模型。

接下来输出shap value总体特征的平均值,看起来和特征重要性长得差不多,它表示对成为一个高浏览量的热门视频,历史累计的喜欢量贡献最大,其次是单日增量喜欢率(这里的shap value为绝对值平均值)

如果把所有样本都打上,会发现有意思的事情,历史累计喜欢量为正向shap贡献,而单日增量喜欢率却反之。

更美妙的是,它还能解释单个样本的因素贡献。

如下我随机选了一个样本50,它表示在所有样本平均shap值E[f(x)]=-7.36的情况下,该样本通过自身特征20180524likes-5.56,view_diff-4.27等等,将该样本成为一个热门视频的shap值推到f(x)=-13.46,这已经可以解释在单个样本下是哪个具体因素影响程度,但对于预测值又是如何影响的呢?

这里可以把样本预测概率和shap值进行一个映射,来更直观的知道对于预测概率,影响程度是多少,如下这个公式,通过python里interpolate的一维插值interp1d函数

再通过去掉其中一个特征的shap值,来计算对应的概率,与原始概率的差值,即为该特征对这个样本预测概率的贡献。

通过以上公式,样本50转换到概率预测上,可以看到总体特征贡献最大的

20180524likes,这个视频没有和热门视频一样有个历史累计很高的like量,让它成为热门视频的概率降低了6.84854%,但是新增浏览的喜欢转化对它是正向概率贡献,在逐步被适合的人群看到后,逐步积累浏览量,就可以再等等~

同时可推断,在全局上,历史累计的喜欢量是大部分视频第二天会继续成为热门视频的主要因素(限在现有特征内),但它会随着浏览量的增加逐渐泛化到不会喜欢看的人的身上,从而让新增的喜欢率变低,如此往复和叠加,会形成整体生态的循环迭代。

参考资料

shapley value 计算原理
https://zhuanlan.zhihu.com/p/82462362

shapley value 映射
https://blog.csdn.net/sinat_26917383/article/details/115556182

本文由人人都是产品经理作者【小王子和小企鹅】,微信公众号:【小王子和小企鹅】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载。

题图来自Unsplash,基于 CC0 协议。

Tags:

最近发表
标签列表