数据与特征
交叉验证(cross-validation)
/ KROSS val-ih-DAY-shun /
当你手头的数据并不充裕时,单独留出一份验证集会显得很浪费——而且只靠一刀切出的那一份,得到的分数可能纯属碰运气。交叉验证是一种巧妙地重复利用同一批数据的办法,让每个例子都轮流当一次「考题」,从而对模型究竟有多好给出更稳的估计。
最常见的做法是K折交叉验证(k-fold cross-validation)。把数据打乱后切成k份相等的部分,称为折(fold)——比如五份。在其中四折上训练、在留出的第五折上测试,记下分数;如此重复五次,每次留出不同的一折,于是每个例子恰好被测试一次、其余时候用于训练。把这五个分数取平均。这个平均值,连同分数围绕它的波动大小,就同时告诉了你「典型表现如何」与「这个估计有多可靠」。
为何重要:单次的训练/验证划分可能恰好赶上好运或霉运,数据集越小越如此。交叉验证把这种运气成分抹平,也更充分地用上了数据。它最常被用来诚实地比较模型或调节超参数。代价是计算量——你要训练k次而非一次——而且同样的防泄露讲究依旧成立:任何数据清洗或缩放,都必须在每一折的训练数据内部去学,而不能事先在整份数据上做。
有500位病人、做5折交叉验证时,你训练出五个模型,每个在400位病人上训练、在不同的100位上测试。得到的准确率是81%、78%、83%、79%、80%——于是你报告约为80%、上下浮动2%,这个数字远比任何单次运行都更可信。
5折交叉验证:每个例子被测试一次;取平均抹平了单次划分的运气成分。
交叉验证用于「选择」与「估计」,但替代不了那场保持诚实的期末大考。即便用了交叉验证,你最后仍应保留一份真正没碰过的测试集——而且任何预处理都必须在每一折内部拟合,否则你早已发生了泄露。
又称
另见