4. 样本标签定义与时间窗口:观察期、表现期、好坏标签定义(DPD30/60/90+)

在风控建模中,样本标签的定义直接决定了模型学习的目标。错误的标签定义会导致模型学习到错误的模式,甚至产生严重的业务风险。本章节系统讲解观察期与表现期的划分逻辑,以及基于逾期天数(DPD)的好坏标签定义方法。

4.1 时间窗口核心概念

任何风控模型都建立在“用过去预测未来”的假设之上。因此,必须严格划分两个时间窗口:

概念 定义 作用
观察期 用于提取用户特征(X)的历史时间区间 收集用户的借贷、消费、还款等行为数据,生成特征变量
表现期 用于观察用户是否发生逾期(Y)的未来时间区间 根据用户在表现期内的还款表现,定义好坏标签
观察点 观察期与表现期的分界点 特征提取的截止时间,也是风险预测的起始时间
关键原则:观察期内的数据不能用于定义标签,表现期内的数据不能用于提取特征。严格的时间隔离是防止“未来信息泄露”的根本保障。

4.2 观察期与表现期的时间关系

下图展示了观察期、表现期与好坏标签之间的逻辑关系:

观察期与表现期时间窗口示意图 观察期(特征提取) 表现期(标签定义) 观察点 T-12M T T+6M 好坏标签定义逻辑 在表现期内,若用户发生逾期天数 ≥ 阈值(如30天),则标记为“坏样本”;否则为“好样本”

4.3 好坏标签定义:基于DPD的逾期标准

逾期天数(Days Past Due, DPD)是衡量用户还款表现的核心指标。根据业务风险容忍度,通常定义三种逾期阈值:

标签类型 DPD阈值 定义说明 适用场景
DPD30+ 逾期 ≥ 30天 用户超过还款日30天仍未还款 消费金融、信用卡、短期现金贷
DPD60+ 逾期 ≥ 60天 用户超过还款日60天仍未还款 车贷、房贷、中长期信贷
DPD90+ 逾期 ≥ 90天 用户超过还款日90天仍未还款 大额抵押贷款、企业信贷
业务建议:对于现金贷或消费分期产品,建议使用DPD30+作为坏样本定义,因为这类产品周期短、风险暴露快。对于房贷或车贷,DPD90+更符合行业惯例,因为大额贷款用户短期逾期后仍有较高概率还款。

4.4 表现期长度选择

表现期长度直接影响标签的稳定性和样本量。过短的表现期会导致标签不充分(好样本被误判为坏样本),过长的表现期会减少可用样本量。

表现期长度 优点 缺点 推荐DPD
3个月 样本量大,时效性好 标签可能不充分,坏样本识别不全 DPD30+
6个月 标签稳定,坏样本识别较充分 样本量减少,时效性下降 DPD30+ / DPD60+
12个月 标签最稳定,坏样本识别最充分 样本量大幅减少,时效性差 DPD60+ / DPD90+

4.5 样本标签定义流程

以下流程图展示了从原始数据到好坏标签的完整处理步骤:

样本标签定义流程 1. 确定观察点 2. 划分观察期与表现期 3. 选择DPD阈值 4. 计算表现期内最大逾期天数 5. 生成好坏标签(0/1)

4.6 标签定义中的常见问题与避坑

  • 未来信息泄露:使用表现期之后的数据来定义特征,导致模型在训练时“看到”了未来的信息,上线后效果大幅下降。
  • 标签不平衡:坏样本比例过低(如低于1%)时,模型容易偏向预测为好样本。建议通过下采样或过采样方法平衡样本。
  • 表现期不足:表现期太短导致部分潜在坏样本未被识别,模型低估风险。
  • 多笔订单处理:同一用户在表现期内有多笔订单时,应取最大逾期天数作为标签,或按订单维度独立建模。
重要提醒:标签定义完成后,务必进行标签分布分析。如果坏样本占比低于0.5%,建议考虑放宽DPD阈值(如从DPD90+改为DPD60+)或延长表现期,以确保模型有足够的坏样本进行学习。

4.7 标签定义示例代码

以下Python代码展示了如何基于DPD30+定义好坏标签:

import pandas as pd
import numpy as np

# 示例数据:用户还款记录
data = {
    'user_id': ['U001', 'U002', 'U003', 'U004'],
    'loan_date': ['2023-01-15', '2023-02-20', '2023-03-10', '2023-04-05'],
    'due_date': ['2023-02-14', '2023-03-22', '2023-04-09', '2023-05-05'],
    'repay_date': ['2023-02-12', '2023-04-01', None, '2023-05-20']
}
df = pd.DataFrame(data)
df['due_date'] = pd.to_datetime(df['due_date'])
df['repay_date'] = pd.to_datetime(df['repay_date'])

# 计算逾期天数
df['dpd'] = (df['repay_date'] - df['due_date']).dt.days
df['dpd'] = df['dpd'].fillna(999)  # 未还款标记为极大值

# 定义好坏标签(DPD30+)
df['label'] = np.where(df['dpd'] >= 30, 1, 0)

print(df[['user_id', 'dpd', 'label']])
输出结果:U001逾期0天(好样本),U002逾期10天(好样本),U003未还款(坏样本),U004逾期15天(好样本)。注意:实际业务中,未还款通常直接标记为坏样本。