4. 模型漂移的常见类型

在催收触达模型的持续监控中,PSI(群体稳定性指标)是衡量模型分数分布稳定性的核心工具。然而,PSI 的异常波动只是“症状”,其背后的根本原因通常可归为三类漂移:数据漂移、概念漂移和系统漂移。准确区分这三类漂移,是制定有效修复策略的前提。

核心诊断逻辑: 当 PSI > 0.1 时,不要急于重建模型。先通过特征分布对比、目标变量趋势分析、评分卡逻辑校验三步法,定位漂移类型。

4.1 数据漂移(特征分布变化)

数据漂移是指模型输入特征的统计分布随时间发生变化,但特征与目标变量之间的真实关系并未改变。这是催收场景中最常见的漂移类型。

  • 典型表现: 模型分数分布整体偏移,但模型排序能力(如 KS、AUC)保持稳定。
  • 常见原因:
    • 客群结构变化:如新接入的委外案件逾期天数分布与历史不同。
    • 数据源变更:如第三方征信数据接口升级,导致字段取值范围变化。
    • 季节性因素:如年底催收案件量激增,样本构成发生偏移。
  • 诊断方法: 计算每个特征的 PSI 或 KS 统计量,识别发生显著变化的特征。
实战提示: 数据漂移通常可以通过特征工程或数据标准化快速修复,无需重建模型。例如,对发生漂移的连续特征进行分位数重映射。

4.2 概念漂移(目标关系变化)

概念漂移是指特征与目标变量(如“是否还款”)之间的潜在关系发生了改变。即使特征分布完全不变,模型的预测能力也会下降。

  • 典型表现: 模型分数分布可能稳定,但模型区分能力(KS、AUC)显著下降。
  • 常见原因:
    • 催收策略调整:如加大施压力度后,原本“高风险”客群的还款率反而提升。
    • 宏观经济变化:如失业率上升,导致所有客群的还款意愿普遍下降。
    • 法规政策变动:如催收合规要求收紧,改变了催收行为与还款结果的关系。
  • 诊断方法: 对比建模样本与当前样本的“特征-目标”局部依赖图(PDP)或分箱坏账率曲线。
注意: 概念漂移通常意味着模型底层逻辑失效,需要重新训练或重建模型。仅靠特征调整无法修复。

4.3 系统漂移(评分卡失效)

系统漂移是指模型本身或评分卡逻辑出现错误,导致分数计算异常。这类漂移通常由技术故障或人为错误引起。

  • 典型表现: PSI 剧烈波动,且模型分数出现大量缺失值、异常值或逻辑矛盾(如分数超出理论范围)。
  • 常见原因:
    • 评分卡代码部署错误:如变量映射表未更新、权重加载错误。
    • 上游数据管道故障:如特征工程脚本报错,导致部分特征被填充为默认值。
    • 模型版本管理混乱:如线上仍在使用旧版本评分卡。
  • 诊断方法: 检查模型分数计算日志、特征缺失率、以及评分卡各节点的分数分布。

4.4 三类漂移对比

漂移类型 核心问题 PSI 表现 模型性能(KS/AUC) 修复策略
数据漂移 特征分布变化 升高 稳定 特征重映射 / 数据标准化
概念漂移 特征-目标关系变化 可能稳定或升高 下降 模型重建 / 重新训练
系统漂移 评分卡逻辑错误 剧烈波动 异常 代码回滚 / 数据管道修复

4.5 漂移诊断流程

以下 SVG 流程图展示了从 PSI 异常告警到定位漂移类型的标准诊断路径。

模型漂移诊断流程图 模型漂移诊断流程图 PSI > 0.1 告警 KS/AUC 是否稳定? 数据漂移 概念漂移 分数逻辑是否异常? 系统漂移 无漂移(误报) 定位漂移类型,启动修复流程 诊断要点: • 数据漂移:特征分布变,模型排序能力不变 → 特征重映射 • 概念漂移:特征分布可能不变,模型排序能力下降 → 模型重建

4.6 漂移类型与修复策略映射

下表总结了针对不同漂移类型的推荐修复策略及优先级。

漂移类型 修复策略 优先级 预期效果
数据漂移 特征分位数重映射、缺失值填充策略调整、特征筛选 高 快速恢复 PSI 稳定性
概念漂移 模型重建、引入新特征、调整模型权重 中 恢复模型区分能力
系统漂移 代码回滚、数据管道修复、版本管理规范 最高 立即消除异常分数

4.7 代码示例:PSI 漂移类型初步诊断

以下 Python 代码展示了如何通过计算特征 PSI 和模型 KS 指标,初步判断漂移类型。

import pandas as pd
import numpy as np
from scipy.stats import ks_2samp

def diagnose_drift_type(train_scores, current_scores, train_features, current_features):
    """
    初步诊断漂移类型
    :param train_scores: 建模样本模型分数
    :param current_scores: 当前样本模型分数
    :param train_features: 建模样本特征矩阵
    :param current_features: 当前样本特征矩阵
    :return: 诊断结果字符串
    """
    # 1. 计算模型分数的 KS 统计量(衡量排序能力变化)
    ks_stat, ks_p = ks_2samp(train_scores, current_scores)
    
    # 2. 计算每个特征的 PSI
    feature_psi_list = []
    for col in train_features.columns:
        # 简化计算:使用分箱法
        bins = np.linspace(0, 1, 11)
        train_pct = np.histogram(train_features[col], bins=bins, density=True)[0]
        current_pct = np.histogram(current_features[col], bins=bins, density=True)[0]
        # 避免除零
        train_pct = np.where(train_pct == 0, 1e-6, train_pct)
        current_pct = np.where(current_pct == 0, 1e-6, current_pct)
        psi = np.sum((train_pct - current_pct) * np.log(train_pct / current_pct))
        feature_psi_list.append(psi)
    
    avg_feature_psi = np.mean(feature_psi_list)
    
    # 3. 诊断逻辑
    if ks_p < 0.05 and avg_feature_psi > 0.1:
        return "疑似数据漂移:特征分布显著变化,模型排序能力稳定"
    elif ks_p < 0.05 and avg_feature_psi <= 0.1:
        return "疑似概念漂移:模型排序能力下降,但特征分布稳定"
    elif ks_p >= 0.05 and avg_feature_psi > 0.1:
        return "疑似系统漂移:分数分布异常,需检查评分卡逻辑"
    else:
        return "无显著漂移,PSI 波动可能为正常噪声"

# 示例调用
# result = diagnose_drift_type(train_scores, current_scores, train_features, current_features)
# print(result)
最佳实践: 建议将上述诊断逻辑封装为自动化监控脚本,每日运行。当检测到漂移时,自动发送告警并附带初步诊断结果,帮助风控团队快速响应。