2. 数据质量监控:数据完整性检查、缺失值趋势、异常值检测、数据源一致性校验

数据质量监控,说白了就是给模型输入数据做「体检」。

我见过太多团队,模型上线时 AUC 漂亮得很,跑了一个月就崩了。查到最后,不是模型不行,是数据源出了问题。你想想看,模型再牛,喂进去的是垃圾,吐出来的只能是更垃圾。

核心观点:数据质量监控不是一次性工作,而是贯穿模型全生命周期的「生命线」。

2.1 数据完整性检查

完整性检查,就是看数据有没有「缺胳膊少腿」。我个人习惯把它分成三个层次:

  1. 记录级完整性:该有的样本有没有少?比如今天本该进来 10 万条申请,结果只来了 8 万,那就要报警了。
  2. 字段级完整性:每个样本的必填字段是否都有值?身份证号、手机号、收入这些关键字段不能为空。
  3. 业务级完整性:数据是否覆盖了所有业务场景?比如新上线了一个产品线,但数据里完全看不到这个产品的样本,那就有问题了。

我在项目中遇到过一件事:某次模型监控发现 KS 突然掉到 0.1 以下。查了半天,原来是上游系统升级,漏传了 30% 的样本。如果当时有完整性监控,这个问题当天就能发现。

我的建议:完整性检查最好做成自动化脚本,每天跑一次。一旦发现记录数波动超过 ±5%,立刻发邮件通知。

2.2 缺失值趋势监控

缺失值本身不可怕,可怕的是缺失率突然变化。

举个例子:某个特征「近 3 个月查询次数」的缺失率,平时稳定在 2% 左右。突然某天飙到了 15%。这说明什么?要么数据源挂了,要么业务逻辑变了。

我建议用滑动窗口法来监控缺失率趋势:

# 伪代码示例:缺失率滑动窗口监控
window_size = 7  # 7天滑动窗口
daily_missing_rate = calculate_daily_missing_rate(data)
rolling_mean = daily_missing_rate.rolling(window=window_size).mean()
rolling_std = daily_missing_rate.rolling(window=window_size).std()

# 如果当天缺失率超过均值+3倍标准差,触发告警
if daily_missing_rate[-1] > rolling_mean[-1] + 3 * rolling_std[-1]:
    send_alert("缺失率异常!")
注意:缺失率监控的阈值不能一刀切。有些特征的缺失率天然就高(比如「配偶收入」),有些则必须接近 0%(比如「身份证号」)。要分特征设置不同的阈值。

2.3 异常值检测

异常值检测,我把它分成两类:

  • 统计异常:超出 3 倍标准差、超过 IQR 的 1.5 倍等。这类异常通常用箱线图就能发现。
  • 业务异常:符合统计规律但不符合业务逻辑。比如年龄填 200 岁,收入填 0 元但职业是「企业高管」。

我曾经踩过一个坑:某个特征「月收入」突然出现大量 999999 的值。统计上看,这些值确实偏离了均值,但因为是整数,我一开始以为是系统默认值。后来才发现,是前端页面 bug,用户不填收入时自动填充了 999999。嗯,从那以后,我养成了检查「业务异常」的习惯。

异常值检测的常用方法:

方法 适用场景 优点 缺点
Z-Score 正态分布数据 简单直观 对非正态分布效果差
IQR 法 偏态分布数据 不受极端值影响 阈值较保守
孤立森林 高维数据 效率高 解释性差
业务规则 有明确业务约束 精准 需要人工维护

2.4 数据源一致性校验

这个点,说白了就是「多个数据源之间的数据能不能对上」。

我见过最典型的场景:模型用了 A 数据源的「收入」字段,但业务系统用的是 B 数据源的「收入」字段。两个字段名字一样,但口径不同——A 是税前收入,B 是税后收入。结果模型训练和上线后的分布完全对不上。

一致性校验我一般做三件事:

  1. 字段级校验:同名字段的均值、方差、缺失率是否一致。
  2. 记录级校验:同一笔样本在两个数据源中的关键字段值是否相同。
  3. 时间戳校验:数据更新时间是否匹配。比如 A 数据源每天凌晨 2 点更新,B 数据源每天凌晨 4 点更新,那凌晨 3 点取数就会有问题。
一个小技巧:一致性校验最好做成「双向校验」。即不仅检查模型输入数据与训练数据的一致性,还要检查模型输出结果与业务系统落地结果的一致性。我见过模型打分和业务系统实际使用的分数差了 0.2,就是因为两边用了不同的特征工程代码。

2.5 知识体系总览

下面这张图,是我自己总结的数据质量监控知识体系。你可以把它当成一个检查清单,每次做监控时对照着看:

数据质量监控体系 数据完整性检查 记录级完整性 字段级完整性 业务级完整性 缺失值趋势监控 滑动窗口法 均值+3σ告警 分特征阈值设置 异常值检测 统计异常(Z-Score/IQR) 业务异常(规则校验) 孤立森林(高维数据) 数据源一致性校验 字段级校验 记录级校验 时间戳校验 目标:早发现、早定位、早修复,避免模型「带病运行」 建议监控频率:完整性检查每日一次,缺失值趋势每周一次,异常值检测每日一次,一致性校验每次数据更新后执行

2.6 避坑指南

最后,分享几个我踩过的坑:

  • 不要只看均值:均值正常不代表数据没问题。我遇到过某个特征均值没变,但方差突然变大了一倍。后来发现是某个渠道的数据源出了问题。
  • 告警阈值要动态调整:业务淡季和旺季的数据分布不一样。我建议用历史数据训练一个基线模型,用基线来动态计算阈值。
  • 监控要分层:不是所有异常都需要立刻处理。我一般把告警分成三个等级:红色(立即处理)、黄色(当天处理)、蓝色(记录观察)。
  • 别忘了回测:每次模型迭代后,都要用新数据回测一遍历史监控指标。我见过模型迭代后,某个特征的缺失率从 5% 降到了 0%,看起来是好事,但实际上是特征工程代码写错了,把所有缺失值都填充成了 0。
一句话总结:数据质量监控不是「锦上添花」,而是「雪中送炭」。没有它,你的模型就是在裸奔。

公众号:蓝海资料掘金营,微信deep3321