早上7点40分,北京朝阳区一位用户打开外卖App,首页6个推荐位里4个是粥铺。这不是随机——平台在过去30天里统计出该用户工作日早餐下单概率:粥类0.41、包子0.27、咖啡轻食0.18。排序模型把"概率×客单价×配送时长惩罚"作为粗排分数,粥铺因为概率最高被推到前面。
粗排之后是精排。精排模型输入约120维特征,包括用户近7天点击率、商家近1小时出餐速度、距离3公里内的骑手数量。一个常见错误是把"点击"直接当成"喜欢":点击率高的麻辣烫店,实际复购率只有12%,而一家点击率中等的轻食店复购率达34%。只看点击做排序,推荐会越来越偏。
模型评估在这里不能只看AUC。离线AUC做到0.78看起来不错,但上线后订单转化只涨了1.2%。原因是训练数据里80%样本来自已有推荐位,存在位置偏差。修正办法是做随机流量实验:每天抽5%用户完全随机展示,用这部分数据评估真实偏好,持续14天再对比。
概率在排序里还有一层容易被忽略:校准。模型输出"点击概率0.3",但实际统计这档分数用户只点了0.12。分数没校准,多路召回结果融合时就会失真。常用做法是画可靠性曲线,按10个分桶统计预测均值与实际均值,偏差超过0.05就做保序回归校准。
一位运营曾问:为什么周五晚上炸鸡排名突然上升?拆开看,18点到21点该品类历史下单概率从0.15升到0.29,同时附近3家炸鸡店把满减从25减5调到30减12,价格特征变化直接推高了期望收益。排序不是玄学,是概率乘以场景。
数据统计的粒度也决定成败。按天统计"曝光-点击"会掩盖小时级波动:午餐高峰11点30分到12点30分,某商圈曝光量占全天41%,但点击率比下午低6个百分点,因为用户决策时间只有几十秒。把统计窗口切到30分钟,才能发现"出餐慢"对点击的负向影响。
给做推荐的同学三条可操作建议:1)每天记录至少10个badcase,标注是特征问题还是样本问题;2)每周做一次概率校准检查;3)新模型上线前保留5%随机流量做对照,至少观察7天。做到这三点,排序效果才可解释、可迭代。