算法效果AB测试中的PV-UV不对称性

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

算法效果的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个桶虽然不参与测试,但仍然会形成干扰,这种干扰在不同的效果统计方式下表现为不同的测试偏差。

 

posted @ 2013-08-15 12:02  潘多拉盒子  阅读(3849)  评论(0编辑  收藏  举报