3. 特征缺失异常概述

特征缺失异常概述 学习卡片

在风控模型的生命周期中,特征质量往往比模型算法更能决定最终效果。特征缺失异常是风控特征工程中最常见、也最容易被低估的一类问题。它不像特征穿越那样直接导致离线指标虚高,也不像标签泄漏那样引发灾难性误判,但它会以隐蔽、持续、分布漂移的方式侵蚀模型判别力,并在业务侧表现为通过率异常、坏账率波动、客群误伤等连锁反应。理解缺失异常的定义、类型、成因与影响,是后续新鲜度治理与缺失值修复的前提。

一、缺失异常的定义与边界

特征缺失异常,指在特征生成、传输、存储、消费的任一环节中,某个样本或某个特征维度上的取值未能按预期被正确采集、计算或写入,导致模型输入与真实业务状态不一致的现象。它包含两层含义:一是“值不存在”,即该特征在样本上确实为空;二是“值不可信”,即虽然写入了值,但该值并非当前时点应有的真实状态,例如用历史默认值填充、用过期缓存覆盖。

需要与正常缺失区分。风控场景中,新用户没有历史借贷记录、某类设备未上报某字段,属于业务上合理的空值,模型可以通过缺失指示变量学习其含义。而缺失异常强调的是“非预期缺失”,即按照数据契约和业务逻辑,该值本应存在却缺失,或本应更新却未更新。区分二者的关键在于数据契约:字段的预期覆盖率、更新频率、取值域是否被违反。

核心判断标准:缺失是否可被业务逻辑解释。可解释的缺失是信息,不可解释的缺失是噪声,而伪装成正常值的过期值是毒药。

二、缺失异常的主要类型

按表现形式与成因,可将风控特征缺失异常划分为以下类型,便于在监控与治理中分别设计策略。

类型典型表现常见成因对模型的影响
全量缺失某特征整列空值率骤升至100%上游任务失败、表被清空、字段下线模型该维度完全失效,评分偏移
局部缺失某客群或某时段空值率异常升高渠道未上报、分片计算失败、埋点漏采客群间评分不可比,产生歧视性误判
稀疏缺失长尾特征空值率长期偏高且波动数据源覆盖不足、三方接口不稳定模型过度依赖缺失模式,泛化变差
过期未更新值存在但为昨日/上周快照缓存未刷新、调度延迟、幂等覆盖时效特征失真,实时风控失效
默认值伪装空值被填充为0、-1、unknownETL默认填充、下游兜底逻辑模型无法区分真实0与缺失,判别力下降
类型错位缺失数值字段写入空字符串或NULL混用Schema不统一、多源合并冲突特征计算报错或静默转为异常值

其中“过期未更新”和“默认值伪装”最具隐蔽性,因为它们不会在空值率指标上暴露,却直接破坏特征新鲜度,是新鲜度治理的重点对象。

三、产生原因:从数据链路看缺失

缺失异常不是单点故障,而是链路问题。按数据流向可归纳为四类原因。

  1. 采集侧:埋点漏埋、SDK版本不一致、三方接口超时或限流、用户授权拒绝,导致原始字段未采集。
  2. 计算侧:调度任务失败、依赖表延迟、SQL逻辑分支遗漏、分片倾斜导致部分分区未计算、UDF异常被吞掉。
  3. 存储侧:表结构变更未同步、分区被误删、写入幂等覆盖、冷热存储迁移丢数、NULL与空字符串语义混用。
  4. 消费侧:特征服务缓存未命中后返回默认值、在线离线特征口径不一致、拼接时key不匹配导致左表字段为空。

下面是一段典型的特征服务兜底逻辑,它会把缺失伪装成正常值,是治理中需要重点识别的反模式。

def get_feature(user_id, feature_name):
    value = redis.get(f"feat:{feature_name}:{user_id}")
    if value is None:
        # 反模式:静默返回默认值,丢失缺失信号
        return 0.0
    return float(value)

# 推荐:显式返回缺失标记,并上报监控
def get_feature_safe(user_id, feature_name):
    value = redis.get(f"feat:{feature_name}:{user_id}")
    if value is None:
        metrics.inc("feature_miss", tags={"name": feature_name})
        return None  # 由上层决定填充或走降级策略
    return float(value)

治理缺失异常的第一步不是修复,而是让缺失可见。任何静默兜底都会掩盖问题,建议在特征服务层统一埋点,记录缺失率、缺失客群分布与缺失时间分布。

四、对模型与业务的影响及典型表现

缺失异常对模型的影响分为训练期与推理期。训练期,若缺失随机分布,模型可通过缺失指示变量部分吸收;若缺失与标签相关,则模型会学到虚假关联,离线AUC可能不降反升,上线后迅速衰减。推理期,缺失导致输入分布与训练分布不一致,评分整体偏移,阈值失效。

业务侧的典型表现往往先于模型指标暴露:

  • 通过率在某日突然下降或上升,但客群结构无明显变化;
  • 某渠道进件评分普遍偏低,疑似该渠道特征大面积缺失;
  • 实时风控决策延迟升高,伴随特征服务缓存命中率下降;
  • 坏账率在特定产品线上浮,回溯发现该产品依赖的时效特征未更新;
  • 模型监控中PSI突增,但主要贡献来自某几个特征的缺失率变化。

切勿仅凭离线AUC判断缺失影响。缺失异常常使离线指标“看起来正常”,因为训练与验证集共享同一缺失模式。必须结合线上特征覆盖率、缺失率时序、客群切片进行交叉验证。

五、案例复盘:一次过期特征引发的通过率波动

某现金贷产品在早间时段通过率较前一日下降约8个百分点。排查发现,模型依赖的“近7日申请次数”特征在凌晨调度中因上游表分区延迟未更新,特征服务缓存未命中后返回了昨日快照。由于该特征在训练集中从未出现“整体滞后一天”的模式,模型将其视为低风险信号,导致大量本应通过的客户被拒。修复方式包括:在特征服务中增加新鲜度校验,对超过SLA的特征拒绝返回并触发降级;在调度层增加分区就绪检查;在监控层对特征时间戳与当前时间差设置告警。