模型输出分布与训练数据分布差异检测
在机器学习模型部署后,输出分布的变化是模型性能退化的关键信号。本文将详细介绍如何构建基于统计检验的分布差异检测系统。
核心监控指标
- KS统计量:Kolmogorov-Smirnov距离,衡量两个分布的最大差异
- JS散度:Jensen-Shannon散度,衡量相对熵差异
- KL散度:Kullback-Leibler散度,信息增益度量
- 特征均值/方差变化率:关键特征的统计特性漂移
告警配置方案
# 配置文件示例
{
"thresholds": {
"ks_threshold": 0.15,
"js_threshold": 0.05,
"kl_threshold": 0.1
},
"alert_rules": {
"critical": ["ks > 0.20", "js > 0.10"],
"warning": ["ks > 0.15", "js > 0.05"]
}
}
实现步骤
- 数据收集:每小时采集1000个样本的预测输出
- 统计检验:使用
scipy.stats.ks_2samp进行KS检验 - 阈值判断:根据业务场景设置动态阈值
- 自动告警:集成到Prometheus + Alertmanager实现监控告警
复现代码示例
import numpy as np
from scipy import stats
def detect_distribution_drift(train_dist, test_dist):
ks_stat, ks_pvalue = stats.ks_2samp(train_dist, test_dist)
js_div = js_divergence(train_dist, test_dist)
if ks_stat > 0.15 or js_div > 0.05:
return True, {'ks': ks_stat, 'js': js_div}
return False, {'ks': ks_stat, 'js': js_div}
# 部署建议:每小时运行一次,监控历史窗口内的分布变化
该方案可有效识别模型输出偏离训练分布的问题,为模型再训练提供数据支持。

讨论