推荐系统正负样本构造
在feed场景中,使用曝光(展示)日志时,应该选择APP的SDK埋点的日志,而不是服务器Web接口返回的日志,因为Web接口返回的日志中的后果是会增加很多无效的负样本。举个例子,Web接口每次返回10条数据,但是APP屏幕最多只能展现3条数据,剩下的7条数据需要用户在feed中滑动屏幕后,才算真正的曝光,但很多用户可能并不会滑动屏幕或者滑动屏幕幅度较小,导致剩下的7条数据并未真正在APP上曝光。
针对同一个内容在不同时间对同一个用户曝光多次的情况,这时候训练集中可能会出现同一用户对同一内容点击与不点击并存的情况,如果多次曝光的间隔非常短,考虑只使用其中的一次曝光数据。
根据 youtube 的早期论文中描述,他们为了避免高度活跃用户对loss的影响,在训练集中对每个用户提取相同数量的训练样本。
根据《美团机器学习实战》书中所说,它们在 feed 场景中采用了Skip Above的方式来提高效果。具体来讲就是根据用户最后一次点击行为的位置,过滤掉最后一次点击之后的展示,可以认为用户没有看到,也可以保留最后一次点击之后的少数几个。
过滤异常数据,如爬虫数据
可以考虑去除只有曝光但是没有点击操作的用户样本(也就是有的用户只有负样本,没有正样本),不过去除的话,那模型就只能学习到活跃用户或者有意向用户的行为习惯,这就导致线下数据与线上数据分布有偏,所以需要根据线上A/B测试的效果来决定最终是否需要去除
特征和label的构造方式
最后说一点关于生成训练样本的方式,尽可能地采用线上模型预测样本时刻的特征作为之后训练样本中的数据,而不是使用离线回溯的方式去拼接训练样本中的各个特征,这就要求当线上模型在预测时,需要将喂给模型的特征做一次落地,比如上传到kafka,后续再由相应程序进行解析生成之后的训练样本。