2. 数据质量与预处理
在模型风险管理中,数据质量直接决定模型的有效性与稳定性。低质量数据会导致模型偏差、过拟合及泛化能力下降。本章系统讲解缺失值处理、异常值检测与处理、数据标准化与归一化、数据分箱技术,确保特征工程环节的数据基础坚实可靠。
2.1 缺失值处理
缺失值是数据集中最常见的质量问题。处理策略需结合缺失机制、业务含义及模型类型综合判断。
缺失机制分类:
- 完全随机缺失(MCAR):缺失与观测数据无关,可直接删除或简单填充。
- 随机缺失(MAR):缺失与其他观测变量相关,需借助模型估计。
- 非随机缺失(MNAR):缺失与未观测因素相关,处理难度最大,需业务干预。
| 处理方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除法(行/列) | 缺失比例 < 5%,MCAR | 简单快速 | 丢失信息,可能引入偏差 |
| 均值/中位数填充 | 数值型,低缺失率 | 计算量小 | 降低方差,扭曲分布 |
| 众数填充 | 分类型 | 保持类别分布 | 可能引入噪声 |
| KNN 插补 | 中小规模数据 | 利用相似样本信息 | 计算成本高,对异常值敏感 |
| 多重插补(MICE) | 复杂缺失模式 | 保留不确定性,统计严谨 | 实现复杂,需迭代 |
| 模型预测填充 | 特征间关联强 | 精度较高 | 可能过拟合,需交叉验证 |
# Python 示例:使用 SimpleImputer 进行均值填充
from sklearn.impute import SimpleImputer
import numpy as np
data = np.array([[1, 2], [np.nan, 3], [7, 6]])
imputer = SimpleImputer(strategy='mean')
imputed_data = imputer.fit_transform(data)
print(imputed_data)
风控建议:对于信用评分模型,缺失值本身可能包含信息(如“未提供收入证明”),建议单独编码为“缺失”类别,而非简单填充。
2.2 异常值检测与处理
异常值会扭曲统计量、影响模型参数估计,尤其在风控模型中可能导致错误的风险评级。检测方法需结合数据分布与业务规则。
| 检测方法 | 原理 | 适用场景 |
|---|---|---|
| Z-Score 法 | |Z| > 3 视为异常 | 近似正态分布数据 |
| IQR 四分位距法 | Q1 - 1.5×IQR 或 Q3 + 1.5×IQR 之外 | 偏态分布,稳健性强 |
| 孤立森林 | 基于树模型隔离异常点 | 高维数据,非线性 |
| DBSCAN 聚类 | 密度低且远离核心点 | 空间聚类场景 |
| 业务规则阈值 | 如年龄 > 120 或收入 < 0 | 强业务约束场景 |
风控注意:异常值不一定是错误。例如高收入客户在收入特征中可能是“异常”,但却是真实的高净值人群。建议先标记异常,再结合业务判断是否剔除或单独建模。
# Python 示例:IQR 法检测异常值
import numpy as np
data = np.array([10, 12, 13, 15, 16, 18, 20, 22, 25, 100])
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = data[(data < lower_bound) | (data > upper_bound)]
print("异常值:", outliers)
2.3 数据标准化与归一化
不同特征的量纲差异会影响梯度下降、距离计算及正则化效果。标准化与归一化是消除量纲影响的两种主要手段。
| 方法 | 公式 | 输出范围 | 适用场景 |
|---|---|---|---|
| Z-Score 标准化 | z = (x - μ) / σ | 均值0,标准差1 | 数据近似正态分布,SVM、PCA、线性回归 |
| Min-Max 归一化 | x' = (x - min) / (max - min) | [0, 1] | 神经网络、KNN、图像处理 |
| Robust 缩放 | x' = (x - median) / IQR | 无固定范围 | 存在异常值的数据 |
| MaxAbs 缩放 | x' = x / |max| | [-1, 1] | 稀疏数据 |
# Python 示例:标准化与归一化
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import numpy as np
data = np.array([[100, 0.1], [200, 0.2], [300, 0.3]])
# Z-Score 标准化
scaler_std = StandardScaler()
data_std = scaler_std.fit_transform(data)
print("标准化:\n", data_std)
# Min-Max 归一化
scaler_mm = MinMaxScaler()
data_mm = scaler_mm.fit_transform(data)
print("归一化:\n", data_mm)
选择建议:若后续使用树模型(随机森林、XGBoost),标准化/归一化非必需;若使用距离模型(KNN、K-Means)或梯度模型(神经网络、逻辑回归),则必须进行。
2.4 数据分箱技术
分箱将连续变量离散化,可降低噪声影响、增强模型鲁棒性,并便于业务解释。在信用评分卡模型中,分箱是核心步骤。
| 分箱方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 等距分箱 | 将数据按值域等分为 k 段 | 简单直观 | 样本分布不均时效果差 |
| 等频分箱 | 每个箱包含相同数量的样本 | 样本分布均匀 | 可能将相近值分到不同箱 |
| 聚类分箱 | 使用 K-Means 聚类划分 | 适应数据自然分布 | 计算成本高,需指定 k |
| 决策树分箱 | 利用决策树分裂点划分 | 与目标变量关联强 | 易过拟合 |
| 卡方分箱 | 基于卡方检验合并相邻区间 | 统计显著性驱动 | 实现较复杂 |
# Python 示例:等频分箱
import pandas as pd
import numpy as np
data = pd.DataFrame({'age': [23, 25, 31, 35, 42, 45, 51, 55, 62, 68]})
data['age_bin'] = pd.qcut(data['age'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4'])
print(data)
风控分箱原则:
- 每个箱至少包含 5% 的样本,保证统计稳定性。
- 箱内坏账率应单调递增或递减,符合业务逻辑。
- 避免空箱或极端箱,防止模型外推风险。
- 分箱后需进行 WOE 编码,用于逻辑回归建模。
2.5 数据预处理流程总结
完整的数据预处理流程应遵循以下步骤,确保特征质量满足模型风险管理要求:
- 数据探索:统计缺失率、异常值分布、数据范围。
- 缺失值处理:根据缺失机制选择删除、填充或单独编码。
- 异常值处理:结合统计方法与业务规则,决定剔除、修正或保留。
- 标准化/归一化:根据模型类型选择合适方法。
- 分箱离散化:对连续变量进行分箱,提升模型稳定性与可解释性。
- 质量验证:检查处理后数据的分布、相关性及业务合理性。
模型风险提示:数据预处理步骤必须在训练集上拟合参数(如均值、标准差、分箱边界),并应用到测试集与验证集,避免数据泄露导致模型性能虚高。