1. ML 模型的测试集/验证集/训练集划分策略与数据泄漏(Data Leakage)的识别和避免方法?请举例说明时间序列场景下的数据泄漏风险。
在机器学习模型开发中,如何科学地划分训练集、验证集与测试集,如何识别并避免数据泄漏(Data Leakage),并请以时间序列场景为例说明数据泄漏的具体风险?
- 训练/验证/测试集划分的比例与职责边界(训练拟合、验证调参、测试评估泛化)
- 数据泄漏的两种类型:目标泄漏(Target Leakage)与特征泄漏(Feature Leakage)
- 时间序列场景的时序切分(Time-based Split)与随机切分的区别
划分的目的是让测试集在模型训练与调参过程中"完全不可见",从而真实反映泛化能力。通常的比例约为训练 60-70%、验证 20%、测试 10-20%,但比例并非铁律,关键是三个集合数据来源同分布、且互不重叠。数据泄漏分为两类:一是特征泄漏,即训练时使用了线上推理根本拿不到的"未来信息"或"后验信息"(例如用交易是否成功作为特征来预测交易是否成功);二是目标泄漏,即标签信息被间接编入了特征。识别泄漏的方法包括:检查特征的时间戳是否晚于标签、检查特征是否高度相关于标签且逻辑上可疑、在测试集上做敏感性分析(若加入某特征后 AUC 异常飙升则高度可疑)。时间序列场景下必须采用基于时间的切分(如按日期划窗),绝不能随机打乱后切分,否则训练集和测试集会混入同一时间段的样本,导致模型"看到未来",测试指标虚高而线上退化。此外还应配合滚动窗口验证(Rolling Window / Walk-forward Validation)来评估稳定性。
泄漏的本质是"评估信息"与"训练信息"同源,使测试集失去独立验证意义。时间序列特别强调时序切分,是因为时间序列样本天然存在自相关,随机切分会破坏独立性。面试时建议先讲清楚三集合的职责,再讲泄漏的两大类,最后用时间序列举个具体例子,体现系统性思维。
# 随机切分(仅适用于非时序、独立同分布数据)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 时间序列必须用基于时间的切分,禁止随机打乱
train = df[df['date'] < '2024-01-01']
val = df[(df['date'] >= '2024-01-01') & (df['date'] < '2024-06-01')]
test = df[df['date'] >= '2024-06-01']