4. 数据准备与探索
申请评分A卡的质量,七分靠数据、三分靠算法。进入建模之前,必须先把“人、财、时间”三类数据源理清楚,再完成清洗、缺失值处理、异常值识别与初步EDA。本章的目标是让读者能够独立产出一份可交付的建模宽表,并形成对目标变量与关键特征的初步判断。
一、核心原理:数据准备是风险定义的落地过程
申请评分卡的数据准备不是简单的“把表拼起来”,而是把业务上的“好/坏”定义翻译成可计算的标签,再把申请时点可见的信息翻译成特征。核心原则有三条:
- 时点一致性:特征必须是申请提交时或之前可获取的,严禁使用放款后、贷后行为产生的信息,否则会造成标签泄漏。
- 观察期与表现期分离:观察期用于采集特征,表现期用于定义好坏。例如观察期取申请日前6个月,表现期取放款后6~12个月。
- 可解释与可追溯:每个字段都要有来源系统、口径说明、更新频率,便于后续监控与审计。
二、方法流程:从数据源到建模宽表
典型流程可拆为六步:数据源盘点 → 样本筛选 → 数据清洗 → 缺失值处理 → 异常值识别 → 初步EDA。每一步都要留下可复现的脚本与日志。
# 示例:申请评分卡数据准备主流程(伪代码)
1. 读取申请主表、征信表、三方数据表、标签表
2. 按申请ID左连接,保留申请时点快照
3. 剔除表现期不足、金额为0、重复申请
4. 统一缺失值编码(如 -999、NULL、空字符串 → NaN)
5. 缺失率统计与处理(删除、填充、缺失指示变量)
6. 异常值识别(分箱、IQR、业务规则)
7. 初步EDA(bad rate、IV、相关性、PSI)
8. 输出建模宽表 model_base.csv
数据源通常包括:申请主表(年龄、收入、职业)、征信表(查询次数、逾期记录)、三方数据(多头、设备、社交)、标签表(表现期好坏)。连接时务必以申请ID为主键,避免多对多导致样本膨胀。
三、缺失值处理:先理解缺失机制,再选择策略
缺失值不是“填上就行”,要先判断缺失是随机缺失(MCAR)、条件缺失(MAR)还是非随机缺失(MNAR)。在风控场景中,缺失本身往往携带信息,例如“无征信记录”可能意味着薄征信人群,风险特征与有记录人群不同。
| 缺失率区间 | 推荐策略 | 注意事项 |
|---|---|---|
| < 5% | 中位数/众数填充,或直接删除样本 | 删除前确认不会引入选择偏差 |
| 5%~30% | 填充 + 缺失指示变量 | 指示变量需参与IV筛选 |
| 30%~60% | 单独分箱,或业务规则填充 | 避免用未来信息填充 |
| > 60% | 谨慎保留,通常剔除或降权 | 需评估业务可获取性 |
四、异常值识别与初步EDA:让数据自己说话
异常值识别常用三种方法:业务规则(年龄<18或>70)、统计方法(IQR、3σ、分位数截断)、模型方法(孤立森林)。风控中更推荐“分箱观察+业务判断”,因为很多极端值其实是真实的高风险信号,例如收入极高但负债也极高。
# 示例:IQR 异常值识别
Q1 = df['income'].quantile(0.25)
Q3 = df['income'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df['income_flag'] = ((df['income'] < lower) | (df['income'] > upper)).astype(int)
初步EDA至少输出四类结果:目标变量分布(bad rate)、单变量分箱与IV、特征相关性热力图、训练集与验证集的PSI。下面是一个简化的EDA检查清单:
- 样本量是否充足?坏样本是否≥500?
- bad rate是否在合理区间(如2%~15%)?
- 关键特征缺失率是否超过阈值?
- 连续变量分布是否严重偏态?
- 类别变量取值是否过多?
- 训练/验证/测试时间切分是否合理?
复盘一个真实场景:某消费金融A卡项目,初期AUC达到0.82,但上线后KS仅0.21。排查发现,收入字段用全量中位数填充,且训练集包含放款后3个月的还款状态。修正后重新做时间切分、仅用申请时点特征、填充统计量仅来自训练集,离线AUC降至0.76,但上线KS稳定在0.33。这说明数据准备的严谨性直接决定模型的生命力。
完成本章后,你应能独立输出一份包含样本筛选日志、缺失值处理记录、异常值清单和EDA报告的建模宽表,为后续分箱、WOE转换与逻辑回归建模打下可靠基础。