(转载请注明原创于潘多拉盒子)

算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果。通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比。为了表述简单,我们假设参与对比的算法有两个,比较的指标是CTR。这里面的关键细节有两个:1. 如何划分浏览?2. 如何计算CTR。下面从这两个角度讨论可能出现的问题。

定义1:按PV划分流量,是指对任意一个访问,按照预先设定的比例,随机分配到一个算法中。需要注意的是,在这种情况下,每个用户会被随机分配到一个算法中。

定义2:按UV划分流量,是指对任意一个访问,按照预先设定的比例,对用户ID进行哈希和取模等操作,将流量划分到一个算法中。在这种情况下,每个用户有一个确定的算法与之对应。

定义3:按PV计算CTR,$CTR_{PV}(A)=\frac{A算法下用户点击的PV数}{A算法下总的PV数}$

定义4:按UV计算CTR,$CTR_{UV}(A)=\frac{A算法下有点击的用户数}{A算法下总的用户数}$

场景1:按PV划分流量,按PV计算CTR。

这种情况比较简单,在忽略用户对算法疲劳度(通常是合理的)的情况下,这种测量对比方案比较合理。

场景2:按PV划分流量,按UV计算CTR。

这个方案可能一些有经验的同学会觉得不行,另一些同学会觉得问题也不大。事实上,这会导致严重的测量误差,我们用AA测试的效果来分析一下。假定流量分成两个桶,第1个桶占比是$p_1$,第2个桶占比为$p_2$,且$p_1+p_2=1$。设该算法的PV的转化率(CTR)为$r$。

这里需要分为两种情况来讨论:

第1种情况:假设产生无论实际的转化在哪个桶中产生,将转化率计算到该用户到达的每个桶中。

对一个访问次数为$K=k$的用户,其整体转化率为$r_k=1-(1-r)^k$,而他出现在第i个桶的概率为$P(b_i \in B|K=k)=1-(1-p_i)^k, i=1,2$,其中$b_i \in B$表示用户出现在第$i$个桶中。

从而第i个桶按UV计算的CTR为:

$E[R|b_i \in B]=\sum_{k=1}^{\infty}{r_k P(K=k|b_i \in B)}=\sum_{k=1}^{\infty}\frac{r_k P(b_i \in B|K=k)P(K=k)}{P(b_i \in B)}=\frac{\sum_{k=1}^{\infty}{r_k P(b_i \in B|K=k)P(K=k)}}{\sum_{k=1}^{\infty}{P(b_i \in B|K=k)P(K=k)}}$

设$P(K=k)=\alpha_k$,那么:

$E[R|b_i \in B]=\frac{\sum_{k=1}^{\infty}(1-(1-r)^k)(1-(1-p_i)^k)\alpha_k}{\sum_{k=1}^{\infty}(1-(1-p_i)^k)\alpha_k}$

可以证明,$p_i<p_j \implies E[R|b_i \in B]>E[R|b_j \in B]$。

