跳到正文
格致开物MATHWIKI

交叉验证与数据泄漏

交叉验证把可用样本反复分为训练部分与验证部分,估计模型遇到新对象时的误差。它的关键并非折数,而是训练数据与验证数据之间必须保持所声称的“新”的含义。数据泄漏指训练或模型选择过程获得了部署时本不可能得到的信息,因此验证分数偏乐观。

一张分数表怎样失真

设每位病人做两次检查,表中还保留病人编号。若按检查记录随机分训练集和验证集,同一病人的第一次记录可能在训练集、第二次在验证集。模型记住编号与病情,就能在验证集上表现很好;但面对新病人时这个编号从未出现。要评价新病人预测,应以病人为分组单位,让一个人的全部记录只落在一个集合中。若任务改成“已知病人的下次检查”,分割方式又须尊重先后时间。这说明切分方法由部署问题决定,而不是由哪个方法的得分最高来决定。

另一个泄漏发生在预处理。假定训练样本某特征只有 0,2,留出的验证值是 100。训练均值是 (0+2)/2=1;若先用全体三个数算均值,变成 34。虽然验证标签尚未交给模型,验证特征的分布已经影响训练变换。标准化、缺失值填补、特征筛选、主成分分析和目标编码都应在每个训练折内部拟合,再把所得变换应用到该折验证集。

验证分数的含义

设第 k 折的验证索引为 Vk,训练索引为 Tk,算法仅用 Tk 拟合得 f̂k。对单个样本损失 L,折外平均损失可写为 R^CV=∑k=1K∑i∈VkL(yi,f̂k(xi))∑k=1K|Vk|. 这个写法按样本数加权;如果每个病人同等重要而各人的记录数不同,应先按病人汇总损失,再对病人平均。交叉验证估计的是指定训练规模、抽样机制和损失下的泛化表现,不是新环境里的保证。时间分布漂移、采样偏差或标签定义改变,都会使它失准。

普通 K 折适用于可合理近似独立同分布的样本。重复测量应使用分组折;空间邻近样本高度相似时要考虑空间块;时间序列则令每折训练时间严格早于验证时间,必要时加入间隔以避免临近窗口的重叠。图中的横条把相同病人的两次记录放在同一颜色区,而把整个病人留出。

按记录切分时同一人的两条记录同时出现在训练和验证两侧;按病人分组切分时两条记录一起进入验证侧
若目标是预测新病人,同一病人的所有记录必须一起留出。

调参与最终评估

如果试了二十套特征、参数和模型,却拿同一验证集选表现最佳者,最高分会含有选择偶然性。可用内层交叉验证选参数、外层不参与选择的折估计整个选择流程的表现;或者预先留出最终测试集,调参期间完全不查看它,直到模型定稿后只用一次。评估指标也要预先由任务确定:罕见阳性任务只报准确率可能掩盖漏检;概率输出还要检查预测概率校准,即把预测概率相近的案例分组,与实际事件频率比较。

特别警惕目标编码直接使用同一行标签、用全时期总体均值补早期缺失、用事后发生的“结案日期”预测结案、先在全数据上挑选相关特征、同一图像的裁剪片段横跨训练与测试。排查时逐列记下特征在预测时刻是否已经可见,再按对象和时间追溯原始记录。一个只有几行的诚实基线模型,通常比一份泄漏导致的漂亮验证曲线更可用。

参考资料与相关词条