交叉验证:稳健评估模型
单次随机切分训练集与验证集,结果会随切分波动,尤其数据少时不可靠。交叉验证(cross-validation)通过多次划分取平均,给出更稳健的泛化估计,是模型选择与超参调优的标准做法。
K 折交叉验证
把数据分成 K 份,轮流用其中 1 份做验证、其余 K-1 份训练,重复 K 次后取指标平均与方差。K 常取 5 或 10:K 越大估计越稳但越费算力。它能更充分利用有限数据。
分层与留一法
分层 K 折(stratified)在分类时保持每折的类别比例,避免某折类别失衡。留一法(LOO)让 K 等于样本数,估计几乎无偏但计算昂贵,只适合极小数据集。
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
scores = cross_val_score(LogisticRegression(), X, y, cv=5, scoring="f1")
print(scores.mean(), scores.std())
调参与嵌套验证
用交叉验证选超参时,要注意外层评估与内层调参分离,否则会乐观偏差。网格搜索(GridSearchCV)内部已用交叉验证,但最终的泛化估计应在一个独立测试集或一个外层折上给出。
常见误用
绝对不要把测试集混入交叉验证的任意折——那会造成数据泄漏,指标虚高。预处理(缩放、编码)也应在每折内拟合并应用到验证折,而非全局先处理。
小结
交叉验证通过多次划分取平均,给出比单次切分更稳健的泛化估计。K 折最常用,分类用分层,调参注意内外层分离,并严防测试集泄漏。它是可靠的模型选择基石。
参考与延伸阅读
- scikit-learn 交叉验证用户指南(K 折、分层、嵌套)。已核验。https://scikit-learn.org/stable/modules/cross_validation.html
- 关于嵌套交叉验证避免偏差的说明。已核验。https://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
- 交叉验证理论见《The Elements of Statistical Learning》第 7 章。待核实。https://web.stanford.edu/~hastie/ElemStatLearn/
本文累计阅读 — 次