2. 数据准备基础:原始数据清洗、缺失值处理、异常值检测与剔除的通用方法
在额度定价模型开发中,原始数据通常来自核心系统、征信机构、第三方数据源,存在格式不一致、字段缺失、极端值等问题。数据准备的质量直接决定模型训练的稳定性和泛化能力。本节系统梳理三类核心预处理任务的通用方法。
2.1 原始数据清洗:从脏数据到结构化表格
原始数据清洗的目标是消除格式错误、重复记录、无效字符和逻辑矛盾,使数据满足建模输入的基本要求。以下为清洗流程中的关键步骤:
| 清洗步骤 | 常见问题 | 处理方法 |
|---|---|---|
| 格式统一 | 日期格式混用(2024/01/01 vs 2024-01-01)、金额含逗号或货币符号 | 统一转换为标准日期格式(YYYY-MM-DD);去除金额字段中的非数字字符,转为浮点数 |
| 去重 | 同一客户多条申请记录,或同一笔交易重复录入 | 按客户ID+申请时间戳排序,保留最新一条;或按业务主键完全去重 |
| 逻辑校验 | 年龄为负数、申请金额为0、放款日期早于申请日期 | 设定业务规则阈值,超出范围则标记为异常或直接剔除 |
| 编码映射 | 性别字段出现“M/F/1/0/男/女”混合编码 | 统一映射为二元哑变量或标准分类编码 |
实践建议:清洗阶段应保留原始字段副本,避免不可逆转换。建议在清洗脚本中记录每条规则的命中行数,便于后续审计与回溯。
2.2 缺失值处理:三种策略与适用场景
缺失值在信贷数据中普遍存在,原因包括客户未填写、系统未采集、数据接口异常等。处理策略需结合缺失率、字段重要性及业务含义综合选择。
核心原则:缺失率 < 5% 时可直接删除;5%–30% 时优先填充;> 30% 时需评估字段是否保留或构造缺失指示变量。
下表对比三种主流缺失值处理方法:
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除法 | 缺失率极低(< 5%),且缺失完全随机 | 简单快速,不引入偏差 | 样本量减少,可能丢失信息 |
| 统计填充 | 数值型字段(收入、年龄),分布近似正态 | 计算量小,保持分布中心 | 降低方差,可能削弱模型区分度 |
| 模型预测填充 | 字段间相关性较强,缺失率中等 | 利用多变量信息,填充精度高 | 计算成本高,存在过拟合风险 |
以下为统计填充与模型填充的代码示例:
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
# 统计填充:中位数
df['income'].fillna(df['income'].median(), inplace=True)
# 模型预测填充:以'age'和'education'预测'income'
known = df[df['income'].notna()]
unknown = df[df['income'].isna()]
X_train = known[['age', 'education']]
y_train = known['income']
model = RandomForestRegressor(n_estimators=100)
model.fit(X_train, y_train)
df.loc[df['income'].isna(), 'income'] = model.predict(unknown[['age', 'education']])
注意:模型填充时,训练集与测试集应分别填充,避免测试集信息泄露。建议在交叉验证框架内评估填充效果。
2.3 异常值检测与剔除:从统计到集成方法
异常值在额度定价数据中常表现为极端收入、异常负债率、不合理年龄等。异常值会拉偏模型参数,降低预测精度。常用检测方法分为三类:
- 统计法:Z-score(假设正态分布)、IQR(四分位距,稳健)。IQR 法将低于 Q1-1.5×IQR 或高于 Q3+1.5×IQR 的值标记为异常。
- 距离法:LOF(局部异常因子)、DBSCAN 聚类,适用于高维或非球形分布。
- 集成法:孤立森林(Isolation Forest)、随机森林异常检测,适合大规模数据且无需假设分布。
下图展示异常值检测的通用流程:
异常值剔除并非一刀切。对于额度定价模型,建议采用“截尾”而非直接删除:将异常值替换为边界值(如 99% 分位数),保留样本量同时抑制极端影响。
import numpy as np
# IQR 截尾处理
Q1 = df['loan_amount'].quantile(0.25)
Q3 = df['loan_amount'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df['loan_amount'] = df['loan_amount'].clip(lower=lower, upper=upper)
2.4 数据准备全流程总结
将清洗、缺失值处理、异常值检测串联为统一流水线,可大幅提升模型开发效率。以下为推荐的数据准备执行顺序:
- 格式统一与去重 — 消除基础结构问题
- 逻辑校验 — 剔除业务上不可能的数据
- 缺失值处理 — 按缺失率与字段重要性选择策略
- 异常值检测与截尾 — 使用 IQR 或孤立森林
- 编码映射与特征衍生 — 为建模准备最终输入
关键指标:数据准备阶段应输出一份“数据质量报告”,包含各字段缺失率、异常值占比、清洗前后样本量变化,作为模型文档的组成部分。