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 标签定义与目标变量关系图

下图展示了从原始数据到最终目标变量的完整流程,以及二分类与多分类场景下的标签映射关系:

标签定义与目标变量关系图 标签定义与目标变量关系图 原始还款表现数据 违约标签定义(规则引擎) 目标类型 二分类标签 多分类标签 好客户(0) / 坏客户(1) 正常/逾期30/60/核销 连续风险评分目标可由二分类概率或损失率平滑构造

4.5 标签定义与目标变量选择决策流程

在实际项目中,标签定义与目标变量的选择应遵循以下决策流程,以确保训练集与验证集的划分科学合理:

  1. 确定表现期窗口:根据业务周期,选择6个月、12个月或24个月作为表现期,确保违约事件有足够时间暴露。
  2. 选择违约定义规则:结合逾期天数、滚动率或最终损失,定义“坏客户”标准。
  3. 判断目标变量类型:若仅需审批决策,使用二分类标签;若需差异化定价或催收,考虑多分类或连续目标。
  4. 验证标签稳定性:在训练集与验证集上分别统计违约率,确保分布一致,避免时间偏移导致模型失效。
  5. 记录标签版本:每次调整标签定义或表现期,均需记录版本号,便于模型回溯与监管审计。
关键原则:训练集与验证集必须使用完全相同的标签定义。任何标签规则的变更(如从逾期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等多个维度,使用更复杂的统计模型或机器学习模型进行估计,而非简单的数学变换。