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)、随机森林异常检测,适合大规模数据且无需假设分布。

下图展示异常值检测的通用流程:

异常值检测与剔除流程 原始数据 统计法检测 标记异常值 业务规则复核 剔除 / 截尾 干净数据集 IQR: Q1-1.5IQR ~ Q3+1.5IQR Z-score: |Z| > 3 为异常

异常值剔除并非一刀切。对于额度定价模型,建议采用“截尾”而非直接删除:将异常值替换为边界值(如 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 数据准备全流程总结

将清洗、缺失值处理、异常值检测串联为统一流水线,可大幅提升模型开发效率。以下为推荐的数据准备执行顺序:

  1. 格式统一与去重 — 消除基础结构问题
  2. 逻辑校验 — 剔除业务上不可能的数据
  3. 缺失值处理 — 按缺失率与字段重要性选择策略
  4. 异常值检测与截尾 — 使用 IQR 或孤立森林
  5. 编码映射与特征衍生 — 为建模准备最终输入
关键指标:数据准备阶段应输出一份“数据质量报告”,包含各字段缺失率、异常值占比、清洗前后样本量变化,作为模型文档的组成部分。