算法效果AB测试中的PV-UV不对称性
2017-04-10 11:14
746 查看
本文系转载,源地址http://www.cnblogs.com/bqzhao/p/3259380.html
算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果。通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比。为了表述简单,我们假设参与对比的算法有两个,比较的指标是CTR。这里面的关键细节有两个:1. 如何划分浏览?2. 如何计算CTR。下面从这两个角度讨论可能出现的问题。
定义1:按PV划分流量,是指对任意一个访问,按照预先设定的比例,随机分配到一个算法中。需要注意的是,在这种情况下,每个用户会被随机分配到一个算法中。
定义2:按UV划分流量,是指对任意一个访问,按照预先设定的比例,对用户ID进行哈希和取模等操作,将流量划分到一个算法中。在这种情况下,每个用户有一个确定的算法与之对应。
定义3:按PV计算CTR,CTRPV(A)=A算法下用户点击的PV数A算法下总的PV数
定义4:按UV计算CTR,CTRUV(A)=A算法下有点击的用户数A算法下总的用户数
场景1:按PV划分流量,按PV计算CTR。
这种情况比较简单,在忽略用户对算法疲劳度(通常是合理的)的情况下,这种测量对比方案比较合理。
场景2:按PV划分流量,按UV计算CTR。
这个方案可能一些有经验的同学会觉得不行,另一些同学会觉得问题也不大。事实上,这会导致严重的测量误差,我们用AA测试的效果来分析一下。假定流量分成两个桶,第1个桶占比是p1,第2个桶占比为p2,且p1+p2=1。设该算法的PV的转化率(CTR)为r。
这里需要分为两种情况来讨论:
第1种情况:假设产生无论实际的转化在哪个桶中产生,将转化率计算到该用户到达的每个桶中。
对一个访问次数为K=k的用户,其整体转化率为rk=1−(1−r)k,而他出现在第i个桶的概率为P(bi∈B|K=k)=1−(1−pi)k,i=1,2,其中bi∈B表示用户出现在第i个桶中。
从而第i个桶按UV计算的CTR为:
E[R|bi∈B]=∑∞k=1rkP(K=k|bi∈B)=∑∞k=1rkP(bi∈B|K=k)P(K=k)P(bi∈B)=∑∞k=1rkP(bi∈B|K=k)P(K=k)∑∞k=1P(bi∈B|K=k)P(K=k)
设P(K=k)=αk,那么:
E[R|bi∈B]=∑∞k=1(1−(1−r)k)(1−(1−pi)k)αk∑∞k=1(1−(1−pi)k)αk
可以证明,pi<pj⟹E[R|bi∈B]>E[R|bj∈B]。
距离来说明这一点,设p1=0.1,p2=0.9,α1=0.5,α2=0.35,α3=0.15,r=0.015,即流量比为1:9,访问次数分别为1,2,3的人比例为10:7:3,按PV算的CTR是0.015。这种情况下,第1个桶按UV算的转化率为:E[R|b1∈B]=0.0288,第2个桶按UV算的转化率为:E[R|b2∈B]=0.0251。即第1个桶比第2个桶AA测试下按UV统计到的效果好15.11%。也就是说,大桶在该场景下的测试指标比较亏。
不同分桶比例下的AA测试的对比:
结论:如果按PV划分流量,按UV计算转化率,无论交易发生在哪个桶中,将转化率计算入该用户到达的每个桶中,大桶在该场景下的测试指标比较亏。直观的理解是,这种情况下,小桶从大桶的推荐效果中“沾光”要大于大桶从小桶的推荐效果中“沾光”。
第2种情况:转化发生在哪个桶,就将转化率算入该桶中。
相对第1种情况,这种情况会更普遍一些,因为它看上去“更公平”,而事实上却远非如此。仍然借用第1种情况下的符号,可以得到UV转化率和PV转化率的关系如下:
E[R|bi∈B]=∑∞k=1∑kl=1(1−(1−r)l)(kl)pli(1−pi)k−lαk∑∞k=1∑kl=1(kl)pli(1−pi)k−lαk
可以证明,pi<pj⟹E[R|bi∈B]<E[R|bj∈B]。
沿用情况1的各种数据,这种情况下,第1个桶按UV算的转化率为E[R|b1∈B]=0.0157,第2个桶按UV算的转化率为E[R|b2∈B]=0.0234。即第2个桶比第1个桶AA测试下按UV统计到的效果好48.59%。也就是说,小桶在该场景下的测试指标比较亏,而且相对于第一种情况不公平更加严重。
不同分桶比例下的AA测试的对比:
结论:如果按PV划分流量,按UV计算转化率,交易发生在哪个桶中,就将转化率计算入该桶中,小桶在该场景下的测试指标比较亏。直观的理解是,这种情况下,小桶中用户行为次数比大桶中少,因此转化率低。
场景3:按UV划分流量,按PV计算CTR。
这种情况下每个用户会被划分到确定的算法处理,如果算法分配到的用户比较少,而用户行为差异比较大的情况下,小流量算法的指标会受到一定干扰。但对于大多数情况下也可以合理的忽略这种因素,方案比较合理。
场景4:按UV划分流量,按UV计算CTR。
这种情况下每个用户被划分到确定的算法处理,参考场景3的结论,方案比较合理。
为什么会造成这样的问题呢?从本质上讲,这是由于AB测试中不同的桶之间的流量会存在交集,这个交集部分的流量无论怎么统计,都可能会产生影响和问题,尤其是统计指标是交集元素的ID(比如用户ID,cookie等)时,问题更严重。只有从根本上杜绝AB测试中的交集,使各个测试桶之间互不影响。
可能有人会对场景2中的流量想到一种这样的分配方案,来解决两个测试桶流量不平衡的问题。比如将其中的90%的流量分为两个部分,一个为80%的流量桶(第3个桶,A算法)不参与测试,一个为10%的流量桶(第2个桶,A算法),再加上另外一个10%的流量桶(第1个桶,B算法)。此时A、B两个算法的测试桶中的流量大小相等,是不是就公平了呢?
No!原因在于,第2个桶和第1个桶是同一个算法,给用户展示的结果更接近,因此第1个桶虽然不参与测试,但仍然会形成干扰,这种干扰在不同的效果统计方式下表现为不同的测试偏差。
算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果。通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比。为了表述简单,我们假设参与对比的算法有两个,比较的指标是CTR。这里面的关键细节有两个:1. 如何划分浏览?2. 如何计算CTR。下面从这两个角度讨论可能出现的问题。
定义1:按PV划分流量,是指对任意一个访问,按照预先设定的比例,随机分配到一个算法中。需要注意的是,在这种情况下,每个用户会被随机分配到一个算法中。
定义2:按UV划分流量,是指对任意一个访问,按照预先设定的比例,对用户ID进行哈希和取模等操作,将流量划分到一个算法中。在这种情况下,每个用户有一个确定的算法与之对应。
定义3:按PV计算CTR,CTRPV(A)=A算法下用户点击的PV数A算法下总的PV数
定义4:按UV计算CTR,CTRUV(A)=A算法下有点击的用户数A算法下总的用户数
场景1:按PV划分流量,按PV计算CTR。
这种情况比较简单,在忽略用户对算法疲劳度(通常是合理的)的情况下,这种测量对比方案比较合理。
场景2:按PV划分流量,按UV计算CTR。
这个方案可能一些有经验的同学会觉得不行,另一些同学会觉得问题也不大。事实上,这会导致严重的测量误差,我们用AA测试的效果来分析一下。假定流量分成两个桶,第1个桶占比是p1,第2个桶占比为p2,且p1+p2=1。设该算法的PV的转化率(CTR)为r。
这里需要分为两种情况来讨论:
第1种情况:假设产生无论实际的转化在哪个桶中产生,将转化率计算到该用户到达的每个桶中。
对一个访问次数为K=k的用户,其整体转化率为rk=1−(1−r)k,而他出现在第i个桶的概率为P(bi∈B|K=k)=1−(1−pi)k,i=1,2,其中bi∈B表示用户出现在第i个桶中。
从而第i个桶按UV计算的CTR为:
E[R|bi∈B]=∑∞k=1rkP(K=k|bi∈B)=∑∞k=1rkP(bi∈B|K=k)P(K=k)P(bi∈B)=∑∞k=1rkP(bi∈B|K=k)P(K=k)∑∞k=1P(bi∈B|K=k)P(K=k)
设P(K=k)=αk,那么:
E[R|bi∈B]=∑∞k=1(1−(1−r)k)(1−(1−pi)k)αk∑∞k=1(1−(1−pi)k)αk
可以证明,pi<pj⟹E[R|bi∈B]>E[R|bj∈B]。
距离来说明这一点,设p1=0.1,p2=0.9,α1=0.5,α2=0.35,α3=0.15,r=0.015,即流量比为1:9,访问次数分别为1,2,3的人比例为10:7:3,按PV算的CTR是0.015。这种情况下,第1个桶按UV算的转化率为:E[R|b1∈B]=0.0288,第2个桶按UV算的转化率为:E[R|b2∈B]=0.0251。即第1个桶比第2个桶AA测试下按UV统计到的效果好15.11%。也就是说,大桶在该场景下的测试指标比较亏。
不同分桶比例下的AA测试的对比:
小桶流量 | 小桶CTR | 大桶CTR | 小桶领先比例 |
---|---|---|---|
0.0100 | 0.0292 | 0.0246 | 0.1871 |
0.0200 | 0.0292 | 0.0247 | 0.1831 |
0.0500 | 0.0291 | 0.0248 | 0.1710 |
0.1000 | 0.0288 | 0.0251 | 0.1511 |
0.2000 | 0.0284 | 0.0255 | 0.1117 |
0.3000 | 0.0279 | 0.0260 | 0.0734 |
0.4000 | 0.0275 | 0.0265 | 0.0361 |
0.5000 | 0.0270 | 0.0270 | 0 |
第2种情况:转化发生在哪个桶,就将转化率算入该桶中。
相对第1种情况,这种情况会更普遍一些,因为它看上去“更公平”,而事实上却远非如此。仍然借用第1种情况下的符号,可以得到UV转化率和PV转化率的关系如下:
E[R|bi∈B]=∑∞k=1∑kl=1(1−(1−r)l)(kl)pli(1−pi)k−lαk∑∞k=1∑kl=1(kl)pli(1−pi)k−lαk
可以证明,pi<pj⟹E[R|bi∈B]<E[R|bj∈B]。
沿用情况1的各种数据,这种情况下,第1个桶按UV算的转化率为E[R|b1∈B]=0.0157,第2个桶按UV算的转化率为E[R|b2∈B]=0.0234。即第2个桶比第1个桶AA测试下按UV统计到的效果好48.59%。也就是说,小桶在该场景下的测试指标比较亏,而且相对于第一种情况不公平更加严重。
不同分桶比例下的AA测试的对比:
小桶流量 | 小桶CTR | 大桶CTR | 小桶领先比例 |
---|---|---|---|
0.0100 | 0.0151 | 0.0244 | 0.6222 |
0.0200 | 0.0151 | 0.0243 | 0.6065 |
0.0500 | 0.0154 | 0.0240 | 0.5603 |
0.1000 | 0.0157 | 0.0234 | 0.4859 |
0.2000 | 0.0165 | 0.0222 | 0.3467 |
0.3000 | 0.0173 | 0.0212 | 0.2199 |
0.4000 | 0.0182 | 0.0201 | 0.1046 |
0.5000 | 0.0192 | 0.0192 | 0 |
场景3:按UV划分流量,按PV计算CTR。
这种情况下每个用户会被划分到确定的算法处理,如果算法分配到的用户比较少,而用户行为差异比较大的情况下,小流量算法的指标会受到一定干扰。但对于大多数情况下也可以合理的忽略这种因素,方案比较合理。
场景4:按UV划分流量,按UV计算CTR。
这种情况下每个用户被划分到确定的算法处理,参考场景3的结论,方案比较合理。
为什么会造成这样的问题呢?从本质上讲,这是由于AB测试中不同的桶之间的流量会存在交集,这个交集部分的流量无论怎么统计,都可能会产生影响和问题,尤其是统计指标是交集元素的ID(比如用户ID,cookie等)时,问题更严重。只有从根本上杜绝AB测试中的交集,使各个测试桶之间互不影响。
可能有人会对场景2中的流量想到一种这样的分配方案,来解决两个测试桶流量不平衡的问题。比如将其中的90%的流量分为两个部分,一个为80%的流量桶(第3个桶,A算法)不参与测试,一个为10%的流量桶(第2个桶,A算法),再加上另外一个10%的流量桶(第1个桶,B算法)。此时A、B两个算法的测试桶中的流量大小相等,是不是就公平了呢?
No!原因在于,第2个桶和第1个桶是同一个算法,给用户展示的结果更接近,因此第1个桶虽然不参与测试,但仍然会形成干扰,这种干扰在不同的效果统计方式下表现为不同的测试偏差。
相关文章推荐
- 算法效果AB测试中的PV-UV不对称性
- 算法效果AB测试中的PV-UV不对称性
- 算法效果AB测试中的PV-UV不对称性
- ab测试算法的基本概念
- 推荐系统中相似度算法介绍及效果测试
- 你应该知道的算法2-网站pv,uv统计
- 源码编译LAMP架构,phpMyadmin管理数据库,增加xcache加速功能,通过ab测试效果。
- Windows下编译测试BM3D算法效果
- Windows下编译测试BM3D算法效果
- Windows下编译测试BM3D算法效果
- tcpcopy分布式压力测试,效果堪比真实压力,远胜ab(注意采用的工具是tcpcopy 0.5以下的版本)
- 分别用Java和Scala求PV,UV测试程序
- 如何使用 Apache ab 以及 OneAPM 进行压力测试?
- 网站中PV、UV、IP的区别
- 四、凸透镜效果算法
- (半)linux下ab网站压力测试命令
- ab 测试性能
- 压力测试工具ab,wrk,locust简介
- AB 压力测试工具ApacheBench ab压测参数分析