3. 特征质量维度:完整性、一致性、时效性、准确性定义与度量
在离线特征巡检体系中,质量评估是发现数据问题的第一道防线。我们将特征质量拆解为四个核心维度:完整性、一致性、时效性与准确性。每个维度都有明确的定义、度量指标与巡检触发阈值。
3.1 四维质量模型总览
下表概括了四个维度的核心关注点、典型度量方式与常见问题场景:
| 维度 | 关注点 | 核心度量指标 | 常见问题场景 |
|---|---|---|---|
| 完整性 | 数据是否缺失、空值比例是否可控 | 空值率、有效记录占比 | 上游表字段为空、分区数据未产出 |
| 一致性 | 数据在不同系统/时间点是否对齐 | 交叉比对差异率、枚举值合规率 | 离线与实时口径不一致、枚举值漂移 |
| 时效性 | 数据是否在预期时间内就绪 | 产出延迟时长、分区就绪时间 | ETL 任务超时、上游依赖阻塞 |
| 准确性 | 数据值是否符合真实业务含义 | 异常值占比、分布偏移检测 | 埋点上报错误、计算逻辑缺陷 |
3.2 完整性(Completeness)
定义:完整性衡量特征值缺失的程度。一个完整的特征应当在其所有预期记录中都有有效值,空值或占位符不应超过业务可接受范围。
3.2.1 度量指标
- 空值率(Null Rate):
空值记录数 / 总记录数 × 100% - 有效记录占比(Valid Ratio):
1 - 空值率 - 分区完整性(Partition Completeness):预期分区数 / 实际产出分区数
3.2.2 巡检脚本示例
-- 完整性巡检:检测特征空值率
SELECT
feature_name,
COUNT(*) AS total_records,
SUM(CASE WHEN feature_value IS NULL THEN 1 ELSE 0 END) AS null_count,
ROUND(SUM(CASE WHEN feature_value IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2) AS null_rate_pct
FROM offline_feature_store.daily_features
WHERE dt = '${yesterday}'
GROUP BY feature_name
HAVING null_rate_pct > 5.0
ORDER BY null_rate_pct DESC;
巡检要点:空值率超过 5% 触发告警,超过 20% 自动阻断下游特征拼接任务。对于数值型特征,需区分“业务空值”(如用户未登录)与“异常空值”(如上游表字段缺失)。
3.3 一致性(Consistency)
定义:一致性确保同一特征在不同数据源、不同时间窗口或不同计算口径下保持对齐。离线特征与实时特征、当日快照与历史回溯之间不应出现系统性偏差。
3.3.1 度量指标
- 交叉比对差异率(Cross-validation Diff Rate):
差异记录数 / 总比对记录数 × 100% - 枚举值合规率(Enum Compliance Rate):合法枚举值记录数 / 总记录数
- 分布一致性(Distribution Consistency):通过 KS 检验或 JS 散度衡量两批数据分布差异
3.3.2 枚举值漂移检测
-- 一致性巡检:检测枚举值是否出现新值
SELECT
feature_name,
feature_value,
COUNT(*) AS record_count
FROM offline_feature_store.daily_features
WHERE dt = '${yesterday}'
AND feature_name IN ('gender', 'user_level', 'channel_type')
AND feature_value NOT IN (
SELECT DISTINCT feature_value
FROM offline_feature_store.feature_enum_dict
WHERE feature_name = daily_features.feature_name
)
GROUP BY feature_name, feature_value;
常见陷阱:离线特征与实时特征因计算时间窗口不同(离线用 T-1 全量,实时用近 24h 滑动窗口),可能导致均值偏差。建议在巡检中增加“离线 vs 实时均值对比”指标,差异超过 1% 即触发核查。
3.4 时效性(Timeliness)
定义:时效性衡量特征数据是否在业务约定的时间窗口内完成产出并可供消费。离线特征通常有固定的 T+1 产出时间,延迟会直接影响下游模型训练与线上推理。
3.4.1 度量指标
- 产出延迟时长(Production Latency):实际就绪时间 - 预期就绪时间(分钟)
- 分区就绪时间(Partition Ready Time):每个分区数据写入完成的时间戳
- SLA 达标率(SLA Compliance Rate):按时产出天数 / 总天数 × 100%
3.4.2 时效性巡检逻辑
# 时效性巡检:检测特征表产出延迟
import datetime
from datetime import timedelta
expected_ready_time = datetime.time(8, 0) # 预期 08:00 就绪
actual_ready_time = get_table_ready_time('offline_feature_store.daily_features', dt='2025-03-01')
latency_minutes = (actual_ready_time - expected_ready_time).total_seconds() / 60
if latency_minutes > 30:
alert(f"特征表延迟 {latency_minutes:.0f} 分钟,超过阈值 30 分钟")
elif latency_minutes > 120:
escalate(f"特征表严重延迟 {latency_minutes:.0f} 分钟,需人工介入")
最佳实践:在特征表写入完成后,主动向元数据中心上报“就绪标记”。巡检服务通过轮询元数据判断时效性,避免直接扫描全表数据。
3.5 准确性(Accuracy)
定义:准确性衡量特征值是否真实反映业务事实。这是最难自动化的维度,通常需要结合统计分布检测、业务规则校验与人工抽样核查。
3.5.1 度量指标
- 异常值占比(Anomaly Ratio):超出合理范围的值记录数 / 总记录数
- 分布偏移检测(Distribution Shift Detection):通过 PSI(Population Stability Index)衡量当前分布与基准分布的差异
- 业务规则通过率(Business Rule Pass Rate):满足业务约束的记录占比
3.5.2 准确性巡检示例
-- 准确性巡检:检测数值型特征的异常值
SELECT
feature_name,
COUNT(*) AS total_records,
SUM(CASE WHEN feature_value < 0 OR feature_value > 1000000 THEN 1 ELSE 0 END) AS anomaly_count,
ROUND(SUM(CASE WHEN feature_value < 0 OR feature_value > 1000000 THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 4) AS anomaly_rate_pct
FROM offline_feature_store.daily_features
WHERE dt = '${yesterday}'
AND feature_name IN ('user_income', 'order_amount', 'age')
GROUP BY feature_name
HAVING anomaly_rate_pct > 0.1;
3.6 四维巡检优先级矩阵
在实际巡检中,四个维度的优先级并非固定不变,而是根据特征类型与业务场景动态调整:
| 特征类型 | 最高优先级维度 | 次高优先级维度 | 巡检频率 |
|---|---|---|---|
| 用户画像特征(年龄、性别) | 准确性 | 完整性 | 每日 |
| 实时行为特征(点击、曝光) | 时效性 | 一致性 | 每小时 |
| 统计聚合特征(近7日均值) | 一致性 | 准确性 | 每日 |
| 外部数据特征(天气、位置) | 完整性 | 时效性 | 每日 |
核心原则:完整性是基线,时效性是红线,一致性是质量门,准确性是终极目标。巡检系统应按照“先完整性、再时效性、后一致性与准确性”的顺序执行,避免在数据尚未就绪时触发无效的准确性告警。