1. 风控数据质量概述:缺失值的定义、危害与模型影响

1.1 缺失值的定义与分类

在风控数据集中,缺失值是指数据记录中某个或某些字段的值为空、不存在或不可用。缺失值并非简单的“0”或“空字符串”,而是代表信息缺失的状态。根据缺失机制,统计学家 Rubin 将其分为三类:

缺失类型 英文缩写 定义 风控场景举例
完全随机缺失 MCAR 缺失与否完全独立于任何观测或未观测数据 系统随机抽检导致部分客户学历字段未采集
随机缺失 MAR 缺失与否依赖于其他已观测变量,但不依赖于缺失变量本身 高收入客户更倾向于不填写“其他收入”字段
非随机缺失 MNAR 缺失与否依赖于缺失变量本身的值 逾期客户故意不填写“单位电话”,导致该字段缺失与违约状态相关
风控提示:在信贷风控中,MNAR 类型最为危险。例如,借款人隐瞒“当前负债”字段,往往意味着其偿债能力已出现问题。若直接删除或简单填充,会引入严重的样本选择偏差。

1.2 缺失值在风控场景中的危害

缺失值在风控全链路中会引发连锁反应,具体危害体现在以下四个层面:

  1. 特征工程失效:多数统计量(均值、方差)和分箱算法无法处理空值,导致特征无法参与建模。
  2. 模型训练偏差:缺失机制若与目标变量(如逾期标签)相关,模型会学到错误的关联模式,降低泛化能力。
  3. 评分卡失真:逻辑回归或决策树在缺失值传递过程中,可能出现权重偏移或分裂点异常。
  4. 线上决策风险:实时风控中,缺失值若未妥善处理,可能导致拒绝规则误触发或信用评分骤降。
实战警示:某消费金融公司曾因“单位名称”字段缺失率高达 40%,直接使用均值填充后,模型对自由职业者的违约预测准确率下降 18%。缺失值处理不当,其危害往往超过特征选择错误。

1.3 数据质量对模型性能的影响

数据质量是风控模型的基石。缺失率、异常率、一致性等维度直接影响模型性能指标。下表展示了缺失率与模型 AUC 之间的典型关系:

缺失率区间 数据质量等级 对模型 AUC 影响 推荐处理策略
< 5% 优 几乎无影响 简单填充(均值/众数)或直接删除
5% – 15% 良 AUC 下降 0.01 – 0.03 统计填充 + 缺失指示变量
15% – 30% 中 AUC 下降 0.03 – 0.08 模型预测填充(KNN / 回归)
> 30% 差 AUC 下降 > 0.08 特征重构或删除该字段

除了 AUC,缺失值还会导致以下模型性能问题:

  • KS 统计量波动:缺失值分布不均匀时,模型区分好坏客户的能力会显著下降。
  • PSI 稳定性恶化:线上与线下缺失模式不一致,导致群体稳定性指标(PSI)超标。
  • 可解释性降低:SHAP 或 LIME 解释中,缺失值会被错误归因,误导业务决策。

1.4 缺失值处理全景图

下图展示了风控数据缺失值从识别到处理的完整链路,以及各环节对模型性能的影响路径:

风控缺失值处理全景图 风控缺失值处理全景图 缺失来源 缺失检测 缺失分类 处理策略 • 系统采集故障 • 用户主动不填 • 数据整合丢失 • isnull() 统计 • 缺失率矩阵 • 缺失模式图 • MCAR / MAR • MNAR 识别 • 业务归因 • 删除 • 填充 • 模型预测 模型性能影响 AUC 下降 · KS 波动 · PSI 恶化 · 可解释性降低 数据质量监控 → 缺失率预警 → 策略迭代 缺失率 > 30% 建议重构特征

1.5 缺失值处理的 Python 快速诊断

在进入实战之前,我们使用 Python 对风控数据集进行缺失值快速诊断。以下代码展示了缺失率计算与可视化:

import pandas as pd
import numpy as np

# 模拟风控数据集
df = pd.DataFrame({
    '客户ID': range(1, 101),
    '年龄': np.random.randint(22, 60, 100).astype(float),
    '月收入': np.random.normal(15000, 5000, 100).astype(float),
    '征信查询次数': np.random.randint(0, 20, 100).astype(float),
    '逾期天数': np.random.choice([0, 1, 5, 15, 30, np.nan], 100)
})

# 随机引入缺失值
df.loc[::10, '月收入'] = np.nan
df.loc[::15, '征信查询次数'] = np.nan

# 计算缺失率
missing_rate = df.isnull().mean() * 100
print("各字段缺失率(%):")
print(missing_rate[missing_rate > 0].round(2))

# 输出缺失矩阵摘要
print("\n缺失值统计:")
print(df.isnull().sum())

输出示例:

各字段缺失率(%):
月收入          10.0
征信查询次数     6.67
逾期天数         5.0
dtype: float64

缺失值统计:
客户ID           0
年龄             0
月收入           10
征信查询次数      7
逾期天数          5
dtype: int64
诊断要点:在风控实战中,建议对每个特征计算缺失率,并绘制缺失模式矩阵(missingno 库)。重点关注缺失率 > 5% 且与逾期标签存在相关性的字段,这些字段往往是模型性能的潜在风险点。