1. 发生在 KAGGLE 比赛中的“地震”现象
主要原因:训练集和测试集数据分布不一致
检测:在训练集合和测试集合上训练一个二分类,并在测试集合上进行 auc 检测,如果 auc = 0.5,说明训练集合和测试集合没有显著差异。当 > 0.7 时,说明有较大差异。
应用1:二分类预测测试集上所有样本,将打分最高的 TOPK 选做测试集。
应用2:不挑选样本,只加权,将二分类的打分算作样本的权重,与测试集越相似,则权重越高。
2. offline 评估和线上评估效果不一致
原因a:bug
特征是否齐,特征穿越(我们在线log的,应该不可能),过拟合的测试集合(多扩大几天)
原因b:离线指标不可信
auc?
gauc?
auc 是一个比较全局的评价指标,如果存在大量的负样本,则拉低了 fpr,进而提升了 auc。
之前的测试数据发现以下的问题
- test 是 daily feature join daily events。如果 events 跨天了,则会出现假负例。
- 用户没点击不代表用户不喜欢。遇到过, ai push 了相似的文章,用户点击了最新的。是天然的 position bias。
原因c:动态环境
线上 rerank 的规则可能改变真实的排序结果。
原因d:样本分布不一致
离线预测的都是实际展示给用户的,在线的时候预测的是所有召回的集合。离线训练看不到其他召回结果。(可以采样部分召回结果,但是 label? )可能导致线上拉胯。
对于新模型,一开始都是在拟合老模型产生的样本。可能经过一段时间的迭代,慢慢影响样本的分布,逐渐收敛。
- solution1:尽量使用无偏的样本(探索、随机)或者引入召回的样本作为负例。
- solution2:线上新老模型做融合,逐渐降低老模型的权重。
原因e: 可能是业务场景的问题。
- 比如优化了 AI PUSH,那么 editor push 会不会降?如果 editor_push 降了比增的少,那是不是整体就是降的。
3. 可优化的思路
有没有办法用上全部的正例
A. 因为没有走 AI push 而丢失的正例(比如 ED push, CA push)
无论是 calibrate,还是线上 join 特征。正例如果反馈时间太长,是不能 join 上特征的,就会导致这个正例被丢掉了。
时间窗口的方法,势必会丢掉窗口外的正例。有没有办法可以不丢失呢?
是不是可以用用户最近一次的 running_feature 做近似?因为只要用户没有点击,v1 就不会跟新的。但如果前一次是点击的话,画像可能会轻微变化。
B. 因为不在窗口内而丢失的正例
running feature 不能无限存储,这部分可能就得丢掉?