3、数据采集与清洗:数据源类型与预处理策略

在信贷风控建模中,数据质量直接决定模型的天花板。本章聚焦于三类核心数据源(征信、行为、三方数据)的采集要点,以及缺失值、异常值的系统化清洗策略。只有经过严格清洗的数据,才能为逾期预测提供可靠的“原料”。

3.1 数据源类型与采集要点

信贷风控数据源可归纳为三大类,每类在采集时需关注不同的维度与合规要求:

数据源类型 核心内容 采集要点 常见问题
征信数据 央行征信、百行征信、个人信用报告 授权书签署、数据加密传输、T+1更新 查询频次限制、数据延迟、多头借贷识别
行为数据 APP操作日志、还款习惯、设备指纹 埋点规范、时间戳对齐、用户隐私脱敏 数据稀疏、埋点遗漏、设备篡改
三方数据 社保、公积金、电商、运营商、黑名单 API接口稳定性、数据源授权、覆盖度评估 数据不一致、接口超时、字段映射错误
合规提示:所有数据采集必须遵循《个人信息保护法》及金融监管要求,确保用户授权清晰、数据最小化原则、传输加密(TLS 1.2+),并建立数据生命周期管理机制。
信贷风控数据源融合架构 信贷风控数据源融合架构 征信数据 央行/百行/个人信用 行为数据 APP日志/还款习惯/设备 三方数据 社保/电商/运营商 数据清洗层:缺失值处理 · 异常值检测 · 格式标准化 统一特征宽表 → 模型训练

3.2 缺失值处理策略

缺失值是风控数据中最常见的问题。处理不当会导致模型偏差或信息丢失。以下是按缺失率分级的处理策略:

缺失率范围 推荐策略 适用场景 注意事项
< 5% 均值/中位数填充、众数填充(类别型) 连续变量、低缺失率 避免引入偏差,需验证填充后分布
5% ~ 30% 模型预测填充(KNN/回归)、分组填充 重要特征、有相关变量 需保留缺失指示变量(isnull flag)
30% ~ 60% 单独编码为“未知”类别、使用缺失指示变量 类别型特征、三方数据 评估缺失是否与逾期存在相关性
> 60% 删除特征或合并为衍生变量 信息量极低、覆盖度差 需结合业务判断,避免删除重要信号
关键原则:缺失值处理不是简单的“填数”,而是信息重构。建议始终保留缺失指示变量(isnull flag),因为“数据缺失”本身可能就是逾期的重要信号(例如用户拒绝授权征信)。

3.3 异常值检测与清洗策略

异常值可能源于数据录入错误、设备异常、欺诈行为或极端但真实的用户画像。检测方法需结合统计与业务规则:

  • 统计方法:Z-Score(|Z| > 3)、IQR(Q1-1.5IQR / Q3+1.5IQR)、箱线图可视化。
  • 业务规则:年龄 < 18 或 > 70、收入为负、申请时间在凌晨 2-5 点且金额异常。
  • 模型方法:孤立森林(Isolation Forest)、LOF(局部异常因子)、DBSCAN 聚类。
异常类型 检测方法 清洗策略 示例
录入错误 业务规则 + 范围校验 修正或删除 年龄 200 岁 → 删除
极端真实值 IQR + 业务判断 保留或截尾(Winsorize) 年收入 5000 万 → 截尾至 99% 分位
欺诈行为 孤立森林 + 规则引擎 标记为欺诈样本,单独建模 同一设备 1 小时内申请 50 次
数据采集异常 时间序列 + 阈值 重采或插值 GPS 坐标突然跳变 1000 公里
避坑提醒:不要机械地删除所有异常值。在风控场景中,异常值往往包含欺诈信号或高风险用户特征。建议先标记、后分层处理,保留异常标签作为衍生特征。
异常值检测与清洗流程 异常值检测与清洗流程 原始数据输入 统计方法检测 Z-Score / IQR 业务规则检测 年龄/收入/时间 模型方法检测 孤立森林 / LOF 异常标记与分级(轻/中/重) 轻度:截尾/修正 中度:标记保留 重度:删除/隔离

3.4 数据清洗流程与代码示例

以下是一个标准的数据清洗流水线,涵盖缺失值与异常值处理的核心步骤:

import pandas as pd
import numpy as np
from scipy import stats

def data_cleaning_pipeline(df):
    """风控数据清洗流水线"""
    df_clean = df.copy()

    # 1. 缺失值处理:按缺失率分级
    missing_rate = df_clean.isnull().mean()
    for col in df_clean.columns:
        if missing_rate[col] < 0.05:
            # 低缺失率:中位数填充
            df_clean[col].fillna(df_clean[col].median(), inplace=True)
        elif missing_rate[col] < 0.30:
            # 中缺失率:填充 + 保留缺失标志
            df_clean[col + '_isnull'] = df_clean[col].isnull().astype(int)
            df_clean[col].fillna(df_clean[col].median(), inplace=True)
        elif missing_rate[col] < 0.60:
            # 高缺失率:单独编码
            df_clean[col].fillna('UNKNOWN', inplace=True)
        else:
            # 极高缺失率:删除特征
            df_clean.drop(columns=[col], inplace=True)

    # 2. 异常值检测:Z-Score 方法
    numeric_cols = df_clean.select_dtypes(include=[np.number]).columns
    z_scores = np.abs(stats.zscore(df_clean[numeric_cols].fillna(0)))
    outlier_mask = (z_scores > 3).any(axis=1)

    # 3. 异常值处理:标记而非删除
    df_clean['is_outlier'] = outlier_mask.astype(int)

    # 4. 对异常值进行截尾处理(Winsorize)
    for col in numeric_cols:
        lower = df_clean[col].quantile(0.01)
        upper = df_clean[col].quantile(0.99)
        df_clean[col] = df_clean[col].clip(lower, upper)

    return df_clean
工程建议:在生产环境中,建议将清洗逻辑封装为独立的 ETL 模块,并记录清洗前后的数据分布变化(均值、方差、缺失率),便于监控数据质量漂移。

3.5 数据质量监控指标

清洗完成后,需建立持续的数据质量监控体系,关键指标包括:

  • 缺失率趋势:每日/每周各字段缺失率变化,超过阈值触发告警。
  • 异常值占比:异常标记样本的比例,异常激增可能预示数据源故障或欺诈攻击。
  • 字段一致性:同一用户在不同数据源中的信息是否一致(如年龄、手机号归属地)。
  • 覆盖率:三方数据接口的返回率,低于 80% 需评估数据源有效性。
监控指标 计算方式 告警阈值 响应动作
缺失率 缺失数 / 总样本数 单字段 > 20% 检查数据源接口、调整填充策略
异常占比 异常标记数 / 总样本数 > 5% 或环比增长 > 50% 触发人工审核、排查数据采集环节
接口返回率 成功返回数 / 请求总数 < 80% 切换备用数据源、降级处理
字段一致性 一致样本数 / 总样本数 < 90% 数据源交叉验证、更新映射规则

数据采集与清洗是风控建模的基石。只有将缺失值、异常值系统化处理,并建立持续监控机制,才能确保后续逾期预测模型的稳定与可靠。