在推荐算法领域,时常会出现模型离线评测效果好,比如AUC、准召等指标大涨,但上线后业务指标效果不佳,甚至下降的情况,比如线上CTR或CVR下跌。
本文尝试列举一些常见的原因,为大家排查问题提供一点思路。
离线、在线特征不一致通常是模型线上效果不好的主要原因,然而,造成离在线特征不一致的原因却千奇百怪,有些还非常隐蔽。
数据泄露(data leakage),有时也叫做泄露、穿越等。它说的是用于训练机器学习算法的数据集中包含了一些将要预测的事务的东西(when the data you are using to train a machine learning algorithm happens to have the information you are trying to predict),也就是说测试数据中的一些信息泄露到了训练集中。这里说的信息是指关于目标标签或者在训练数据中可用但在真实世界中却不可用、不合法的数据。
我们可以将数据泄露分为两大类:训练数据泄露和特征泄露。训练数据泄露通常是测试数据或者未来的数据混合在了训练数据中,特征泄露是指特征中包含了关于真实标签的信息。
导致训练数据泄露可能有以下几种情况:
导致特征泄露可能有以下几种情况:
当我们了解了什么是数据泄露了之后,下一步来看下如何检测数据泄露。
在构建模型之前,我们可以先对数据进行一些探索分析。例如,寻找与目标标签或者值高度相关的特征,相关性非常高的特征可能是泄露特征。
当构建模型之后,我们可以检查下模型中权重极高的特征是否存在泄漏的情况。如果在构建模型之后,发现模型的效果好到不可思议,这时候需要考虑下是否发生了数据泄露。
另一个更可靠的检查泄漏的方法是,对经过训练的模型进行有限的实际部署,看看模型的训练时的性能与真实环境的表现之间是否有很大的差别。但是如果差别比较大的话,也有可能是是过拟合造成的。
离线阶段,我们通过各种优化,新模型的离线评估表现更好了,例如图中第二列,可以发现第4个绿色的正样本和第7个绿色的正样本排到了第3和第6的位置,离线的auc指标涨了。
到了真正线上的预估也就是第三列,发现对于这部分离线见过的样本,模型的预估序并未改变。但是新模型给了灰色没有见过的数据更高的预估分数,这部分数据一旦表现不好,很可能造成我们前面说的情况,离线(第二列)评估指标明明涨了不少,在线(第三列)评估指标ctr却下降。
冰山效应在实验模型与baseline的模型相差较大时很容易造成较大的影响,比如实验模型是个性化推荐的DNN模型,而baseline是一个热门推荐的策略,这个时候新模型往往会推荐很多baseline不会展现出来的之前很少曝光的物品,而这些物品是否能够被高效点击和转化有一定的不确定性。新模型一开始相当于都是在拟合老模型产生的样本,刚上线效果如果比较差,经过一段时间迭代,影响的样本分布慢慢趋近于新模型,也能收敛,但效率较低。
缓解冰山效应的两个思路:
假设离线评测用的测试数据是与训练数据做了隔离的,这种情况下仍然有一定的概率发生模型过拟合。
在Kaggle比赛中经常会出现模型在公开榜单(public leaderboard)上排名很高,但在切换到非公开榜单(private leaderboard)时排名很靠后的情况,这其实就是模型过拟合到公开榜单上了。如果离线我们训练了很多模型(对应不同的超参数),都是用同一个测试数据集来评估和选择模型,当这个过程重复很多次之后,最后选出来的模型有可能是过拟合到这个测试数据集上的,上线后效果就不一定好。
用测试数据集来选择模型的过程其实就相当于用测试数据集训练了一个“筛选模型”的模型,这个过程本身也是有可能过拟合的。举一个极端一点的例子,最终我们可能选择出一个在测试数据集上效果很好的模型,它能记住测试数据集中的每个样本的label,但不在测试数据集中样本全部预测错误的一无是处的模型。这也就是一些机器学习模型号称能够在benchmark数据集上识别准确率能够打败人类的原因。
在模型优化过程中,我们曾遇到过离线AUC 很高(或提升很多)但 CTR 效果不理想;或 AUC 提升幅度不大,但 CTR 提升幅度很大的情况,这是为什么呢?想要回答这个问题,我们先来看 AUC 与 CTR 的关系。
AUC指标反应的是模型把全局任意一对正负样本中的正样本排序在负样本之前的概率。离线计算AUC指标其实对应了模型对多个请求的样本之间进行排序,而点击率提升需要模型对一个请求内部的多个 Item 进行排序。模型的全局排序能力强不一定就表示同一次请求内部的item排序能力强。
GAUC(Group AUC)的指标可能更加接近线上CTR的点击偏好。这里的Group表示按照用户Session来分组评估样本。
比如说实验结果是否置信等,具体可以参考这篇文章:《推荐效果不佳时的检查清单》。
还有诸如流量抢夺,链路纠缠等原因,典型的比如在营销场景,你在前面的PUSH,短信,固定入口广告做优化,把好转化的用户都转化了。那么下游的IVR电销,人工电销一定就变难了。这时候你离线用历史数据训练的模型可能离线指标提升了,线上也不会有太多的效果。这种在一些瀑布流程的场景中更为常见,一定要关注实验的上下游变化,比较经典的方法是做MVP机制,一直维持着最优流量的AB测。这样相对提升是可以把握住的。即使小模块指标变得难看了也没关系,可能大盘整体还是变好的。