机器学习 · 互动实验室

交叉验证

轮流留一份考试,看模型换一批数据还能不能答对

01分出考卷02轮流训练03汇总成绩
看这里
用来训练留出验证合成数据 · 3 邻居回归 · 误差越小越好

文字版:交叉验证在做什么

把数据一分为二、训练一次、测一次,得到的成绩里有很大一部分是运气——恰好被分到测试集里的那些样本是难是易,直接决定了这个数字。交叉验证的办法是:把数据分成若干份,轮流拿一份当考卷、其余当教材,每份都当过一次考卷,最后取平均。

画面上正在发生什么

播放演示,每一折会高亮出当前被留作验证的那一份,剩下的几份用于训练,然后算出这一折的误差。注意每一折的误差都不一样,有时差得还不少——这正说明了「只划分一次」得到的那个数字有多不可靠。全部跑完后取平均,才是相对稳的估计。

切到「12 个对象,各五条记录」这组数据,再勾上「同一对象的记录放在同一折」。不勾的时候,同一个对象的五条记录会被分散到不同折里,于是模型在训练时见过这个对象、验证时又碰到它——成绩会虚高。这是医学、传感器、用户行为数据里最常见的一种泄漏。

什么时候它会骗你

  • 同源样本被拆散,成绩就作废。同一个病人的多次检查、同一台设备的多条记录、同一个用户的多次点击,必须整组留在同一折。否则模型学到的是「认出这个对象」,而不是「判断这类对象」。
  • 预处理放在划分之前做,泄漏就已经发生了。标准化、缺失值填补、特征选择都必须在每一折内部、只用该折的训练部分来拟合。先对全量数据做标准化再划分,验证集的信息已经通过均值和标准差渗进了训练过程。
  • 时间序列不能随机分折。按时间排列的数据必须用向前推进的切分方式,保证训练数据永远早于验证数据。随机分折等于让模型用未来预测过去。

常见问题

K 折交叉验证的 K 该取几?
常用 5 或 10。K 越大,每次训练用的数据越多、估计的偏差越小,但计算量线性增加,而且各折之间重叠度高、方差不一定更小。样本量很小时可以用留一法(K 等于样本数),样本量很大时 5 折通常就够。
交叉验证能替代独立测试集吗?
不能。交叉验证的结果会被反复用来挑模型、调参数,挑得越多,这个数字就越乐观。最终报告的成绩应该来自一份从头到尾没参与过任何选择的独立测试集。
为什么分层交叉验证更常用?
因为普通随机分折可能让某一折里的正例比例和整体差很多,类别不平衡时尤其明显,甚至出现某折完全没有正例。分层抽样保证每一折的类别比例与整体一致,估计更稳。

本页为教学合成数据,各折误差由页面用 3 邻居回归实时计算。

作者与维护:覃秉丰 · 关于覃秉丰 · 引用本页讲解

继续学习