前言

早就想写这方面的内容的,但是最近工作“太忙”,一直拖到现在才写。本来现在也不打算写这个,但是由于笔者的主力工作机ThinkPad X1突然在元旦假期前的最后一个工作日晚上出现故障,当时IT部门的同事早已下班,必须等到假期结束后才能修复。所以,现在只能先把手头的工作丢到一边,做之前“没空”做的事情。这次故障给笔者一个警示:生产工具一定要有备份!好了,闲话不说,开始进入正题。

问题

AB Test时,除了保证算法不一样外,其他条件都需要保证不变。但是往往大家可能忽视了保证用户分布的不变。比如一个算法A除了可以召回付费用户外,还可以召回很多潜在付费用户,而算法B只能召回经常付费的用户,如果直接拿两个算法作用所有用户比较,此时显然用户的分布不一致,比较最终的统计指标意义不大。

两个算法比较

假设有两个算法A,B。由于算法对数据的要求不同,导致分别召回了$U_A​$和$U_B​$两批用户,所以整体用户为$U=U_A \cup U_B​$。两个算法的交集为$I = U_A \cap U_B \ne \emptyset​$。算法上线时,I中的用户不能同时被两个算法影响,所以必须在算法A和B中选择一个算法上线。此时可以等权重随机在A和B中选择一个算法,随机选取可以确保算法A和B影响的用户分布相同,并且可以保证A,B算法影响I中的用户量级相同。如果根据经验知道A的算法比B的好,可以将A的随机选取权重适调高,这样可以在确保整体线上效果的同时,仍然可以保证A,B算影响的用户分布相同,但是量级会有所不同。但是,只要I中的用户足够多,量级对最终的评估影响不会太大。

多于两个算法的比较

假设有A,B,C三个算法,同理可以分别召回$U_A,U_B,U_C$三匹用户,此时所有用户被分成了7份,

  1. $A \cap B \cap C$
  2. $A \cap B - A \cap B \cap C$
  3. $A\cap C - A \cap B \cap C$
  4. $B\cap C - A \cap B \cap C$
  5. $A - B\cup C$
  6. $B - A\cup C$
  7. $C-A\cup B$

任何一个用户只能属于上面7个集合中的一个。如果用户在5,6,7中,用户没有选择,只能选取独占的算法。但是一旦用户属于1,2,3或4中,只要按权重随机选取,最终仍然可以确保A,B和C三个算法影响的用户的分布相同。举个例子,假设分布$D_1$和$D_2$分别代表集合1和2的分布。对于算法A而言,分别随机从$D_1$和$D_2$选取的用户$U_{A1}$和$U_{A2}$,同理算法B选取$U_{B1}$和$U_{B2}$。虽然$U_{A1}$和$U_{B1}$分布相同,$U_{A2}$和$U_{B2}$分布相同,但是$U_{A1} \cup U_{A2}$与$U_{B1} \cup U_{B2}$分布不一定相同。当$U_{A1}$和$U_{B1}$样本量相同,当$U_{A2}$和$U_{B2}$样本量相同,那么$U_{A1} \cup U_{A2}$与$U_{B1} \cup U_{B2}$分布可以保证一样。

上面只有三个算法就可以把用户划分为7分,如果有4种,5种算法,可以将用户划分成更多的不相交集合,不太可能保证每一份集合都有足够的样本量。所以,建议最终仍然是算法两两比较,这样可以保证样本量足够多。

如果有n个算法,两两比价会有$C_n^2​$组合,这样也会带来繁琐的比较工作。笔者一般会找一个算法作为base line,比如推荐任务中,最为常见的base line是热门销售(“集体智慧的结晶”),然后先用其他算法与base line进行比较。如果需要详细比较,可选取一些指标提升非常突出的算法,再进行两两比较。

结论

线上算法AB Test时,一定要确保用户分布一样,否则得到的统计指标会误导后面的工作。做法其实很简单,如果一个用户被多个算法均覆盖,只需保证等权重随机为用户分配算法,可以确保两两比较的算法作用时,用户的分布一致。