4. 坏样本标签工程:标签定义与漂移、正负样本不平衡问题、样本加权与分层采样策略
标签工程是坏样本归因分析的基石。如果标签本身存在定义模糊、时序漂移或分布严重倾斜,后续所有特征工程与模型训练都会建立在不可靠的基础上。本章聚焦标签生命周期的四个核心环节:标签定义规范、标签漂移检测、不平衡处理以及采样策略优化。
4.1 标签定义与漂移
坏样本标签并非一成不变。业务规则、数据采集口径、标注标准的变化都会导致标签语义随时间偏移。标签漂移是归因分析中最隐蔽的干扰因素之一。
4.1.1 标签定义规范
一个可落地的标签定义应包含以下要素:
| 要素 | 说明 | 示例(信贷坏样本) |
|---|---|---|
| 业务口径 | 明确“坏”的触发条件 | 逾期 ≥ 90 天 |
| 观察窗口 | 从哪个时间点开始计算 | 放款后第 180 天 |
| 表现期 | 窗口长度 | 固定 12 个月 |
| 排除规则 | 哪些样本不参与标注 | 结清、核销、欺诈 |
| 版本号 | 标签迭代记录 | v2.3_202501 |
实践建议: 每次标签版本变更时,保留一份“标签定义快照”并记录变更原因。这能帮助你在后续归因分析中快速定位漂移来源。
4.1.2 标签漂移检测
标签漂移通常表现为两类:
- 概念漂移(Concept Drift): 坏样本的判定标准发生变化。例如,风控策略收紧后,原本标记为“好”的样本被重新定义为“坏”。
- 数据漂移(Data Drift): 样本分布发生变化,但标签定义未变。例如,客群下沉导致坏样本率从 2% 升至 8%。
检测标签漂移的常用方法:
- PSI(Population Stability Index): 计算标签分布在不同时间窗口的稳定性。
- KS 统计量对比: 比较训练集与近期样本的 KS 曲线差异。
- 标签率趋势图: 按周/月绘制坏样本率,观察是否存在突变点。
漂移阈值参考: PSI < 0.1 表示无漂移;0.1 ≤ PSI < 0.25 需关注;PSI ≥ 0.25 表示显著漂移,必须重新评估标签定义。
4.2 正负样本不平衡问题
坏样本归因场景中,正样本(坏样本)占比通常远低于负样本(好样本),常见比例从 1:10 到 1:1000 不等。不平衡数据会导致模型偏向多数类,使坏样本的召回率极低。
4.2.1 不平衡程度评估
| 不平衡等级 | 正负样本比 | 典型场景 | 推荐策略 |
|---|---|---|---|
| 轻度 | 1:2 ~ 1:5 | 信用卡欺诈 | 调整阈值 / 轻微加权 |
| 中度 | 1:10 ~ 1:50 | 信贷逾期 | SMOTE / 加权 + 分层采样 |
| 重度 | 1:100 ~ 1:1000 | 保险骗保 | 集成采样 / 异常检测 + 加权 |
4.2.2 常用处理方法
- 数据层面:
- 随机欠采样(Random Under-sampling)
- SMOTE / ADASYN 过采样
- NearMiss / Tomek Links 清洗
- 算法层面:
- 代价敏感学习(Cost-sensitive Learning)
- 集成方法(EasyEnsemble / BalanceCascade)
- 异常检测模型(Isolation Forest / LOF)
- 评估层面:
- 使用 Precision-Recall 曲线替代 ROC
- 关注 F1-score、G-mean、Kappa 系数
常见误区: 不要盲目使用 SMOTE 处理所有不平衡问题。当正样本数量极少(< 100 条)时,合成样本可能引入噪声,此时优先考虑加权或异常检测方法。
4.3 样本加权与分层采样策略
样本加权和分层采样是标签工程中两个互补的技术。加权用于调整样本重要性,分层采样用于保证训练集与验证集的分布一致性。
4.3.1 样本加权
样本加权通过给每个样本分配权重来影响损失函数。权重设计通常基于以下原则:
- 逆频率加权: 权重 = 总样本数 / (类别数 × 该类样本数)
- 代价矩阵加权: 根据误分类代价设定权重
- 时间衰减加权: 近期样本赋予更高权重,应对标签漂移
# 逆频率加权示例(Python)
import numpy as np
def compute_sample_weights(y):
classes, counts = np.unique(y, return_counts=True)
total = len(y)
weight_per_class = {c: total / (len(classes) * cnt) for c, cnt in zip(classes, counts)}
return np.array([weight_per_class[label] for label in y])
# 使用示例
y_train = np.array([0, 0, 0, 0, 1, 1]) # 4个好样本,2个坏样本
weights = compute_sample_weights(y_train)
print(weights) # 好样本权重: 0.75, 坏样本权重: 1.5
4.3.2 分层采样
分层采样(Stratified Sampling)确保训练集、验证集、测试集中各类别比例与原始数据集一致。这是防止数据划分引入偏差的关键步骤。
| 采样方法 | 原理 | 适用场景 | 注意事项 |
|---|---|---|---|
| 简单随机采样 | 完全随机抽取 | 数据量极大,类别均衡 | 不平衡数据下可能丢失小类 |
| 分层随机采样 | 按类别比例分层抽取 | 不平衡数据,分类任务 | 需保证每层至少 1 个样本 |
| 分层加权采样 | 分层 + 样本加权结合 | 标签漂移 + 不平衡 | 权重需与分层比例协调 |
4.3.3 实践中的组合策略
在实际项目中,建议按以下步骤组合使用:
- 第一步: 对原始数据进行分层采样,划分训练/验证/测试集。
- 第二步: 在训练集上计算样本权重(逆频率或代价矩阵)。
- 第三步: 如果检测到标签漂移,引入时间衰减因子调整权重。
- 第四步: 在模型训练时,将权重传入损失函数(如 sklearn 的
sample_weight参数)。 - 第五步: 在验证集和测试集上使用原始权重(不加权),评估真实效果。
关键原则: 权重只应用于训练过程,不应用于评估过程。验证集和测试集必须保持原始分布,才能反映模型在真实场景中的表现。
4.4 本章小结
标签工程是坏样本归因分析中承上启下的关键环节。标签定义需要规范化、版本化,并持续监控漂移;不平衡问题需要根据严重程度选择数据层面或算法层面的处理策略;样本加权与分层采样是保证模型稳定性和公平性的基础工具。只有打好标签工程的基础,后续的特征工程和归因分析才能产出可信的结果。