数据泄漏会让评估结果失真
识别目标泄漏、划分泄漏、预处理泄漏和时间穿越,说明为什么所有学习步骤都必须限制在训练数据内。
数据泄漏会让评估结果失真
模型评估试图回答它对未来未知样本会怎样表现。只要训练过程接触了评估时本不该知道的信息,测试分数就不再代表这个问题。数据泄漏不一定表现为把标签列直接送入模型;它也可能藏在预处理统计量、时间切分、重复实体或多次查看测试结果的决策中。
测试集必须留在学习过程之外
训练集用于估计模型参数,验证数据用于选择特征、超参数和停止时机,测试集用于在这些选择完成后做一次独立评估。若根据测试结果反复调整模型,测试集事实上已经参与选择,最终分数会偏向这一个数据集合。
交叉验证把数据轮流分成训练折和验证折,可以提高有限样本的利用率,却不会自动建立独立测试。用交叉验证选完方案后,仍应在未参与选择的数据上报告最终结果,或者明确采用嵌套交叉验证来分离内外层职责。
“没有调用训练接口”不等于没有学习。人工浏览测试样本、根据测试误差增加规则、选择表现最好的一次随机种子,都把测试信息带回了开发过程。评估协议需要记录数据何时冻结、谁能访问以及允许进行多少次决策。
预处理也会从数据中学习
标准化需要估计均值和方差,缺失值填补需要估计分布,特征选择要查看特征与目标的关系,降维也会拟合数据结构。这些步骤都属于模型训练链,应只在当前训练折上拟合,再用已得到的变换处理验证折和测试集。
先对全量数据标准化再做交叉验证,会让每个训练折获得验证折的分布信息。先在全量数据上筛选与标签最相关的特征,泄漏更直接,因为验证标签已经影响了输入空间。样本很多时偏差可能不易察觉,但方法仍然错误。
把预处理和估计器封装在同一流水线,可以使交叉验证对每个训练折独立拟合所有步骤。流水线只是执行边界,使用者仍需确认自定义转换器没有读取全局文件、缓存全量统计或通过外部服务取得未来信息。
目标泄漏来自部署时不可用的特征
某个字段可能在历史数据中与目标高度相关,却是在目标发生之后才产生。例如预测住院风险时使用出院诊断,预测违约时使用催收结果,都会得到看似优秀但无法部署的模型。判断特征是否合法,应以预测发生的时间点为界,而不是以数据库中能否查询到为界。
代理字段也可能泄漏目标。业务流程中的状态码、审核人员动作、文件命名或缺失模式,可能间接编码结果。发现异常强的单一特征时,要追溯它的生成流程、更新时间和权限,而不是只看统计相关性。
标签构造本身也会越界。用未来一年的行为定义正例后,特征窗口必须结束在预测时点之前,并留出必要的观测延迟。若特征聚合窗口与标签窗口重叠,模型可能直接读取要预测的事件。
随机切分不适合所有数据结构
独立同分布是假设,不是数据表天然具备的属性。同一用户的多条记录、同一患者的多次检查、同一地点的相邻像元或同一文档的切片高度相关。随机按行切分会让近似副本同时出现在训练和测试中,分数主要反映记忆实体特征,而非泛化到新实体。
存在群组时,应按用户、设备、场景、地块或其他独立单位切分。群组定义要与部署问题一致:若未来仍服务同一批用户,可以评估同实体的新时间段;若目标是扩展到新用户,则测试集必须包含未见实体。
空间数据还受邻近相关影响。随机抽取像元会让训练样本紧邻测试样本,导致过于乐观的地图精度。按区域留出或使用空间阻隔能更接近跨地区泛化,但区域边界和尺度需要依据实际应用设计。
时间数据必须保持因果顺序
时间序列随机打乱后切分,未来样本可能进入训练,模型因而提前知道分布、季节甚至事件结果。时间切分通常用较早数据训练、较晚数据验证,并让所有滚动统计只使用当时可见的历史。
数据仓库中的事件时间和入库时间也不同。一个事件虽发生在预测之前,却可能在预测之后才被系统记录。离线特征若按最新数据库回填,会获得线上实时系统当时拿不到的修正值。可靠评估需要按时间点重建可用信息状态。
概念漂移使时间评估更复杂。较晚测试集分数下降不一定说明模型实现错误,也可能说明数据生成过程变化。泄漏检查和漂移分析要分开:前者保证信息边界,后者解释边界内的分布变化。
重复样本与数据血缘需要审计
训练和测试中出现完全重复或近重复样本,会抬高分数。网页、图像和遥感切片常由同一原始对象派生,文件名不同并不代表独立。去重应考虑内容哈希、相似度、原始来源和派生关系,并在切分前建立群组。
外部预训练数据也可能包含测试材料。大型通用模型很难完全追踪训练语料时,评估应选择受控、时间更新或可检测污染的集合,并谨慎解释高分。不能因为下游训练代码没有读测试集,就断言整个系统不存在污染。
数据版本、抽取查询、标签规则、预处理参数和切分种子构成评估血缘。缺少这些记录,团队无法判断分数变化来自模型、数据更新还是切分差异。
防泄漏检查要贴近部署问题
有效检查从一句可验证的问题开始:预测发生时,系统能知道哪些信息;部署面对的是新行、新实体、新地区还是未来时间。随后按这个单位切分,确保每个学习步骤只在训练部分拟合,并把最终测试集冻结到方案确定之后。
异常高分、训练和测试差距反常地小、某个特征接近完美预测,都应触发血缘检查。删除可疑列只是起点,还要找出它为何出现,避免同类信息换一个字段再次进入。
数据泄漏不会因为模型简单而消失。线性模型、树模型和深度网络都可能利用越界信息。真正的防线是让数据切分、时间边界和流水线结构忠实模拟模型将要面对的未知世界。
资料依据
- scikit-learn Project:Cross-validation: evaluating estimator performance,https://scikit-learn.org/stable/modules/cross_validation.html
- scikit-learn Project:Common pitfalls and recommended practices,https://scikit-learn.org/stable/common_pitfalls.html