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 异常告警到定位漂移类型的标准诊断路径。
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)
最佳实践: 建议将上述诊断逻辑封装为自动化监控脚本,每日运行。当检测到漂移时,自动发送告警并附带初步诊断结果,帮助风控团队快速响应。