4. 巡检指标体系:缺失率、连续缺失天数、缺失模式熵、特征覆盖率
金融特征缺失巡检不能仅依赖单一指标。单一缺失率可能掩盖局部数据断崖、周期性缺失或特征大面积失效等深层问题。本章建立四维巡检指标体系,从规模、持续性、模式复杂度、覆盖广度四个角度对缺失问题进行量化评估。
核心原则:四维指标需联合使用。例如,缺失率低但连续缺失天数高,可能指向特定时间窗口的数据采集故障;缺失模式熵高则暗示数据源异构或逻辑分支异常。
4.1 缺失率(Missing Rate)
缺失率是最基础的巡检指标,定义为单位时间窗口内(通常为日、周或月)某特征缺失样本数占总样本数的比例。
| 维度 | 说明 | 阈值参考(金融场景) |
|---|---|---|
| 全局缺失率 | 全量样本中该特征的缺失占比 | > 5% 触发关注;> 20% 触发告警 |
| 分群缺失率 | 按客群、产品线、渠道等维度拆分的缺失率 | 分群间差异 > 3 倍时需排查数据链路 |
| 时序缺失率 | 每日/每小时的缺失率时间序列 | 单日突增 > 10% 需立即核查 |
-- 示例 SQL:计算每日缺失率
SELECT
date_trunc('day', event_time) AS day,
feature_name,
COUNT(*) AS total_records,
SUM(CASE WHEN feature_value IS NULL THEN 1 ELSE 0 END) AS missing_count,
ROUND(
SUM(CASE WHEN feature_value IS NULL THEN 1 ELSE 0 END)::NUMERIC / COUNT(*),
4
) AS missing_rate
FROM feature_log
WHERE event_time >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY day, feature_name
ORDER BY day, missing_rate DESC;
巡检技巧:不要只看平均缺失率。金融数据常存在“周末效应”或“月末效应”,建议将缺失率与同期历史基线(如过去 4 周同一天均值)做对比,计算偏离度。
4.2 连续缺失天数(Consecutive Missing Days)
连续缺失天数衡量特征在时间轴上持续不可用的长度。该指标对识别数据采集中断、上游表延迟、接口故障等系统性原因至关重要。
- 定义:特征在连续 N 个自然日(或业务日)内缺失率均超过阈值(如 80%),则计为一次连续缺失事件,N 即为连续缺失天数。
- 严重等级:
- 1-3 天:偶发波动,需确认是否由网络抖动或批量任务重跑导致。
- 4-7 天:中度风险,可能涉及上游数据源变更或调度任务挂起。
- > 7 天:严重事故,需立即启动数据链路应急恢复流程。
- 计算逻辑:对每日缺失率进行二值化(0=正常,1=缺失超标),然后统计连续 1 序列的最大长度。
-- 示例 Python 逻辑(伪代码)
def max_consecutive_missing(daily_missing_rate_series, threshold=0.8):
binary = (daily_missing_rate_series > threshold).astype(int)
max_run = 0
current_run = 0
for val in binary:
if val == 1:
current_run += 1
max_run = max(max_run, current_run)
else:
current_run = 0
return max_run
注意:连续缺失天数应结合业务日历判断。例如,理财产品在非交易日自然缺失,不应计入连续缺失事件。建议使用“业务日”而非“自然日”进行计算。
4.3 缺失模式熵(Missing Pattern Entropy)
缺失模式熵用于量化缺失值在样本空间中的分布随机性。低熵意味着缺失集中在少数固定模式(如特定客群、特定时间段),高熵则意味着缺失近乎随机分布,可能指向更复杂的数据质量问题。
| 熵值范围 | 模式特征 | 可能原因 |
|---|---|---|
| 0 - 0.3 | 高度结构化缺失 | 特定业务规则导致(如学生客群无收入字段) |
| 0.3 - 0.7 | 混合模式缺失 | 部分数据源不稳定,部分为业务豁免 |
| 0.7 - 1.0 | 接近随机缺失 | 数据采集系统存在间歇性故障或并发冲突 |
计算方法:将样本按关键维度(如客群、渠道、时段)分组,统计各组缺失率,归一化后计算信息熵。
import numpy as np
def missing_pattern_entropy(group_missing_rates):
# group_missing_rates: 各分组的缺失率列表
total = sum(group_missing_rates)
if total == 0:
return 0.0
probs = [r / total for r in group_missing_rates if r > 0]
entropy = -sum(p * np.log2(p) for p in probs)
# 归一化到 [0, 1]
max_entropy = np.log2(len(group_missing_rates))
return entropy / max_entropy if max_entropy > 0 else 0.0
应用场景:当缺失率正常但缺失模式熵突然升高时,往往意味着数据采集逻辑发生了未预期的变化,即使缺失总量未超标,也应纳入排查范围。
4.4 特征覆盖率(Feature Coverage Rate)
特征覆盖率从特征维度衡量数据资产的可用性。不同于缺失率(关注单个特征内的缺失比例),覆盖率关注的是在全体特征集合中,有多少特征在当前时间窗口内是可用的。
- 定义:覆盖率 = (当前窗口内有效特征数 / 特征总表数)× 100%
- 有效特征判定:特征缺失率低于预设阈值(如 10%),且连续缺失天数不超过容忍上限(如 3 天)。
- 分级监控:
- 核心特征覆盖率:仅监控风控模型必选特征(通常 30-50 个)。
- 全量特征覆盖率:监控特征仓库中所有已注册特征(可能数百个)。
| 覆盖率等级 | 核心特征覆盖率 | 全量特征覆盖率 | 响应动作 |
|---|---|---|---|
| 健康 | ≥ 98% | ≥ 95% | 常规巡检 |
| 关注 | 95% - 98% | 90% - 95% | 排查低覆盖特征原因 |
| 告警 | < 95% | < 90% | 立即启动特征链路应急 |
关键提醒:特征覆盖率下降 1% 可能对应 5-10 个特征失效。在金融风控场景中,模型依赖的特征突然大面积不可用,将直接导致评分卡失效或决策引擎降级。建议将覆盖率指标接入实时监控大屏。
4.5 四维指标联合决策矩阵
单一指标无法完整描述缺失问题的全貌。下表展示了四维指标组合与典型问题类型的对应关系,帮助巡检人员快速定位根因。
| 缺失率 | 连续缺失天数 | 缺失模式熵 | 特征覆盖率 | 典型问题类型 |
|---|---|---|---|---|
| 高 | 高 | 低 | 低 | 上游数据源整体中断(如接口下线) |
| 高 | 低 | 高 | 中 | 数据采集并发冲突或采样逻辑异常 |
| 中 | 中 | 低 | 高 | 特定客群或产品的业务规则豁免 |
| 低 | 低 | 高 | 高 | 偶发网络抖动或单条记录解析失败 |
| 低 | 高 | 低 | 中 | 定时批量任务挂起(如每日凌晨 ETL 失败) |
实践警告:不要孤立设置指标阈值。例如,在月初批量跑批期间,缺失率和连续缺失天数可能短暂升高,但缺失模式熵和覆盖率正常,此时应视为“预期波动”而非“故障”。建议引入业务日历和事件标签,对巡检窗口进行动态分段。
4.6 巡检指标落地建议
- 分层监控:核心特征(模型入模特征)使用更严格的阈值,辅助特征可适当放宽。
- 基线对比:所有指标均需与历史同期基线对比,消除周期性波动干扰。
- 告警收敛:连续缺失天数和缺失模式熵可作为告警收敛因子——当缺失率超标但熵值极低时,可能是已知业务规则,无需重复告警。
- 可视化看板:建议将四维指标以雷达图或热力图形式展示,便于快速识别异常象限。
推荐工具:可使用 Apache Griffin 或自研巡检框架,将四维指标定义为数据质量 SLA,每日自动生成巡检报告并推送至飞书/钉钉/邮件。