· Xiaojing Yang · Machine Learning · 3 min read
EN用于模型评估的交叉验证
为什么一次划分很脆弱,K-fold 如何工作,以及交叉验证什么时候会在 NLP 中误导我们。
核心观点
交叉验证通过轮换验证集,估计模型表现是否依赖某一次划分。
1. 为什么一次划分很脆弱
一次 train/validation split 可能很倒霉。验证集可能异常简单、异常困难,或者缺少重要子群体。交叉验证可以降低结果对一次划分的依赖。
每一折是一个数据块
每次留出一折
得到 K 个验证分数
估计表现和波动
2. 常见变体
| 变体 | 适用情况 |
|---|---|
| KFold | 回归或比较均衡的数据 |
| StratifiedKFold | 分类且类别不平衡 |
| GroupKFold | 样本共享用户、文档、说话人或来源 |
| TimeSeriesSplit | 未来不能泄漏到过去 |
| Nested CV | 调参和性能估计都重要 |
3. sklearn 例子
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.linear_model import LogisticRegression
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(LogisticRegression(max_iter=1000), X, y, cv=cv, scoring="f1_macro")
print(scores.mean(), scores.std())4. 什么时候 CV 会误导 NLP
交叉验证默认 split 结构和真实泛化问题匹配。但 NLP 里,随机折可能泄漏近重复文档、同一模板、同一说话人、同一话题或同一来源语料。
好的 NLP CV
使用 group-aware、document-aware、time-aware 或 domain-aware folds。
坏的 NLP CV
当文档或来源有重叠时,仍然随机拆句子级样本。
总结
交叉验证不只是一个函数调用,而是在问:评估结果能否经受住不同数据视角的检验。
面试回答模板
如果面试问到这个概念,我会分四层回答:
- 先给短定义;
- 再讲直觉;
- 指出常见失败模式;
- 最后连接到真实评估或部署决策。