算法迭代基础:模型评估指标、离线评估与在线评估、A/B测试原理
做算法迭代,说白了就是回答三个问题:模型好不好?上线能不能扛?改了有没有用? 这三个问题分别对应着评估指标、离线/在线评估、以及A/B测试。我这些年踩过的坑,十有八九都跟这几个环节没做好有关。
核心逻辑: 评估指标是标尺,离线评估是实验室,在线评估是试运行,A/B测试是最终裁判。四者缺一不可。
1. 模型评估指标:选对尺子才能量对尺寸
评估指标这东西,选错了比没选更可怕。我见过一个团队,模型离线AUC刷到0.98,上线后业务指标反而跌了。为什么?因为AUC只看排序能力,不看预测值的绝对准确性。
常用的指标,我按场景给你捋一遍:
| 指标 | 适用场景 | 我的经验 |
|---|---|---|
| 准确率(Accuracy) | 类别均衡的分类 | 样本不平衡时千万别用,否则模型全判负也能有99% |
| 精确率(Precision) | 宁缺毋滥的场景 | 比如推荐系统,用户不喜欢的内容宁可少推 |
| 召回率(Recall) | 宁可错杀一千 | 比如风控,漏掉一个坏账可能损失巨大 |
| F1-Score | 需要平衡的场景 | 我个人习惯用F1作为分类模型的默认指标 |
| AUC | 排序任务 | 注意:AUC高不代表预测值校准 |
| RMSE/MAE | 回归任务 | RMSE对异常值敏感,MAE更鲁棒 |
小技巧: 我建议你至少选两个指标,一个主要指标,一个辅助指标。比如推荐系统,主指标用CTR,辅指标用用户停留时长。这样能避免「刷分」现象。
2. 离线评估:实验室里的安全测试
离线评估,就是在历史数据上跑模型。听起来简单,但坑不少。
我记得有一次,我用过去3个月的数据训练模型,离线评估效果炸裂。结果上线后一塌糊涂。后来发现,那3个月正好是双十一大促期间,数据分布跟平时完全不一样。
离线评估的关键点:
- 时间序列分割: 千万别随机切分!要用时间顺序,前70%训练,后30%验证。我见过有人随机切分,结果模型「偷看」了未来数据。
- 交叉验证: 数据量小的时候,用K折交叉验证。但注意,时间序列数据要用滚动窗口验证。
- 样本权重: 如果历史数据有采样偏差,记得加权重。比如点击率数据,正样本通常只有1%,直接训练模型会偏向负样本。
# 时间序列分割示例
import pandas as pd
from sklearn.model_selection import TimeSeriesSplit
# 假设df是时间排序后的数据
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, val_idx in tscv.split(df):
train_data = df.iloc[train_idx]
val_data = df.iloc[val_idx]
# 训练和验证
⚠️ 我曾经踩过的坑: 离线评估时用了未来特征。比如预测用户明天是否购买,却用了「用户今天是否浏览」作为特征。这在离线数据里是合法的,但线上根本拿不到。所以,特征工程一定要做时间对齐检查。
3. 在线评估:真刀真枪的试运行
离线评估通过后,模型要上线了。但别急着全量推,先做在线评估。
在线评估跟离线评估最大的区别是:你面对的是真实用户,数据分布是动态的。
我一般会关注这几个在线指标:
- 响应延迟: 模型推理时间。如果超过100ms,用户可能就流失了。
- 吞吐量: 每秒能处理多少请求。QPS上不去,再好的模型也没用。
- 效果指标: 比如CTR、转化率、用户停留时长。这些才是业务关心的。
- 数据漂移检测: 监控特征分布是否跟训练时一致。如果变了,模型可能失效。
你想想看,离线评估时模型跑在GPU上,线上可能只有CPU。我遇到过模型在GPU上延迟5ms,换到CPU直接飙到200ms。所以在线评估一定要在真实环境里跑。
4. A/B测试原理:最终裁判
A/B测试,说白了就是对照实验。把用户随机分成两组,一组用旧模型(对照组),一组用新模型(实验组),然后比较效果。
但A/B测试不是随便跑跑就行的。我总结了几条铁律:
- 随机分流: 用户必须随机分配。不能按地域、时段等非随机方式分,否则会有偏差。
- 样本量足够: 用统计功效分析算一下需要多少样本。我一般要求至少跑够7天,覆盖工作日和周末。
- 单一变量: 一次只改一个东西。如果你同时改了模型和推荐策略,出了问题你根本不知道是哪个导致的。
- 统计显著性: 别只看均值,要看p值。p值小于0.05才算显著。我见过有人跑了两天看到CTR涨了0.1%就欢呼,结果跑完一周发现是波动。
核心公式: A/B测试的样本量估算公式:n = (Zα/2 + Zβ)² × (σ₁² + σ₂²) / (μ₁ - μ₂)²。其中Zα/2是显著性水平对应的Z值(通常1.96),Zβ是统计功效对应的Z值(通常0.84)。
嗯,这里要注意:A/B测试不是万能的。有些场景不适合,比如全量推送的新闻推荐,你没法让一部分用户看不到某个重大新闻。这时候可以用准实验设计,比如时间序列对比。
我的习惯: 每次A/B测试结束后,我会把实验组和对照组的数据保存下来,方便后续复盘。有时候模型效果没变,但用户行为变了,这些数据能帮你找到原因。
最后说一句:评估指标、离线评估、在线评估、A/B测试,这四个环节是环环相扣的。离线评估帮你快速筛选,在线评估帮你发现工程问题,A/B测试给你最终结论。跳过任何一步,都可能让你在错误的路上越走越远。