2. 特征缺失基础概念

在风控特征体系中,缺失值并非简单的“数据为空”,其背后往往隐藏着用户行为模式、系统采集逻辑或业务规则的变化。理解缺失值的定义、产生机制与分布形态,是构建有效巡检策略的前提。

2.1 缺失值定义

缺失值指在数据记录中,某个特征字段没有存储值或存储了无效值。在风控场景中,常见的缺失表现形式包括:

  • NULL / NaN:数据库或文件中明确标记为空。
  • 空字符串 "":常见于文本类特征,如“职业”字段未填写。
  • 占位符:如 -999、-1、999999,用于表示“未知”或“未采集”。
  • 业务含义缺失:如“逾期天数”在用户从未借款时无意义,但系统可能填入 0 或 NULL。
巡检要点:风控特征缺失巡检的第一步,是统一各数据源对“缺失”的编码规则。将 -999、空字符串、NULL 等统一映射为标准缺失标记,避免后续计算偏差。

2.2 缺失机制:MCAR / MAR / MNAR

缺失机制决定了缺失值是否可以被忽略,或必须通过建模处理。三种经典分类如下:

机制 全称 含义 风控示例 处理建议
MCAR 完全随机缺失 缺失与任何变量无关,纯随机 用户填写表单时因网络波动随机丢失某个字段 可直接删除或简单填充
MAR 随机缺失 缺失与其他已观测变量相关,但与缺失值本身无关 高收入用户更倾向不填写“月收入”字段(收入与职业相关) 需利用其他特征建模填充
MNAR 非随机缺失 缺失与缺失值本身直接相关 逾期用户故意不填写“联系人信息”以规避催收 需引入外部数据或业务规则
风控警示:MNAR 在信贷风控中极为常见。例如,欺诈用户往往在关键身份字段上故意留空。若直接删除或均值填充,会严重削弱模型对欺诈样本的识别能力。
缺失机制对比与风控映射 缺失机制对比与风控映射 MCAR 完全随机缺失 例:网络波动丢包 处理:直接删除/简单填充 MAR 随机缺失 例:高收入者不填收入 处理:利用其他特征建模填充 MNAR 非随机缺失 例:逾期用户故意留空 处理:引入外部数据/业务规则 风控影响 MCAR 影响最小;MAR 需谨慎建模;MNAR 直接关联用户风险意图,必须专项巡检 可忽略缺失 条件可处理 必须专项巡检 简单统计巡检即可 需结合关联特征分析 需深度业务+数据联合巡检

2.3 缺失率计算与分布

缺失率是衡量特征数据质量的基础指标。在风控特征巡检中,我们通常从以下三个维度计算缺失率:

2.3.1 全局缺失率

定义:某个特征在所有样本中的缺失比例。

全局缺失率 = (缺失样本数 / 总样本数) × 100%

2.3.2 分组缺失率

定义:按某个关键维度(如时间、用户分层、产品线)分组后,计算各组内的缺失率。用于发现缺失的局部异常。

分组缺失率 = (组内缺失样本数 / 组内总样本数) × 100%

2.3.3 时序缺失率

定义:按时间窗口(如日、周、月)滑动计算缺失率,用于监控缺失率的趋势变化。

时序缺失率(t) = (第 t 天缺失样本数 / 第 t 天总样本数) × 100%
巡检实战经验:在风控系统中,全局缺失率低于 5% 通常可接受;但若某特征在“高风险用户”分组中缺失率突然从 3% 飙升至 30%,即使全局缺失率仍低于 5%,也必须立即告警——这往往是 MNAR 的信号。
缺失率分布与异常检测示意 缺失率分布与异常检测示意 全局缺失率 3.2% 特征A 4.8% 特征B 2.1% 特征C 0.5% 特征D 分组缺失率(特征B) 2.1% 低风险 5.3% 中风险 28.7% 高风险 3.0% 未知 ⚠ 告警 全局缺失率 4.8% 正常,但高风险组缺失率 28.7% → 触发 MNAR 巡检

2.4 缺失分布分析维度

在风控特征巡检中,仅计算缺失率远远不够,必须从以下维度分析缺失分布:

分析维度 描述 风控巡检价值
时间分布 缺失率随时间(日/周/月)的变化趋势 发现系统升级、接口故障、策略调整导致的突发缺失
用户分层分布 缺失率在不同风险等级、客群中的差异 识别高风险用户是否系统性留空关键字段(MNAR)
产品线分布 缺失率在不同产品、渠道中的差异 定位特定产品线的数据采集缺陷
特征关联分布 缺失率与其他特征取值的关系 发现特征间的缺失联动模式(如收入缺失与职业缺失强相关)
地理/区域分布 缺失率在不同地区、城市中的差异 识别区域性的数据采集问题或用户行为差异
巡检脚本示例:以下 Python 代码用于计算特征的分组缺失率,并标记异常分组。
import pandas as pd
import numpy as np

def compute_grouped_missing_rate(df, feature, group_col, threshold=0.1):
    """
    计算分组缺失率,并标记超过阈值的分组
    :param df: DataFrame
    :param feature: 待检查的特征名
    :param group_col: 分组列名
    :param threshold: 异常阈值(相对于全局缺失率的倍数)
    """
    global_rate = df[feature].isnull().mean()
    grouped = df.groupby(group_col)[feature].apply(lambda x: x.isnull().mean())
    abnormal_groups = grouped[grouped > global_rate * (1 + threshold)]
    return grouped, abnormal_groups

# 示例调用
# grouped_rate, abnormal = compute_grouped_missing_rate(user_df, 'income', 'risk_level', threshold=0.5)
# print("异常分组:", abnormal)

2.5 本章小结

  • 缺失值定义需统一编码,避免 -999、NULL、空字符串混用导致统计偏差。
  • MCAR / MAR / MNAR 三种机制决定了缺失处理策略,风控场景中 MNAR 最为关键。
  • 缺失率计算需从全局、分组、时序三个维度展开,仅看全局缺失率会遗漏局部异常。
  • 缺失分布分析应覆盖时间、用户分层、产品线、特征关联、地理区域五个维度,形成立体巡检视角。