模型训练集分布偏移监控踩坑记录
问题背景
在生产环境中部署的机器学习模型,训练集和线上数据分布存在显著差异时,模型性能会急剧下降。最近一次模型更新后,准确率从92%跌到68%,排查发现是训练集分布偏移导致。
核心监控指标
- 特征分布统计量:均值、标准差、分位数等
- KS距离:Kolmogorov-Smirnov距离,衡量两个分布差异
- KL散度:相对熵,量化分布变化程度
- 特征相关性矩阵:检查特征间关系是否发生变化
告警配置方案
# 配置监控脚本
import pandas as pd
from scipy import stats
import numpy as np
def check_distribution_shift(train_data, online_data, threshold=0.1):
# 计算KS统计量
ks_stats = []
for col in train_data.columns:
if train_data[col].dtype in ['int64', 'float64']:
ks_stat, p_value = stats.ks_2samp(train_data[col], online_data[col])
ks_stats.append(ks_stat)
# 告警触发条件
if max(ks_stats) > threshold:
return True # 发生偏移
return False
# 定时任务配置
schedule.every().hour.do(check_distribution_shift,
train_data=train_df,
online_data=online_df)
实践教训
- 阈值设置:初始阈值设为0.05,过于敏感导致误报;调整为0.1后效果更佳
- 监控频率:建议每小时检查一次,重要模型可设置每30分钟
- 历史对比:不能只看当前vs训练集,要与过去N天的分布进行对比
复现步骤
- 准备训练集和线上数据样本
- 运行上述脚本进行KS检验
- 观察告警是否触发并分析偏移特征

讨论