4. 样本标签定义与时间窗口:观察期、表现期、好坏标签定义(DPD30/60/90+)
在风控建模中,样本标签的定义直接决定了模型学习的目标。错误的标签定义会导致模型学习到错误的模式,甚至产生严重的业务风险。本章节系统讲解观察期与表现期的划分逻辑,以及基于逾期天数(DPD)的好坏标签定义方法。
4.1 时间窗口核心概念
任何风控模型都建立在“用过去预测未来”的假设之上。因此,必须严格划分两个时间窗口:
| 概念 | 定义 | 作用 |
|---|---|---|
| 观察期 | 用于提取用户特征(X)的历史时间区间 | 收集用户的借贷、消费、还款等行为数据,生成特征变量 |
| 表现期 | 用于观察用户是否发生逾期(Y)的未来时间区间 | 根据用户在表现期内的还款表现,定义好坏标签 |
| 观察点 | 观察期与表现期的分界点 | 特征提取的截止时间,也是风险预测的起始时间 |
关键原则:观察期内的数据不能用于定义标签,表现期内的数据不能用于提取特征。严格的时间隔离是防止“未来信息泄露”的根本保障。
4.2 观察期与表现期的时间关系
下图展示了观察期、表现期与好坏标签之间的逻辑关系:
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 样本标签定义流程
以下流程图展示了从原始数据到好坏标签的完整处理步骤:
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天(好样本)。注意:实际业务中,未还款通常直接标记为坏样本。