3. 回放数据准备:数据时间窗口划分、样本选取原则、正负样本定义与采样策略

回放验证的核心在于模拟模型在真实业务环境中的上线表现。数据准备阶段决定了验证结论的可靠性,必须严格遵循时间因果逻辑,避免未来信息泄露。本节将系统讲解时间窗口划分、样本选取、正负样本定义及采样策略四个关键环节。

3.1 数据时间窗口划分

时间窗口划分是回放验证的基石。错误的窗口划分会导致模型在验证时“看到”未来数据,造成性能虚高。标准做法是将历史数据划分为三个连续且不重叠的时间段:

窗口名称 时间范围 用途 关键约束
训练窗口 T0 ~ T1 模型训练与特征工程 必须早于验证窗口,不能包含验证窗口的任何信息
验证窗口 T1 ~ T2 回放验证、策略评估 紧接训练窗口之后,时间上完全独立
观察窗口 T2 ~ T3 收集验证窗口样本的标签(Y值) 长度取决于业务表现周期,需保证标签充分暴露
实践要点:训练窗口与验证窗口之间建议保留一个 冷启动缓冲期(如7天),避免因特征计算边界模糊导致的时间穿越。观察窗口的长度通常设置为业务表现周期的1.5~2倍,例如信贷场景的逾期标签观察期常设为30天或90天。
回放验证时间窗口划分示意图 T₀ T₁ T₂ T₃ 训练窗口 验证窗口 观察窗口 关键原则:训练窗口数据不能包含验证窗口之后的任何信息 特征计算必须基于 T₁ 时刻之前的存量数据,禁止使用未来标签

3.2 样本选取原则

样本选取直接影响回放验证的泛化能力评估。选取过程需遵循以下四项核心原则:

  1. 时间一致性原则:所有样本必须按照其发生时间归属到对应的窗口,不能跨窗口混用。
  2. 样本独立性原则:同一用户在训练窗口和验证窗口中只能出现一次,避免用户重叠导致的数据泄露。
  3. 业务完整性原则:样本需覆盖业务全流程,包括正常、异常、拒绝、流失等各类场景。
  4. 标签可观测原则:验证窗口中的每个样本,在观察窗口内必须能够获取到明确的标签(正/负)。
常见陷阱:在回放验证中,如果直接使用全量历史数据随机切分训练集和测试集,会严重高估模型效果。例如,用2024年1月的数据训练,用2024年2月的数据测试,但训练集中包含了2024年2月之后才产生的特征或标签,这属于典型的未来信息泄露。

3.3 正负样本定义

正负样本的定义必须与业务目标严格对齐。在回放验证中,通常采用表现期观察法来定义样本标签:

业务场景 正样本定义 负样本定义 观察窗口长度
信贷风控 逾期 ≥ 30天 正常还款或逾期 < 30天 90天
反欺诈 确认欺诈交易 正常交易 30天
营销响应 点击/转化/购买 未点击/未转化 7天
流失预警 连续30天未登录 活跃用户 60天
定义要点:正负样本的边界必须清晰、可复现。避免使用主观判断(如“疑似欺诈”),优先使用客观业务事件(如“逾期天数≥30”)。观察窗口长度应固定,并在全量样本中保持一致。

3.4 采样策略

真实业务场景中正负样本往往高度不平衡(如欺诈率 < 1%)。直接使用原始分布进行回放验证会导致评估指标失真。常用的采样策略包括:

  • 下采样(Undersampling):随机减少多数类样本,使正负比例达到1:1~1:5。适用于多数类样本量充足的情况。
  • 上采样(Oversampling):复制少数类样本或使用SMOTE生成合成样本。适用于少数类样本量极少的情况。
  • 分层采样(Stratified Sampling):按时间、用户等级、渠道等维度分层,保证各层内正负比例与原始分布一致。
  • 时间加权采样(Time-weighted Sampling):对近期样本赋予更高权重,模拟模型上线后的实时数据分布。
回放验证采样策略选择流程 原始样本分布 正负比 是否平衡? 直接使用原始分布 否 需要采样 下采样(多数类) 上采样(少数类) 采样后建议使用 分层采样 保持时间维度分布,避免因采样破坏时间序列结构 回放验证中,采样操作仅应用于训练窗口,验证窗口保持原始分布以评估真实效果

3.5 样本选取与标签生成的完整流程

综合以上内容,回放验证的数据准备可归纳为以下标准步骤:

  1. 确定时间边界:根据业务周期设定 T₀、T₁、T₂、T₃。
  2. 提取候选样本:从业务日志中提取 T₁~T₂ 时间段内所有符合条件的用户/事件。
  3. 剔除重叠用户:确保训练窗口与验证窗口的用户集合无交集。
  4. 生成标签:在 T₂~T₃ 观察窗口内,根据业务规则判定每个样本的正负标签。
  5. 处理缺失标签:对于观察窗口内未产生明确结果的样本(如仍在观察中),予以剔除。
  6. 执行采样:根据正负比例和业务需求,在训练窗口内执行下采样或上采样。
  7. 验证分布一致性:对比采样前后训练窗口与验证窗口的特征分布,确保无显著偏移。
效率建议:在大规模回放验证中,建议将数据准备流程封装为可复用的ETL管道。使用时间分区表存储原始数据,通过SQL或Spark按窗口范围动态切分,避免每次验证都重新处理全量数据。