离线评估集取 8 月最后 7 天的 4.2 万条样本,正样本率 3.8%。模型 AUC 从 0.71 提到 0.74,看起来不错。先做一件事:检查训练集和评估集的时间是否重叠,重叠超过 1 天就会让 AUC 虚高 0.02 到 0.04,因为特征里有“近 7 天点击”这类会泄漏的信息。
对比两种评估方式:随机切分 vs 按时间切分。随机切分下 AUC 0.76,按时间切分下 0.71,差距 0.05。线上只可能是按时间切分的情形,所以报告必须用后者。步骤:1)按日期排序;2)前 80% 做训练;3)后 20% 做测试;4)特征只允许用样本时间点之前的数据。
NDCG@10 的计算要固定候选集大小。某次评估里候选集从 200 个商品缩到 50 个,NDCG 从 0.55 跳到 0.68,不是模型变好,是分母变了。统一规则:每次评估从全量商品池随机抽 200 个候选,负样本按曝光未点击生成,抽 5 次取均值。
案例:某服饰类目 9 月在广州试点,离线 AUC 0.74、NDCG@10 0.58,上线后 CTR 只涨 0.15 个百分点。排查发现测试集里 30% 的样本来自“大促当天”,而大促的流量特征(价格敏感、决策快)和日常差异明显。把大促样本剔除后重训,离线 AUC 降到 0.72,但线上提升到 0.3 个百分点。
概率校准时用 10 个分桶,每桶约 4200 条样本。观察预测概率均值与实际正样本率的偏差:第 1 桶预测 0.008、实际 0.006,第 10 桶预测 0.35、实际 0.28,整体高估约 15%。修正方法是用等渗回归在留出集上重校准,校准后排序不变但预算分配更准。
常见错误清单:1)用训练集上的 AUC 做汇报;2)评估集正负样本比例和线上不一致;3)忽略位置偏差导致的样本选择问题;4)把多次调参后的最好结果当最终结果;5)只报一个指标不报置信区间;6)评估脚本和训练脚本的特征处理逻辑不一致。
最后看稳定性和覆盖率。连续 5 天每天重训一次,AUC 波动在 0.71 到 0.735 之间,波动超 0.02 说明特征不稳定。覆盖率上,打分成功的商品占候选池 97%,剩下 3% 因缺少类目特征被兜底规则接管,这部分商品的 CTR 比模型打分商品低 40%,需要在报表里单独拆出来看。