推荐系统召回层做离线评估的一种姿势
Posted 深度传送门
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统召回层做离线评估的一种姿势相关的知识,希望对你有一定的参考价值。
作者:坏星星是大脸猫
链接:https://zhuanlan.zhihu.com/
p/129049631
编辑:深度传送门
背景和需求
做召回优化时我们碰到的问题:
如何判断某个召回策略取10条、20条、50条时的效果好坏?
现在用户量无法开展更多组ABtest甚至无法开展ABtest时候如何评估召回改进的效果好坏?
如何评估算法工程师工作输出?(不太可能给算法工程师所有工作都能线上做ABtest量化)
有没有比ABtest更快更轻量的评估方案做粗评?
很多公司如果召回环节做了改进,会直接上线来做ABtest,然后对后验数据做分析,从而评估改进的价值。这种方法效果最好,但是也有问题:
1)ABtest的成本太高; ABtest需要观察很长时间,还可能伤害了用户体验等;
2)用户量满足不了多组ABtest;比如用户量太少,或者需要同时开展几百组ABtest寻找最优参数等;
举例:
假如有100个召回策略,需要merge出300条item,那每个召回策略取多少条,可能会列出几十种备选方案,都做ABtest的成本显然是不可接受的。
所以有必要提供一种方案,可以在某些情况下辅助线上的ABtest。同时还会构建一个召回监控方案,每一次请求都有一个token,在请求从开始到完成的漏斗过程中,token会传递到每一个环节。根据token,对每个召回策略的漏斗演化信息进行追踪,比如召回了100条,merge取了40条,时效等过滤了20条,喂入排序20条,排序后取top 32保留了2条等等。
总结来说,对召回做评估,有三个工具:
线下评估工具(本文),提供一个粗评;
召回监控方案,可以对每个召回源的漏斗演化进行监控,发现线上召回源的问题;
在线ABtest,对召回改进或者召回源效果,进行真正的效果分析;
方案设计
输入: 验证集。包括两份数据:
1)user recall list table(采集的召回样本,类似query返回的item list)
2)user behavior table(采集的用户行为样本,做target,类似query后用户的曝光、点击等行为日志)
输出:两组实验(曝光组、正反馈组),相应的准确率、召回率指标
大体存在在线虚拟评估、离线评估这两种方案,区别是如何采集user recall list table。具体业务根据实现成本,选择合适的方案;比如有些召回策略是没法离线构建recall list的,只能在线虚拟评估。
1)在线虚拟评估方案:
分online验证集采集和offline离线评估两个部分。具体流程:
online:随机copy一定次数的真实recall请求,重发请求做虚拟recall,虚拟recall时候可以将需要测试的召回方案线上加载,并把得到的recall list快照落地到user recall list table;
offline:是一个标准化的组件,将user recall list和user behavior list做join,形成验证集,并执行metrics组件得到评估结果。
举例:
对上述的100个召回策略,随机copy线上10000次请求并异步重发,然后每个虚拟请求都对100个召回策略拉取足够多的recall list并快照落地,离线再拉取下一个窗口的用户行为做target list,这样就构建了验证集。之后就可以开心地离线对每个备选方案计算准确度、覆盖度、多样性等等指标了。
这种方式可以组件化,召回侧的线下评估都可以在线虚拟请求生成rec list快照落地,形成验证集;
2)离线评估方案:
和在线评估部分的offline部分相同,不同地方在于需要算法工程师自己构建recall list table,这个工作根据召回策略、改进的不同,也非常不同,难以组件化。
比如itemcf目前的采集方式:算法离线跑出3月2日、3月3日、3月4日的每个user的rec list,再对应T+1天的behavior list做target,构建成了验证集;
评估组件(RecallMetrics):
实现一个统一输入和输出的评估模块 RecallMetrics。只要输入格式统一的验证集,就输出一系列的评估指标。
输入的统一:
验证集分两部分,recall list table都放入hive table或者hdfs,格式至少包含如下三个cols:
userid/reclist/time
user behavior table也是hive table或者hdfs,记录用户的曝光点击等详细行为日志,格式至少包含如下三个cols:
userid/itemid/time
方案缺陷:无法替代线上ABtest
这种离线评估、在线虚拟评估方案的最大缺点是无法度量召回改进能带来的额外收益。原因是评估的验证集是用户下一个窗口的点击行为,但是点击行为又来自于召回候选集。我们难以知道,如果做某项召回改进,是不是用户可以额外消费更多item?所以在线ABtest才是最重要的检验方法。
这种评估,只是给线上ABtest减少实施成本。
改进方法:
user behavior list做target时候,应该尽量取用户在所有场景下长时间窗口内的显式、隐式反馈,提高探索能力。比如取用户T+3窗口、全场景下的行为做target,就对召回结果的指导意义更强
评估指标有哪些?
召回策略的评估主要根据两个评价指标:召回率和准确率。 具体指标如下:
1)准确度:准确度指的是召回排序的好坏,体现的是能不能和排序层保持目标一致;
指标1: 平均准确度(固定用topN做分母)
指标2:NDCG
指标3: target&recall / recall
指标4: target&recall
2)召回率:也即覆盖度体现的是对用户兴趣的覆盖能力
指标5:target&recall / target
一次评估,分两组实验来计算准确率和召回率,一组是曝光组,一组是正反馈组:
1)对曝光组做评估:user behavior list可以采集所有曝光的行为。可以观察召回数据和用户实际曝光数据的重合率;也可以探查召回和排序两个模块是否能一致;还可以推测召回是不是能给用户更多新鲜内容
2)对正反馈组做评估:user behavior list只采集能认定为正反馈的行为,比较少。可以观察召回数据对用户兴趣的捕捉能力,发现召回本身的问题
评估结果举例
曝光组:
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
|topN| pr| ndcg| pr1| recall| pr2|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
| 10|0.021167207040296433| 0.02348380891135852|0.019348578376356167|0.010401731754280524|0.21157407407407408|
| 20|0.021769337656322375|0.026909300994405482|0.021859400887178672|0.018928823723588315| 0.4351851851851852|
| 30| 0.02105913231434306| 0.02926783244764756| 0.02261565981745453|0.026244787363717645| 0.6314814814814815|
| 40| 0.01991662806855026|0.030988480874750174| 0.02270210139526583| 0.03175284130028017| 0.7962962962962963|
| 50|0.018693839740620645| 0.03249060208223217| 0.02279640786826291| 0.03659251241892631| 0.9342592592592592|
| 60| 0.01584838659873399| 0.03165612915300626|0.022877234358403113| 0.03695252630385688| 0.950462962962963|
| 70|0.013584331370343415|0.030897870664973088|0.022877234358403113| 0.03695252630385688| 0.950462962962963|
| 80|0.011886289949050484|0.030352966066049716| 0.02287723435840311| 0.03695252630385688| 0.950462962962963|
| 90| 0.01056559106582265|0.029941648491647543|0.022877234358403106| 0.03695252630385688| 0.950462962962963|
| 100|0.009509031959240393| 0.02963312414397186| 0.02287723435840311| 0.03695252630385688| 0.950462962962963|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
正反馈组:
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
|topN| pr| ndcg| pr1| recall| pr2|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
| 10|0.012869198312236284|0.016561743146379235|0.011783624329749793|0.011640036606021606|0.12862414338429098|
| 20|0.012394514767932482|0.020009809253944296| 0.01237523970787016| 0.02007879296558952| 0.2477596204533474|
| 30| 0.01218354430379747|0.023429839368170717|0.012922819464712966|0.028432259101198183|0.36531365313653136|
| 40|0.011392405063291134|0.025470321832593148|0.012786067095341745|0.033883270790163934| 0.4554559831312599|
| 50|0.010643459915611813|0.027181838128253137|0.012712504488316193| 0.03854474009760713| 0.5318924617817606|
| 60| 0.00901898734177215| 0.02704604662579936| 0.01274490461839379| 0.03889758743226532| 0.5408539799683711|
| 70|0.007730560578661846| 0.02682614700549232|0.012744904618393792| 0.03889758743226532| 0.5408539799683711|
| 80|0.006764240506329...|0.026668296530870675|0.012744904618393794| 0.03889758743226531| 0.5408539799683711|
| 90|0.006012658227848097|0.026548397259436068| 0.01274490461839379| 0.03889758743226532| 0.5408539799683711|
| 100| 0.00541139240506329|0.026457914565537796|0.012744904618393792| 0.03889758743226532| 0.5408539799683711|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
(topN是recall取多少条参与评估,实际业务中每个召回策略取前10条、20条、30条... )
评估结果分析:
1) 如果曝光组的recall很高,相应正反馈组的pr不高,那说明改进方案能基本覆盖之前的用户内容池,不会出现大的效果下降;
2) 如果曝光组的recall很低,那说明改进方案和用户日常的内容池不太重合,可能有兴趣探索的优点;
3) 如果曝光组的recall很高,相应正反馈组的pr很高,那说明改进方案和之前召回策略相比,比较相似,可能不能带来什么特殊优势;
...
方案实现
目前只提供了RecallMetrics组件,调用其中的evalue方法就可以得到两组评估结果,一组评估的是曝光效果,一组评估的是正反馈效果。指标都是下面5列:
avg_pr:所有样本的平均准确度。需要注意,如果reclist不够topN,则分母还是用topN值来算。
ndcg:NDCG值
pr1:不考虑召回位置的平均准确度,分母有加1
recall:覆盖度
pr2: 只考虑召回和Target交集数目的平均准确度
RecallMetrics组件说明:
/**
* 这是一个相对通用的recall评估模块,输入标准化的验证集,得到metrics。
* 需要准备的数据:
* 1)一份T时刻的user rec item list 快照;
* 2)一份对应的T+{1-K} 时刻的user behavior item list 快照做target;(user item 曝光日志或者hive table可取
*
* 输出的是不同topN情况下相对应的评估结果(准确度NDCG\pr1、2、3\recall率\新颖度\多样性),举例:
*
* +----+--------------------+--------------------+--------------------+--------------------+-------------------+
* |topN| pr| ndcg| pr1| recall| pr2|
* +----+--------------------+--------------------+--------------------+--------------------+-------------------+
* | 10|0.012244897959183673|0.012257738310744472|0.011123317769843455|0.003304993243463...|0.12235649546827794|
* | 20|0.012811791383219959|0.013682806656555297|0.013093947006333697|0.005744086927816912|0.25604229607250756|
* | 30|0.012975560594608224| 0.01440827574474549|0.014275603432518942| 0.00721500460587105| 0.3889728096676737|
* | 40| 0.01247165532879819|0.014600177142022054|0.014546779169399325|0.008439492745964625| 0.4984894259818731|
* | 50|0.012622826908541192| 0.01523810220770594|0.015334700773059784|0.009932796268918517| 0.6306646525679759|
* +----+--------------------+--------------------+--------------------+--------------------+-------------------+
* 输入args参数:
* "recListTable":user rec item list 快照,cols必须包含{"userid","reclist","ds"}
* "interactionTable":user behavior item list 快照,cols必须包含{"userid","itemid","ds"}
* "ds_T_begin":recListTable取时间[ds_T_begin,ds_T_end]
* "ds_T_end":recListTable取时间[ds_T_begin,ds_T_end]
* "window":target采集窗口,也即拿用户多大窗口的behavior做target。比如取1,表示取user rec item list之后1天的behavior item做target list
* "topN":取user rec item list多少条参与评估
* "filterKey" :指定target行为中正反馈判定字段比如isclick字段替代
* "filterThreshold":指定target行为中是否正反馈的过滤阈值,比如isclick>0才认为是正反馈
* Created by *** on 2020/03/18
*/
object RecallMetrics {
实际中对某次 itemCF做评估的结果
取20200317-20200319之间的数据做验证集,取target的未来窗口是T+7,其中正反馈条件是:曝光时长>5000、曝光时长>3000、是否消费
结论:
1)itemcf的曝光组recall只有3%,很低。这说明itemcf的recall内容和用户目前曝光的内容很不相似,itemcf可能有很好的补充效果带来额外收益;
2)itemcf的正反馈recall也是3%,和曝光组覆盖率相当。但是当取更少recall条数(也即topN更小)时,正反馈recall要更高于曝光recall,说明itemcf的排序能力还是略高于平均召回策略的;
3)可以适当加大itemcf的merge比例再观察,会融入更多目前用户没看到的内容,也许能带来额外收益;同时itemcf的排序能力也更好一些;
4)以后评测可以用更长的未来时间窗口(T+k)采集target行为做验证集。这样减少target太少太固化,没法模拟召回改进能带来的额外收益;
数据细节举例
1)曝光组:
样本条数:2159
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
|topN| pr| ndcg| pr1| recall| pr2|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
| 10|0.021167207040296433| 0.02348380891135852|0.019348578376356167|0.010401731754280524|0.21157407407407408|
| 20|0.021769337656322375|0.026909300994405482|0.021859400887178672|0.018928823723588315| 0.4351851851851852|
| 30| 0.02105913231434306| 0.02926783244764756| 0.02261565981745453|0.026244787363717645| 0.6314814814814815|
| 40| 0.01991662806855026|0.030988480874750174| 0.02270210139526583| 0.03175284130028017| 0.7962962962962963|
| 50|0.018693839740620645| 0.03249060208223217| 0.02279640786826291| 0.03659251241892631| 0.9342592592592592|
| 60| 0.01584838659873399| 0.03165612915300626|0.022877234358403113| 0.03695252630385688| 0.950462962962963|
| 70|0.013584331370343415|0.030897870664973088|0.022877234358403113| 0.03695252630385688| 0.950462962962963|
| 80|0.011886289949050484|0.030352966066049716| 0.02287723435840311| 0.03695252630385688| 0.950462962962963|
| 90| 0.01056559106582265|0.029941648491647543|0.022877234358403106| 0.03695252630385688| 0.950462962962963|
| 100|0.009509031959240393| 0.02963312414397186| 0.02287723435840311| 0.03695252630385688| 0.950462962962963|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
2)正反馈组(曝光时间大于3000):
样本条数:1896
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
|topN| pr| ndcg| pr1| recall| pr2|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
| 10|0.012869198312236284|0.016561743146379235|0.011783624329749793|0.011640036606021606|0.12862414338429098|
| 20|0.012394514767932482|0.020009809253944296| 0.01237523970787016| 0.02007879296558952| 0.2477596204533474|
| 30| 0.01218354430379747|0.023429839368170717|0.012922819464712966|0.028432259101198183|0.36531365313653136|
| 40|0.011392405063291134|0.025470321832593148|0.012786067095341745|0.033883270790163934| 0.4554559831312599|
| 50|0.010643459915611813|0.027181838128253137|0.012712504488316193| 0.03854474009760713| 0.5318924617817606|
| 60| 0.00901898734177215| 0.02704604662579936| 0.01274490461839379| 0.03889758743226532| 0.5408539799683711|
| 70|0.007730560578661846| 0.02682614700549232|0.012744904618393792| 0.03889758743226532| 0.5408539799683711|
| 80|0.006764240506329...|0.026668296530870675|0.012744904618393794| 0.03889758743226531| 0.5408539799683711|
| 90|0.006012658227848097|0.026548397259436068| 0.01274490461839379| 0.03889758743226532| 0.5408539799683711|
| 100| 0.00541139240506329|0.026457914565537796|0.012744904618393792| 0.03889758743226532| 0.5408539799683711|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
3)正反馈组(曝光时间大于8000):
样本条数:1474
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
|topN| pr| ndcg| pr1| recall| pr2|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
| 10|0.007921462423832092|0.011880469005504291|0.007210125613373252|0.012181654567537484|0.07916102841677942|
| 20|0.006872037914691945|0.015562984684787872|0.006776639388276729|0.019962219663270463|0.13734776725304465|
| 30|0.006702775897088...|0.018851725749670194|0.007037072658316073|0.027190984627689214| 0.2009472259810555|
| 40|0.006093432633716996|0.020592171396957053|0.006800782662056299| 0.03162852199002258| 0.2435723951285521|
| 50|0.005673662830060935| 0.02225750440725524|0.006734191034474506|0.036020549439990404|0.28349120433017594|
| 60|0.004829609568946066| 0.02243321681449015|0.006776031440877524| 0.03662705241003251| 0.2895805142083897|
| 70| 0.00413966534481091| 0.0223889149385747|0.006776031440877521|0.036627052410032515| 0.2895805142083897|
| 80|0.003622207176709...| 0.02235693202263727|0.006776031440877524|0.036627052410032515| 0.2895805142083897|
| 90|0.003219739712630...|0.022338605409584697|0.006776031440877...|0.036627052410032515| 0.2895805142083897|
| 100|0.002897765741367636| 0.02232824391661525|0.006776031440877521| 0.03662705241003251| 0.2895805142083897|
+----+--------------------+--------------------+--------------------+--------------------+-------------------+
4)正反馈组(是否消费):
样本条数:289
+----+--------------------+--------------------+--------------------+--------------------+--------------------+
|topN| pr| ndcg| pr1| recall| pr2|
+----+--------------------+--------------------+--------------------+--------------------+--------------------+
| 10|0.001384083044982699|0.002951840508863848|0.001253918495297...|0.003568094740508534|0.013793103448275862|
| 20|0.001384083044982...| 0.0046261198961212|0.001436781609195...|0.006994266270128339|0.027586206896551724|
| 30|0.001614763552479...|0.006701564126819748|0.001733407489803485|0.012082867802695388| 0.04827586206896552|
| 40|0.001816608996539...|0.008371799739920516|0.001978534463816...|0.016254597414080172| 0.07241379310344828|
| 50|0.001660899653979239|0.008752752298187533|0.001888834440268807|0.017177620750896613| 0.08275862068965517|
| 60|0.001384083044982699|0.008735410881117633|0.001865429852969...|0.017177620750896613| 0.08275862068965517|
| 70|0.001186356895699...|0.008722198509785464|0.001865429852969696|0.017177620750896613| 0.08275862068965517|
| 80|0.001038062283737...|0.008711739854246394|0.001865429852969696|0.017177620750896617| 0.08275862068965517|
| 90|9.227220299884663E-4|0.008703220850684434|0.001865429852969...|0.017177620750896613| 0.08275862068965517|
| 100|8.304498269896193E-4|0.008696125805399961|0.001865429852969...|0.017177620750896613| 0.08275862068965517|
+----+--------------------+--------------------+--------------------+----------
关于深度传送门
深度传送门是一个专注于深度推荐系统与CTR预估的交流社区,传送推荐、广告以及NLP等相关领域工业界第一手的论文、资源等相关技术分享,欢迎关注!加技术交流群请添加小助手deepdeliver,备注姓名+学校/公司+方向。
以上是关于推荐系统召回层做离线评估的一种姿势的主要内容,如果未能解决你的问题,请参考以下文章