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)
风控建议:对于信用评分模型,缺失值本身可能包含信息(如“未提供收入证明”),建议单独编码为“缺失”类别,而非简单填充。
缺失值处理决策流程 检测缺失值 缺失比例? 删除法 / 简单填充 KNN / 模型预测填充 多重插补 / 单独编码

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)或梯度模型(神经网络、逻辑回归),则必须进行。
标准化 vs 归一化 对比 Z-Score 标准化 公式: z = (x - μ) / σ 输出: 均值0, 标准差1 适用: 正态分布, 线性模型 对异常值敏感 Min-Max 归一化 公式: x' = (x-min)/(max-min) 输出: [0, 1] 区间 适用: 神经网络, KNN 受极值影响大

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 编码,用于逻辑回归建模。
分箱方法对比 等距分箱 固定区间宽度 简单但易偏斜 等频分箱 每箱样本数相等 分布均匀 聚类分箱 K-Means 划分 适应自然分布 决策树分箱 目标驱动分裂 关联性强 分箱后处理 WOE 编码 → 逻辑回归 / 评分卡 单调性检验 → 业务合理性验证

2.5 数据预处理流程总结

完整的数据预处理流程应遵循以下步骤,确保特征质量满足模型风险管理要求:

  1. 数据探索:统计缺失率、异常值分布、数据范围。
  2. 缺失值处理:根据缺失机制选择删除、填充或单独编码。
  3. 异常值处理:结合统计方法与业务规则,决定剔除、修正或保留。
  4. 标准化/归一化:根据模型类型选择合适方法。
  5. 分箱离散化:对连续变量进行分箱,提升模型稳定性与可解释性。
  6. 质量验证:检查处理后数据的分布、相关性及业务合理性。
模型风险提示:数据预处理步骤必须在训练集上拟合参数(如均值、标准差、分箱边界),并应用到测试集与验证集,避免数据泄露导致模型性能虚高。