第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 核心指标怎么定?
很多产品经理上来就看「点击率」。
但点击率高了,转化率可能反而降了。
为什么?因为用户点了但发现内容不对,就走了。
我建议至少盯三个层级:
- 行为指标:点击率、曝光量、停留时长
- 业务指标:转化率、GMV、留存率
- 体验指标:用户投诉率、负面反馈率
这三个层级,缺一不可。
但一周后用户留存率掉了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测试要防实验设计缺陷。
两者结合,才是完整的评估体系。
嗯,这一章内容不少。
但说实话,评估这件事,做十次可能只有一次是完美的。
关键是每次踩坑后,能总结出经验。
下一章咱们聊聊「模型迭代策略」——
怎么在有限资源下,让模型持续变强。