拿30天日志评估排序模型,最典型的坑是「离线漂亮、线上拉胯」。某视频App的召回模型离线Recall@50做到0.62,上线后人均播放只涨0.4%。查下来,离线评估用的是全量候选集打分,线上召回只取Top 200,评估口径和线上服务链路不一致。改成先模拟线上截断再算指标,离线Recall降到0.48,反而和线上表现对得上了。
第二个坑:评估集里热门商品占比过高。30天日志中Top 1%商品占曝光量的61%,模型只要学会推热门就能拿到不错的AUC。做法是按曝光频次分层评估:头部(曝光前10%)、腰部(10%-70%)、长尾(后30%)分别算指标。某次实验整体AUC 0.76,长尾分组只有0.58,说明模型对冷门商品几乎没区分能力。
第三个坑是时间衰减。用30天等权训练,第1天的样本和第30天的样本权重一样,但用户兴趣两周就漂移一次。改成指数衰减,半衰期取7天,权重w=0.5^(t/7),t为距今天数。实测某新闻推荐场景,衰减后离线NDCG@10从0.412提到0.436,线上CTR同步涨1.8%。
对比两种评估方式:方式一按用户切分,每个用户取最近10次曝光做测试集,其余训练;方式二按全局时间切分。方式一更贴近个性化场景,但测试集用户都在训练集出现过,无法评估新用户。方式二能测冷启动,但训练集和测试集用户重叠度低。实操中两个都跑,取较差的那个作为上线门槛,保守但稳。
指标本身要选对。排序看NDCG@10和MAP,二分类看AUC和LogLoss,但AUC对排序位置不敏感。某电商把AUC 0.81的模型换上去,首屏成交反而跌2.3%,因为AUC高不代表头部排得准。改看Top 3位置的加权AUC,权重按位置衰减1/log2(位置+1),问题立刻暴露。
还有一个隐蔽坑:评估样本里的曝光日志缺失。客户端埋点丢失率约1.2%,集中在弱网场景(地铁、电梯),这批用户行为模式不同,缺失不是随机的。处理办法是用服务端曝光日志对齐,服务端记录request_id和返回商品列表,客户端回传点击时带上request_id,两边关联后缺失率降到0.3%。
最后提醒评估频率。模型每周重训一次,评估集每月重建一次,避免评估集被反复调参过拟合。某团队连续调了23版模型,每版都在同一测试集上看指标,最好那版离线涨3.1%、线上持平,典型的选择偏差。留一份从未看过的「锁箱集」,只在最终决策时打开一次。