4. 坏样本标签工程:标签定义与漂移、正负样本不平衡问题、样本加权与分层采样策略

标签工程是坏样本归因分析的基石。如果标签本身存在定义模糊、时序漂移或分布严重倾斜,后续所有特征工程与模型训练都会建立在不可靠的基础上。本章聚焦标签生命周期的四个核心环节:标签定义规范、标签漂移检测、不平衡处理以及采样策略优化。

4.1 标签定义与漂移

坏样本标签并非一成不变。业务规则、数据采集口径、标注标准的变化都会导致标签语义随时间偏移。标签漂移是归因分析中最隐蔽的干扰因素之一。

4.1.1 标签定义规范

一个可落地的标签定义应包含以下要素:

要素 说明 示例(信贷坏样本)
业务口径 明确“坏”的触发条件 逾期 ≥ 90 天
观察窗口 从哪个时间点开始计算 放款后第 180 天
表现期 窗口长度 固定 12 个月
排除规则 哪些样本不参与标注 结清、核销、欺诈
版本号 标签迭代记录 v2.3_202501
实践建议: 每次标签版本变更时,保留一份“标签定义快照”并记录变更原因。这能帮助你在后续归因分析中快速定位漂移来源。

4.1.2 标签漂移检测

标签漂移通常表现为两类:

  • 概念漂移(Concept Drift): 坏样本的判定标准发生变化。例如,风控策略收紧后,原本标记为“好”的样本被重新定义为“坏”。
  • 数据漂移(Data Drift): 样本分布发生变化,但标签定义未变。例如,客群下沉导致坏样本率从 2% 升至 8%。

检测标签漂移的常用方法:

  1. PSI(Population Stability Index): 计算标签分布在不同时间窗口的稳定性。
  2. KS 统计量对比: 比较训练集与近期样本的 KS 曲线差异。
  3. 标签率趋势图: 按周/月绘制坏样本率,观察是否存在突变点。
漂移阈值参考: PSI < 0.1 表示无漂移;0.1 ≤ PSI < 0.25 需关注;PSI ≥ 0.25 表示显著漂移,必须重新评估标签定义。
标签漂移检测流程 原始标签 近期标签 PSI 计算 漂移判定 无漂移:继续使用 轻度漂移:加权 显著漂移:重定义 检测周期建议:每周计算一次 PSI,每月对比一次 KS 统计量,季度性审查标签定义

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 常用处理方法

  1. 数据层面:
    • 随机欠采样(Random Under-sampling)
    • SMOTE / ADASYN 过采样
    • NearMiss / Tomek Links 清洗
  2. 算法层面:
    • 代价敏感学习(Cost-sensitive Learning)
    • 集成方法(EasyEnsemble / BalanceCascade)
    • 异常检测模型(Isolation Forest / LOF)
  3. 评估层面:
    • 使用 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 实践中的组合策略

在实际项目中,建议按以下步骤组合使用:

  1. 第一步: 对原始数据进行分层采样,划分训练/验证/测试集。
  2. 第二步: 在训练集上计算样本权重(逆频率或代价矩阵)。
  3. 第三步: 如果检测到标签漂移,引入时间衰减因子调整权重。
  4. 第四步: 在模型训练时,将权重传入损失函数(如 sklearn 的 sample_weight 参数)。
  5. 第五步: 在验证集和测试集上使用原始权重(不加权),评估真实效果。
关键原则: 权重只应用于训练过程,不应用于评估过程。验证集和测试集必须保持原始分布,才能反映模型在真实场景中的表现。

4.4 本章小结

标签工程是坏样本归因分析中承上启下的关键环节。标签定义需要规范化、版本化,并持续监控漂移;不平衡问题需要根据严重程度选择数据层面或算法层面的处理策略;样本加权与分层采样是保证模型稳定性和公平性的基础工具。只有打好标签工程的基础,后续的特征工程和归因分析才能产出可信的结果。