第4章:离线评估与在线评估

评估模型,说白了就是回答两个问题:
「这模型到底行不行?」和「上线后用户买不买账?」

我做了这么多年AI产品,见过太多团队在评估上翻车。
有的离线指标刷得飞起,一上线就崩。
有的A/B测试跑了三周,结果发现实验设计本身就是个坑。

今天咱们就把这两件事掰开揉碎了讲。

4.1 离线测试集怎么建?

离线评估,核心就一句话:
用历史数据模拟未来表现。

但这里有个大坑——数据泄露
我刚开始带项目时,就犯过这个错。
训练集和测试集混了时间戳,结果模型在测试集上准确率95%,上线直接掉到60%。
嗯,那叫一个惨。

4.1.1 时间维度切割

对于时序类数据(推荐、搜索、广告),千万别随机切分
我个人的习惯是:

  • 按时间窗口切:前70%做训练,后30%做测试
  • 或者按天切:周一到周六训练,周日测试

你想想看,模型要预测的是未来,不是过去。
用未来的数据训练,去预测过去?那叫作弊。

核心原则:测试集的时间必须晚于训练集的时间。

4.1.2 分层采样

非时序数据(比如图像分类、文本分类),可以用随机切分。
但要注意类别分布

举个例子:
你的数据里90%是「正常用户」,10%是「异常用户」。
如果随机切分,测试集里可能只有1%的异常用户。
模型全猜「正常」都能有90%准确率——这有意义吗?

我建议用分层采样

from sklearn.model_selection import train_test_split

# 按标签分层
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2, 
    stratify=y,  # 保持类别比例
    random_state=42
)

4.1.3 构建「硬样本」测试集

这是我最想强调的一点。
很多团队建的测试集太「软」了——全是简单样本。
模型跑起来指标好看,但一遇到边界情况就露馅。

我曾经在做一个风控模型时,专门从历史数据里挑出:

  • 被误判过的样本
  • 用户投诉过的案例
  • 金额异常的订单

把这些单独组成一个「硬样本集」。
模型在这个集上的表现,才是真正的实力。

小技巧:离线测试集最好建三个版本:
1. 标准版(随机采样)
2. 硬样本版(边界情况)
3. 时间穿越版(模拟未来数据)

4.2 在线A/B测试怎么玩?

离线评估过了,不代表上线就稳。
为什么?因为环境变了

离线测试用的是历史数据,用户行为是固定的。
但线上用户会反作用于模型
你推荐了A,用户就不看B了——这叫「反馈循环」。

4.2.1 实验设计三要素

我见过最蠢的A/B测试是什么?
拿周一的数据和周二的数据比。
周一用户活跃度本来就低,比个锤子。

正确的做法:

要素 说明 常见坑
随机分流 用户随机进入实验组/对照组 按时间切分(周一/周二)
样本量足够 统计功效≥0.8 样本太少,结果不可信
实验周期 至少覆盖一个完整周期 只跑一天,忽略周末效应

4.2.2 核心指标怎么定?

很多产品经理上来就看「点击率」。

但点击率高了,转化率可能反而降了。
为什么?因为用户点了但发现内容不对,就走了。

我建议至少盯三个层级:

  1. 行为指标:点击率、曝光量、停留时长
  2. 业务指标:转化率、GMV、留存率
  3. 体验指标:用户投诉率、负面反馈率

这三个层级,缺一不可。

避坑指南:我曾经做过一个推荐模型,离线AUC提升了3%,上线后点击率涨了5%。
但一周后用户留存率掉了2%。
原因?模型推荐了太多「标题党」内容,用户被骗进来,但体验很差。
从那以后,我每次上线新模型,必盯留存和投诉率。

4.2.3 多臂老虎机(MAB)

传统A/B测试有个问题:
你得等实验结束才能知道结果。
如果模型A明显比B差,你还得继续给A流量?

这时候可以用多臂老虎机

说白了,就是动态调整流量分配:

  • 一开始各50%
  • 发现A效果好,逐渐给A更多流量
  • B效果差,慢慢减少

我曾在广告排序场景用过这个方法。
相比传统A/B测试,整体收益提升了15%
因为减少了「浪费流量」的时间。

4.2.4 实验的「刹车机制」

这一点,很多团队会忽略。
A/B测试跑着跑着,发现模型效果很差——怎么办?

我建议提前设定止损线

# 伪代码示例
if 核心指标下降超过5%:
    自动回滚到旧模型
    发送告警给团队
    记录实验日志

别等到用户都跑光了,才手动关实验。
自动化止损,是成熟团队的标配。

总结一下:
离线评估看「能力」,在线评估看「效果」。
离线测试集要防数据泄露,在线A/B测试要防实验设计缺陷。
两者结合,才是完整的评估体系。

嗯,这一章内容不少。
但说实话,评估这件事,做十次可能只有一次是完美的。
关键是每次踩坑后,能总结出经验。

下一章咱们聊聊「模型迭代策略」——
怎么在有限资源下,让模型持续变强。