4. 数据准备与清洗:贷后预警的基石
在贷后预警实验中,数据质量直接决定模型效果的“天花板”。本章聚焦于从原始数据到可用特征集的完整清洗链路,涵盖数据源识别、质量检查、缺失值处理、异常值处理与标准化。每一步操作都需结合金融业务逻辑,避免“为清洗而清洗”。
4.1 数据源识别:三类核心来源
贷后预警所需数据通常来自三个渠道,每类数据在时效性、覆盖度和准确性上各有侧重:
| 数据源类型 | 典型字段 | 优势 | 局限 |
|---|---|---|---|
| 内部系统 | 还款记录、逾期天数、授信额度、账户余额 | 高准确性、实时性可控 | 仅覆盖本机构客户,缺乏外部视角 |
| 征信 | 信贷历史、查询次数、公共记录(如法院执行) | 跨机构信息、权威性强 | 更新周期较长(通常T+1),部分字段缺失 |
| 第三方 | 多头借贷、设备指纹、社交行为、电商消费 | 维度丰富、可补充行为画像 | 数据质量参差不齐,合规风险需关注 |
实践建议: 在实验初期,优先整合内部系统与征信数据,确保核心指标(如逾期天数、征信查询次数)的完整性;第三方数据作为“增强层”,需先进行小样本质量验证。
4.2 数据质量检查:五维评估法
在清洗前,需对每个字段执行系统性质量检查,重点关注以下五个维度:
- 完整性: 缺失率是否超过阈值(如30%);缺失模式是否随机。
- 准确性: 字段值是否在合理范围内(如年龄0-120、逾期天数≥0)。
- 一致性: 同一客户在不同表中的关键字段(如身份证号、合同号)是否匹配。
- 时效性: 数据时间戳是否在预期窗口内(如近3个月)。
- 唯一性: 主键(如客户ID、借据号)是否存在重复记录。
4.3 缺失值处理:策略与场景
缺失值处理需结合字段含义与缺失机制。以下为贷后场景中的常用策略:
| 策略 | 适用场景 | 实现方式(Python示例) |
|---|---|---|
| 删除 | 缺失率极高(>70%)或缺失完全随机 | df.dropna(subset=['字段名'], thresh=0.3) |
| 均值/中位数填充 | 连续型字段(如收入、额度),分布较对称 | df['字段'].fillna(df['字段'].median()) |
| 众数填充 | 离散型字段(如婚姻状况、学历等级) | df['字段'].fillna(df['字段'].mode()[0]) |
| 前向/后向填充 | 时间序列数据(如月度还款记录) | df['字段'].fillna(method='ffill') |
| 模型预测填充 | 重要字段且缺失率适中(10%-30%) | 使用KNN或回归模型预测缺失值 |
业务约束: 在贷后预警中,切勿对“逾期天数”“催收状态”等核心风险字段使用均值填充,否则会严重扭曲风险分布。建议对这类字段单独标记缺失原因,或使用“-1”作为占位符。
4.4 异常值处理:识别与修正
异常值可能源于数据录入错误、系统故障或真实的极端风险事件。处理前需区分“自然异常”与“错误异常”。
- 统计方法: 3σ原则(正态分布)、IQR(四分位距,通常取1.5倍IQR)。
- 业务规则: 如“年龄>100”“逾期天数>9999”直接判定为错误。
- 处理方式:
- 错误异常:直接删除或修正为缺失值后填充。
- 自然异常(如极少数严重逾期客户):保留或进行截尾处理(Winsorization)。
# 异常值检测与截尾处理示例
import numpy as np
import pandas as pd
def cap_outliers(series, lower_percentile=0.01, upper_percentile=0.99):
lower = series.quantile(lower_percentile)
upper = series.quantile(upper_percentile)
return series.clip(lower, upper)
# 对“近3个月逾期天数”字段进行截尾
df['逾期天数_清洗'] = cap_outliers(df['逾期天数'])
4.5 数据标准化:统一量纲
标准化可消除不同字段量纲的影响,使模型(尤其是距离类模型如KNN、SVM)收敛更快、解释更稳定。贷后预警中常用以下两种方法:
| 方法 | 公式 | 输出范围 | 适用场景 |
|---|---|---|---|
| Z-score标准化 | \( z = \frac{x - \mu}{\sigma} \) | 均值0,标准差1 | 数据近似正态分布,无严格上下界 |
| Min-Max归一化 | \( x' = \frac{x - min}{max - min} \) | [0, 1] | 数据有明确边界,如评分卡分数 |
# 标准化实现示例
from sklearn.preprocessing import StandardScaler, MinMaxScaler
# Z-score标准化
scaler_z = StandardScaler()
df['收入_z'] = scaler_z.fit_transform(df[['收入']])
# Min-Max归一化
scaler_mm = MinMaxScaler()
df['额度_mm'] = scaler_mm.fit_transform(df[['授信额度']])