1-概述
该篇论文主题是广告系统中针对广告收入异常波动根本原因分析;
提出的Adtributor算法主要是基于指标期望值和实际值的分布,计算其js散度,找到影响指标最大的维度及其维值集合。
此外,论文也针对衍生指标的根因分析方法做了讨论(这块没有深入看)
2-问题&引入
针对一组维度(每个维度多个维值)下指标,如数据中心、广告商、终端设备这三个维度下的广告收入,如果某天广告收入剧降50%(期望100,实际收入50),那么需要定位到到底是哪个维度下哪些维值导致的广告收入的剧降---简单理解为找到对广告收入波动影响最大的因素(维度->维值);
![](https://upload-images.jianshu.io/upload_images/15794255-a093bbdad0b3795b.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如何找到引发广告收入波动的主要因素,作者引入下面辅助概念/方法:
Boolean表达式
作者用一个boolean表达式量化表示出广告收入的波动影响,针对上面三个分维度的广告收入波动情况表中,可以表示为:
![](https://upload-images.jianshu.io/upload_images/15794255-5f6253de44347c2f.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
稻草人方法(strawman approach)
根因分析如何找到最优解: 作者提出了一个稻草人方法(strawman approach):找出维度和该维度下一组元素,其收入下降至少是总收入下降的阈值分数TEP,并且最简洁。
explanatory power (EP)-解释力
作者定义explanatory power (EP)-解释力量化为它解释度量变化的分数。 我们将一组元素的简洁性(P)量化为表达式中元素的总数。 因此,稻草人将找到具有至少TEP的解释力的表达式,并且使用最少数量的元素。
由上面三个定义,如果使用Occam剃刀原则-简单有效原理--只要在一定误差范围下,最简洁的就是最好的解释。针对上面三个boolean表达式,设置TEP阈值为90%,那仅数据中心下维值X就可以解释总下降的94%;但是这种方法在存在多个维度时具有导致根的缺陷,虽然数据中心X的收入下降占总收入下降的94%,但预测和实际收入在两个数据中心X和Y之间平均分配。数据中心X提供了94%的预测收入(94美元中的 100美元)和94%实际收入(50美元中的47美元)。 数据中心Y在两个价值中贡献了6%。 相比之下,在设备类型维度中,设备类型PC占预测收入的50%(100美元中的50美元),但实际收入的98%(50美元中的49美元)。 移动和平板电脑类型的贡献也有很大差异,从预测收入的25%到实际收入的0%。 贡献因广告尺寸而异,但不如设备类型尺寸那么多。
作者提出,针对广告收入根因分析可以拆解三块:
对于维度,找到至少解释度量变化的阈值分数TEP的所有元素集(具有高解释力)。
在每个维度的所有此类集合中,找到该维度中最简洁的集合。
对于所有维度的所有此类集合,找到在贡献变化方面最令人惊讶的集合。
3-算法核心
3-1 基础定义和核心概念:
符号定义
![](https://upload-images.jianshu.io/upload_images/15794255-db775eb7a5ff656a.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Explanatory power
EP:该维度i的维值j的实际波动占总体波动贡献
EPij = (Aij(m) − Fij )/(A(m) − F (m))
Surprise
先计算每个维度的元素预期指标占比分布和实际指标占比分布:
![](https://upload-images.jianshu.io/upload_images/15794255-8ab964ec220991ac.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
获取这两个占比后,一般是使用K-L散度来衡量两个分布的差异,但是由于K-L散度非对称且可能无界,所以使用JS散度来表示:
![](https://upload-images.jianshu.io/upload_images/15794255-556f6629fc2e5c37.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
针对每个元素,其surprise Sij这样计算:
![](https://upload-images.jianshu.io/upload_images/15794255-f87544d74c8072a4.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3-2 算法流程
其伪码计算流程如图:
![](https://upload-images.jianshu.io/upload_images/15794255-126dbe78b7e76e7b.png&contentType=2&isDownload=false&token=7cebc47e32*c421b88caf0807adce896&isNewContent=false&isViewPage=true?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
算法使用了以下贪婪的启发式算法,而不是枚举具有至少TEP解释力的各种最小基数子集。在每个维度中,在计算所有元素的surprise(第1-5行)之后,它首先按照surprise的顺序对元素进行排序(第8行)。然后,只要该元素至少解释了总异常变化的TEEP(第12-15行),它就会将每个元素添加到候选集中。参数TEEP有助于控制集合的基数(奥卡姆剃刀)。例如,如果TEEP为10%且TEP为67%,我们最多可以有7个元素来解释异常变化。此外,通过将suprise倒序排列,贪婪地寻求最大化候选集的suprise。 该算法每个维度最多添加一个候选集(第16-19行),只要该集合能够解释异常变化(解释力)的大多数(TEP)。 最后,该算法按照其惊喜值对各种候选集进行排序,并将前三个最令人满意的候选集作为潜在的根本原因候选者返回(第21-22行)。
算法最终输出是Suprise的top3的元素集合(每个维度有一个Suprise)