2. 特征缺失基础概念
在风控特征体系中,缺失值并非简单的“数据为空”,其背后往往隐藏着用户行为模式、系统采集逻辑或业务规则的变化。理解缺失值的定义、产生机制与分布形态,是构建有效巡检策略的前提。
2.1 缺失值定义
缺失值指在数据记录中,某个特征字段没有存储值或存储了无效值。在风控场景中,常见的缺失表现形式包括:
- NULL / NaN:数据库或文件中明确标记为空。
- 空字符串 "":常见于文本类特征,如“职业”字段未填写。
- 占位符:如 -999、-1、999999,用于表示“未知”或“未采集”。
- 业务含义缺失:如“逾期天数”在用户从未借款时无意义,但系统可能填入 0 或 NULL。
巡检要点:风控特征缺失巡检的第一步,是统一各数据源对“缺失”的编码规则。将 -999、空字符串、NULL 等统一映射为标准缺失标记,避免后续计算偏差。
2.2 缺失机制:MCAR / MAR / MNAR
缺失机制决定了缺失值是否可以被忽略,或必须通过建模处理。三种经典分类如下:
| 机制 | 全称 | 含义 | 风控示例 | 处理建议 |
|---|---|---|---|---|
| MCAR | 完全随机缺失 | 缺失与任何变量无关,纯随机 | 用户填写表单时因网络波动随机丢失某个字段 | 可直接删除或简单填充 |
| MAR | 随机缺失 | 缺失与其他已观测变量相关,但与缺失值本身无关 | 高收入用户更倾向不填写“月收入”字段(收入与职业相关) | 需利用其他特征建模填充 |
| MNAR | 非随机缺失 | 缺失与缺失值本身直接相关 | 逾期用户故意不填写“联系人信息”以规避催收 | 需引入外部数据或业务规则 |
风控警示:MNAR 在信贷风控中极为常见。例如,欺诈用户往往在关键身份字段上故意留空。若直接删除或均值填充,会严重削弱模型对欺诈样本的识别能力。
2.3 缺失率计算与分布
缺失率是衡量特征数据质量的基础指标。在风控特征巡检中,我们通常从以下三个维度计算缺失率:
2.3.1 全局缺失率
定义:某个特征在所有样本中的缺失比例。
全局缺失率 = (缺失样本数 / 总样本数) × 100%
2.3.2 分组缺失率
定义:按某个关键维度(如时间、用户分层、产品线)分组后,计算各组内的缺失率。用于发现缺失的局部异常。
分组缺失率 = (组内缺失样本数 / 组内总样本数) × 100%
2.3.3 时序缺失率
定义:按时间窗口(如日、周、月)滑动计算缺失率,用于监控缺失率的趋势变化。
时序缺失率(t) = (第 t 天缺失样本数 / 第 t 天总样本数) × 100%
巡检实战经验:在风控系统中,全局缺失率低于 5% 通常可接受;但若某特征在“高风险用户”分组中缺失率突然从 3% 飙升至 30%,即使全局缺失率仍低于 5%,也必须立即告警——这往往是 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 最为关键。
- 缺失率计算需从全局、分组、时序三个维度展开,仅看全局缺失率会遗漏局部异常。
- 缺失分布分析应覆盖时间、用户分层、产品线、特征关联、地理区域五个维度,形成立体巡检视角。