距离来说明这一点,设$p_1=0.1, p_2=0.9$,$\alpha_1=0.5, \alpha_2=0.35, \alpha_3=0.15$,$r=0.015$,即流量比为1:9,访问次数分别为1,2,3的人比例为10:7:3,按PV算的CTR是0.015。这种情况下,第1个桶按UV算的转化率为:$E[R|b_1 \in B]=0.0288$,第2个桶按UV算的转化率为:$E[R|b_2 \in 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

结论:如果按PV划分流量,按UV计算转化率,无论交易发生在哪个桶中,将转化率计算入该用户到达的每个桶中,大桶在该场景下的测试指标比较亏。直观的理解是,这种情况下,小桶从大桶的推荐效果中“沾光”要大于大桶从小桶的推荐效果中“沾光”。

第2种情况:转化发生在哪个桶,就将转化率算入该桶中。

相对第1种情况,这种情况会更普遍一些,因为它看上去“更公平”,而事实上却远非如此。仍然借用第1种情况下的符号,可以得到UV转化率和PV转化率的关系如下:

$E[R|b_i \in B]=\frac{\sum_{k=1}^{\infty}{\sum_{l=1}^{k}(1-(1-r)^l){k \choose l}p_i^l(1-p_i)^{k-l}\alpha_k}}{\sum_{k=1}^{\infty}{\sum_{l=1}^{k}{k \choose l}p_i^l(1-p_i)^{k-l}\alpha_k}}$

可以证明,$p_i<p_j \implies E[R|b_i \in B]<E[R|b_j \in B]$。

沿用情况1的各种数据,这种情况下,第1个桶按UV算的转化率为$E[R|b_1 \in B]=0.0157$,第2个桶按UV算的转化率为$E[R|b_2 \in 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

结论:如果按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不对称性的更多相关文章

  1. 基于hash的AB测试

    AB测试 为同一个目标,设计两种方案,将两种方案随机投放市场中,让组成成分相同(相似)用户去随机体验两种方案之一,根据观测结果,判断哪个方案效果更好. 基于hash的AB测试 具体的实现方法为: 在A ...

  2. 4星|《助推(实践版)》:英国政府用AB测试检验政策效果的经验

    助推:小行动如何推动大变革(实践版)(诺贝尔经济学奖得主理查德•塞勒的助推实践) 作者作为学者说服英国政府实施助推策略的经过,提到一些具体主推策略. 所谓的助推,很像IT业流行的AB测试,对政策的执行 ...

  3. 014 在Spark中完成PV与UV的计算,重在源代码

    1.代码 object LogPVAndUV{ def main(args:Array[String]):Unit={ val conf=new SparkConf() .setMaster(&quo ...

  4. 测试SDWebImage淡入淡出效果在UITableView中的重用显示问题

    测试SDWebImage淡入淡出效果在UITableView中的重用显示问题 这个是在上一篇教程的基础上所添加的测试环节! 效果图(从效果图中看是没有任何重用问题的): 源码: ImageCell.h ...

  5. 多臂机测试, AB测试

    bandit  强盗,土匪:恶棍:敲诈者 ['bændɪt] 多臂机 multi-armed bandit MAB  简写. one-arm bandit   tiger ji 是一种自动AB测试的方 ...

  6. 网易郑栋:数据采集与分析的那些事——从数据埋点到AB测试

    本文由  网易云发布. 4月8日晚,DTalk邀请到了网易互联网分析产品.可视化 BI 产品的负责人—郑栋老师,进行了一次关于<网易郑栋:数据采集与分析的那些事第一弹: 数据篇>的主题分享 ...

  7. 有关“数据统计”的一些概念 -- PV UV VV IP跳出率等

    有关"数据统计"的一些概念 -- PV UV VV IP跳出率等 版权声明:本文为博主原创文章,未经博主允许不得转载. 此文是本人工作中碰到的,随时记下来的零散概念,特此整理一下. ...

  8. Apache 的ab测试

    <!-- 博主所有文章仅是作为自己的笔记 如有不足 请见谅--> Apache的ab测试  和  ab测试 不是一个东西(百度 ab测试可以了解) 网站性能压力测试是服务器网站性能调优过程 ...

  9. 日志分析_统计每日各时段的的PV,UV

    第一步: 需求分析 需要哪些字段(时间:每一天,各个时段,id,url,guid,tracTime) 需要分区为天/时 PV(统计记录数) UV(guid去重) 第二步: 实施步骤 建Hive表,表列 ...

随机推荐

  1. datatables使用总结篇

    <!doctype html> <html> <head> <meta charset="gbk"/> <meta name= ...

  2. MyBatis 物理分页

    MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回 为了在数据库层面上实现物理分页,又不改变原来MyBatis的函 ...

  3. webdriver(python)学习笔记四——定位一组元素

    webdriver可以很方便的使用find_element方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用find_elements方法. 定位一组对象一般用于以下场景: ...

  4. IOS-day02_OC中类的声明

    在上一个笔记中类的使用中,在编译链接的时候会有警告,原因就是我们没有对类进行声明 类的声明如下:使用关键字@interface #import <Foundation/Foundation.h& ...

  5. git 公共服务器

    github   私有项目有限制,多了需要收费 bitbucket  无限的私有项目,项目协作人数多了需要收费,刚好和github相反 gitorious 新发现的,不知道有什么特点

  6. 多校5 1004 HDU5784 统计锐角三角形数目

    http://acm.hdu.edu.cn/showproblem.php?pid=5784 题意:n个点,找多少个锐角三角形数目 思路:极角排序+two pointers 当前选择的点集要倍增一倍, ...

  7. 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)

    //贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...

  8. 更换Oracle备份数据文件

    应用背景:需要查看和修改一下Interlib中的数据,所以要反复的将备份数据进行导入和清空.整理一下步骤 删除tablespace drop tablespace interlib including ...

  9. Failed to allocate the network(s), not rescheduling

    Failed to allocate the network(s), not rescheduling 在计算节点的/etc/nova/nova.conf中添加下面两句 #Fail instance ...

  10. Linux数据流重定向

    一.什么是数据流重导向: 数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据传导到其他地方去』,没错-数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的 ...