Math-08.泛化与正则-06.交叉验证

本页讲解 交叉验证(cross-validation,CV)——在数据有限时更可靠地估计泛化性能并选超参。

段末注释k 折交叉验证(k-fold cross-validation)将数据分为 $k$ 份,轮流以一份作验证、其余作训练,对 $k$ 次验证分数求平均。

系列入口00.系列规划 | 前置:01 总论Math-01/20 多重比较


1. k-fold 流程(D2–D3)

图 1 5-fold 示意

$$
\text{CV score} = \frac{1}{k}\sum_{i=1}^k L^{(i)}_{\mathrm{val}}
$$

方差:$k$ 越大,CV 估计越稳,但训练次数增。

$k$ 特点
5 常用默认
10 更稳,更慢
LOOCV ($k=n$) 无偏但高方差、代价大

2. 变体(D3–D7)

图 2 Stratified vs Group

方法 适用
StratifiedKFold 分类,保持各类比例
GroupKFold 同组样本不跨 train/val(患者、细胞系、实验批次)
TimeSeriesSplit 时序,训练只含过去
Nested CV 外层估性能,内层调参,防泄漏

3. 跨领域例子(D7)

图 3 CV 在不同领域

领域 划分要点 若随机划分的问题
医学诊断 患者 GroupKFold 同一患者 CT 同时出现在 train/val
单细胞 RNA-seq 供体/批次分组 批次效应被模型「记忆」
酶突变筛选 亲本序列实验日分组 近邻突变泄漏到验证
股票预测 时间前滚 未来信息泄漏
多中心临床 留一中心作 val 评估跨中心泛化
小样本分类 LOOCV 或 $k=5$ + 重复 方差大,报置信区间

4. CV 与显著性(D6)

比较两模型 CV 分数差:$k$ 折分数非独立 → 用 paired t 检验5×2 CVMath-01/02 t检验)。多次模型比较需 Math-01/20 FDR


5. 泄漏防范(D8)

图 4 CV 泄漏

泄漏源 正确做法
全数据 fit 标准化 每 fold 只在 train fit scaler
特征选择看全数据 选择放在 train fold 内
重复样本 去重或 GroupKFold
调参后再用同 CV 报性能 Nested CV

6. sklearn 示例(D12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np

X = np.random.randn(300, 20)
y = (X[:, 0] > 0).astype(int)

pipe = Pipeline([
("scale", StandardScaler()),
("clf", LogisticRegression(max_iter=500)),
])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(pipe, X, y, cv=cv, scoring="accuracy")
print("CV accuracy:", scores.mean(), "+/-", scores.std())

7. 小结

CV 是小数据 ML 的标配;分组时序划分比盲目 k-fold 更科学。下一篇:07 集成

系列导航05 早停 | 10 诊断

-------------本文结束感谢您的阅读-------------