4. 标签定义与目标变量:违约标签定义、连续风险评分目标、二分类与多分类场景
在风险定价模型中,标签(Label)与目标变量(Target Variable)是模型学习的核心依据。标签定义的质量直接决定模型能否准确区分“好客户”与“坏客户”,进而影响定价策略的公平性与盈利性。本章系统梳理违约标签的常见定义方式、连续风险评分目标的构造逻辑,以及二分类与多分类场景下的标签设计要点。
4.1 违约标签定义
违约标签通常基于客户在观察期之后的还款表现进行定义。不同业务场景对“违约”的界定存在差异,常见定义方式包括:
| 定义方式 | 典型规则 | 适用场景 | 优缺点 |
|---|---|---|---|
| 逾期天数阈值 | 逾期 ≥ 30天 / 60天 / 90天 | 消费信贷、信用卡 | 简单直观,但阈值选择主观性强 |
| 滚动率(Roll Rate) | 从当前逾期状态向更严重状态迁移的比例 | 风险分层、早期预警 | 动态反映恶化趋势,需较长表现期 |
| 最终损失(Write-off) | 已核销、已转催收、已法律诉讼 | 不良资产定价、催收策略 | 标签最准确,但样本稀疏、时间滞后 |
| 复合定义 | 逾期 ≥ 60天 且 逾期金额 > 500元 | 高价值客户、大额贷款 | 减少噪声,但规则复杂 |
实践建议:在训练集划分时,应确保违约标签在时间维度上具有“前瞻性”——即使用观察期之后的表现期数据定义标签,避免使用观察期内的历史违约信息,防止标签泄漏(Label Leakage)。
4.2 连续风险评分目标
除了二分类违约标签,部分风险定价模型使用连续风险评分作为目标变量,以更精细地刻画客户的违约概率或预期损失。常见构造方法包括:
- 违约概率(PD)平滑估计:利用逻辑回归、生存分析或贝叶斯方法,将二分类标签转化为0~1之间的连续概率值。
- 损失率(LGD)或预期损失(EL):结合违约损失率与违约概率,构造连续数值目标,适用于风险定价中的利率与额度决策。
- 风险评分卡转换:将原始违约概率通过评分卡公式映射为整数分数(如300~850分),便于业务解释与监管合规。
连续目标 vs 二分类目标:连续目标能提供更丰富的排序信息,但建模复杂度更高,且对标签噪声更敏感。在训练集划分时,连续目标通常要求更长的表现期以稳定估计。
4.3 二分类与多分类场景
根据业务需求,风险定价模型可设计为二分类或多分类任务。下表对比两种场景的核心差异:
| 维度 | 二分类场景 | 多分类场景 |
|---|---|---|
| 标签定义 | 好客户(0) vs 坏客户(1) | 正常 / 逾期30天 / 逾期60天 / 核销等 |
| 模型输出 | 违约概率(0~1) | 各类别概率分布 |
| 损失函数 | 二元交叉熵(Binary Cross-Entropy) | 多类别交叉熵(Categorical Cross-Entropy) |
| 评估指标 | AUC、KS、F1-score | 宏平均/微平均AUC、混淆矩阵 |
| 适用场景 | 是否批准贷款、是否提额 | 差异化催收策略、风险分层定价 |
注意:多分类场景下,类别之间可能存在顺序关系(如逾期天数递增),此时应优先考虑有序多分类模型(Ordinal Regression),而非普通多分类模型,以利用类别间的序数信息。
4.4 标签定义与目标变量关系图
下图展示了从原始数据到最终目标变量的完整流程,以及二分类与多分类场景下的标签映射关系:
4.5 标签定义与目标变量选择决策流程
在实际项目中,标签定义与目标变量的选择应遵循以下决策流程,以确保训练集与验证集的划分科学合理:
- 确定表现期窗口:根据业务周期,选择6个月、12个月或24个月作为表现期,确保违约事件有足够时间暴露。
- 选择违约定义规则:结合逾期天数、滚动率或最终损失,定义“坏客户”标准。
- 判断目标变量类型:若仅需审批决策,使用二分类标签;若需差异化定价或催收,考虑多分类或连续目标。
- 验证标签稳定性:在训练集与验证集上分别统计违约率,确保分布一致,避免时间偏移导致模型失效。
- 记录标签版本:每次调整标签定义或表现期,均需记录版本号,便于模型回溯与监管审计。
关键原则:训练集与验证集必须使用完全相同的标签定义。任何标签规则的变更(如从逾期30天改为逾期60天)都意味着需要重新划分数据集,并重新训练模型。
4.6 代码示例:标签构造与目标变量生成
以下Python代码展示了如何基于原始还款数据构造二分类违约标签,并生成连续风险评分目标:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
# 模拟原始还款数据
data = pd.DataFrame({
'customer_id': range(1000),
'max_dpd': np.random.choice([0, 5, 15, 30, 60, 90, 120], 1000), # 最大逾期天数
'loan_amount': np.random.uniform(1000, 50000, 1000),
'observation_date': pd.date_range('2023-01-01', periods=1000, freq='D')
})
# 定义违约标签:逾期 >= 60天 为坏客户
data['default_flag'] = (data['max_dpd'] >= 60).astype(int)
# 构造连续风险评分目标:使用违约概率的平滑估计
# 此处使用简单的逻辑变换作为示例
data['risk_score'] = 1 / (1 + np.exp(-0.05 * (data['max_dpd'] - 30)))
# 划分训练集与验证集(按时间顺序)
data_sorted = data.sort_values('observation_date')
train_data = data_sorted.iloc[:800]
valid_data = data_sorted.iloc[800:]
print(f"训练集违约率: {train_data['default_flag'].mean():.3f}")
print(f"验证集违约率: {valid_data['default_flag'].mean():.3f}")
注意:实际项目中,连续风险评分目标通常需要结合PD、LGD、EAD等多个维度,使用更复杂的统计模型或机器学习模型进行估计,而非简单的数学变换。