3、数据采集与清洗:数据源类型与预处理策略
在信贷风控建模中,数据质量直接决定模型的天花板。本章聚焦于三类核心数据源(征信、行为、三方数据)的采集要点,以及缺失值、异常值的系统化清洗策略。只有经过严格清洗的数据,才能为逾期预测提供可靠的“原料”。
3.1 数据源类型与采集要点
信贷风控数据源可归纳为三大类,每类在采集时需关注不同的维度与合规要求:
| 数据源类型 | 核心内容 | 采集要点 | 常见问题 |
|---|---|---|---|
| 征信数据 | 央行征信、百行征信、个人信用报告 | 授权书签署、数据加密传输、T+1更新 | 查询频次限制、数据延迟、多头借贷识别 |
| 行为数据 | APP操作日志、还款习惯、设备指纹 | 埋点规范、时间戳对齐、用户隐私脱敏 | 数据稀疏、埋点遗漏、设备篡改 |
| 三方数据 | 社保、公积金、电商、运营商、黑名单 | API接口稳定性、数据源授权、覆盖度评估 | 数据不一致、接口超时、字段映射错误 |
合规提示:所有数据采集必须遵循《个人信息保护法》及金融监管要求,确保用户授权清晰、数据最小化原则、传输加密(TLS 1.2+),并建立数据生命周期管理机制。
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 公里 |
避坑提醒:不要机械地删除所有异常值。在风控场景中,异常值往往包含欺诈信号或高风险用户特征。建议先标记、后分层处理,保留异常标签作为衍生特征。
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% | 数据源交叉验证、更新映射规则 |
数据采集与清洗是风控建模的基石。只有将缺失值、异常值系统化处理,并建立持续监控机制,才能确保后续逾期预测模型的稳定与可靠。