3. 数据准备与清洗:数据源类型、缺失值处理、异常值检测、数据标准化
风险定价模型的质量高度依赖输入数据的质量。在人群分层实操中,原始数据通常来自多个异构源,包含大量缺失、异常和量纲不一致的问题。本章聚焦数据清洗的四个核心环节:数据源类型识别、缺失值处理、异常值检测与数据标准化,确保后续建模输入干净、稳定、可解释。
3.1 数据源类型与特征
风险定价建模常见的数据源分为三类,每类在缺失模式与异常分布上差异显著:
| 数据源类型 | 典型字段 | 缺失特点 | 异常特点 |
|---|---|---|---|
| 内部业务库 | 客户ID、申请金额、还款记录、逾期天数 | 结构化缺失,如新客户无历史还款 | 极端值集中在金额与逾期天数 |
| 外部征信/三方数据 | 征信查询次数、多头借贷数、社保缴纳月数 | 非随机缺失,高风险客户常缺失更多 | 查询次数与多头数易出现离群点 |
| 行为埋点/日志数据 | 页面停留时长、点击频次、设备指纹 | 高维稀疏,大量字段为0或空 | 异常点击频次与设备环境异常 |
实操提示: 在人群分层场景中,外部征信数据的缺失往往与客户风险正相关——缺失本身可作为一个风险特征参与建模,不应简单删除。
3.2 缺失值处理策略
缺失值处理需结合缺失机制(MCAR / MAR / MNAR)与业务含义。以下为分层实操中推荐的优先级策略:
- 删除法: 仅当缺失率 < 1% 且为完全随机缺失(MCAR)时使用;删除整行或整列。
- 固定值填充: 对业务含义明确的字段(如“征信查询次数”缺失可填0),使用领域默认值。
- 统计量填充: 对连续型字段使用中位数(抗异常)或均值;对分类型字段使用众数。
- 模型预测填充: 对关键特征(如收入、负债率)使用随机森林或KNN回归填充。
- 缺失指示变量: 对缺失率 > 5% 的字段,额外生成二值特征
is_missing,保留缺失信息。
人群分层专用策略: 对“收入”字段,建议按分层标签(如优质/次级/高风险)分别计算中位数进行组内填充,避免跨层均值偏移。
# Python 示例:组内中位数填充
import pandas as pd
df['income_filled'] = df.groupby('risk_tier')['income'].transform(
lambda x: x.fillna(x.median())
)
3.3 异常值检测方法
异常值在风险定价中可能代表欺诈、录入错误或真实极端风险。推荐组合使用以下三种方法:
| 方法 | 适用场景 | 阈值设定 | 优缺点 |
|---|---|---|---|
| Z-Score | 近似正态分布连续变量 | |Z| > 3 | 简单快速,但对偏态分布敏感 |
| IQR(四分位距) | 偏态分布、含离群点的连续变量 | Q1 - 1.5×IQR 或 Q3 + 1.5×IQR | 稳健,不受极端值影响 |
| 孤立森林 | 高维数据、非正态分布 | 异常得分 > 0.6(可调) | 适合大规模特征集,可捕捉交互异常 |
避坑提醒: 不要对“逾期天数”等业务含义明确的字段直接截断异常值。逾期天数 > 180 天在风控中是真实高风险信号,应保留并做分箱处理,而非视为噪声删除。
# Python 示例:IQR 异常值检测
Q1 = df['loan_amount'].quantile(0.25)
Q3 = df['loan_amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = df[(df['loan_amount'] < lower_bound) | (df['loan_amount'] > upper_bound)]
3.4 数据标准化
风险定价模型(尤其是逻辑回归、KNN、SVM)对特征量纲敏感。标准化可消除量纲影响,使模型系数可比。常用方法如下:
| 方法 | 公式 | 输出范围 | 适用模型 |
|---|---|---|---|
| Z-Score 标准化 | (x - μ) / σ | 均值0,标准差1 | 逻辑回归、SVM、神经网络 |
| Min-Max 归一化 | (x - min) / (max - min) | [0, 1] | KNN、深度学习、距离计算 |
| Robust 标准化 | (x - median) / IQR | 无固定范围,抗异常 | 含较多异常值的字段 |
分层实操建议: 在人群分层场景中,建议先按分层标签(如优质/次级/高风险)分别计算标准化参数,再进行转换。这可以保留层内分布差异,避免跨层信息混淆。
# Python 示例:Robust 标准化
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df[['income_scaled', 'debt_ratio_scaled']] = scaler.fit_transform(
df[['income', 'debt_ratio']]
)
3.5 数据清洗全流程架构
以下 SVG 图展示了从原始数据到建模就绪数据的完整清洗流水线,包含数据源接入、缺失处理、异常检测与标准化四个阶段:
3.6 分层清洗校验清单
在人群分层实操中,每次清洗后建议按以下清单逐层校验:
- 缺失率校验: 每个分层子集(优质/次级/高风险)的缺失率是否一致?若差异 > 10%,需检查是否引入选择偏差。
- 异常分布校验: 异常值是否集中在某个分层?例如高风险层异常率 > 15% 可能为真实风险信号,不应统一截断。
- 标准化参数校验: 各分层标准化后的均值与标准差是否接近?若差异显著,考虑分层独立标准化。
- 业务一致性校验: 清洗后字段的统计量(如收入中位数、逾期率)是否符合业务经验范围。
最终交付物: 清洗后的数据集应包含原始字段、缺失指示字段、异常标记字段、标准化字段,并附带一份数据清洗报告(含缺失率、异常率、标准化参数表),供后续特征工程与模型开发团队使用。