2、数据准备基础:数据收集来源、数据清洗原则、缺失值处理策略、异常值识别方法
在风险定价模型的生命周期中,数据准备是决定模型上限的关键环节。低质量数据输入必然导致不可靠的风险定价输出。本章系统梳理数据收集的典型来源、数据清洗的核心原则、缺失值与异常值的处理策略,为后续训练集与验证集的科学划分奠定基础。
2.1 数据收集来源
风险定价模型所需数据通常来自内部业务系统与外部征信/数据服务商。不同来源的数据在覆盖度、时效性、准确性上存在显著差异,建模前需明确各来源的适用场景与局限性。
| 数据来源 | 典型内容 | 优势 | 局限性 |
|---|---|---|---|
| 内部核心系统 | 客户基本信息、账户流水、历史借贷记录、还款行为 | 数据准确、可追溯、与业务逻辑一致 | 覆盖范围有限,可能存在幸存者偏差 |
| 征信机构 | 央行征信、百行征信、芝麻信用分等 | 跨机构负债信息、逾期记录权威 | 更新频率低,部分人群无征信记录 |
| 第三方数据服务商 | 多头借贷、设备指纹、社交网络、电商消费 | 补充传统征信盲区,提升模型区分度 | 数据质量参差,合规风险需关注 |
| 公开数据 | 宏观经济指标、行业违约率、法院执行信息 | 外部环境变量,增强模型稳健性 | 粒度较粗,与个体风险关联度有限 |
实践建议:优先整合内部核心系统数据作为基线,再根据模型目标(如申请评分、行为评分、催收评分)选择性接入外部数据。避免一次性接入过多来源,增加数据治理复杂度。
2.2 数据清洗原则
数据清洗不是简单的“删除坏数据”,而是基于业务逻辑与统计规则,将原始数据转化为可用于建模的干净数据集。以下四项原则是风险定价场景中必须遵守的基线。
- 完整性原则:检查关键字段(如贷款金额、利率、逾期天数)是否存在空值或无效占位符(如 -999、NULL)。完整性不足的字段需标记并进入缺失值处理流程。
- 一致性原则:同一字段在不同数据源或不同时间点的取值逻辑必须统一。例如“逾期天数”在A系统以自然日计算,在B系统以工作日计算,需对齐后再合并。
- 准确性原则:识别并修正明显违反业务常识的记录。例如贷款金额为负数、利率超过100%、年龄为200岁等。
- 时效性原则:风险定价模型对时间敏感,需确保训练数据的时间窗口与模型应用场景一致。例如用2023年的数据训练模型去预测2025年的风险,需谨慎评估概念漂移。
关键提醒:清洗过程必须保留完整的清洗日志,包括原始值、清洗规则、清洗后值、清洗时间戳。这是模型审计与复现的基础,也是监管合规的要求。
2.3 缺失值处理策略
缺失值是风险定价数据中的常见问题,其处理方式直接影响模型偏差与方差。策略选择需综合考虑缺失机制(MCAR/MAR/MNAR)、缺失率、变量重要性。
| 策略 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 删除缺失记录 | 缺失率 < 5%,且缺失机制为完全随机(MCAR) | 简单、不引入人为偏差 | 样本量减少,可能损失信息 |
| 均值/中位数填充 | 数值型变量,缺失率较低(5%~20%) | 计算快,保持数据分布中心 | 低估方差,削弱变量区分能力 |
| 众数填充 | 分类型变量,如婚姻状况、学历 | 保留类别分布特征 | 可能强化主导类别偏差 |
| 模型预测填充 | 缺失率较高(20%~50%),且变量间存在相关性 | 利用变量间关系,填充精度高 | 计算成本高,存在过拟合风险 |
| 缺失值单独编码 | 缺失本身具有信息含义(如“未查询到征信”) | 保留缺失信息,提升模型表现 | 增加特征维度,需谨慎解释 |
风险提示:在训练集与验证集划分后,缺失值填充参数(如均值、中位数)必须仅在训练集上计算,再应用到验证集。禁止使用全样本统计量进行填充,否则会导致数据泄露,高估模型性能。
2.4 异常值识别方法
异常值在风险定价数据中可能代表欺诈、数据录入错误或真实的极端风险。不加区分地删除或保留都会损害模型效果。以下列出四种主流识别方法,实际应用中常组合使用。
| 方法 | 原理 | 适用变量类型 | 阈值设定 |
|---|---|---|---|
| Z-Score 法 | 计算每个值与均值的标准差倍数 | 近似正态分布的连续变量 | |Z| > 3 视为异常 |
| IQR 四分位距法 | 基于 Q1 和 Q3 计算上下边界 | 偏态分布的连续变量 | 下界 = Q1 - 1.5×IQR;上界 = Q3 + 1.5×IQR |
| 孤立森林 | 基于随机切割的集成学习算法 | 高维连续变量 | 异常分数 > 0.6 或根据分布分位数 |
| 业务规则法 | 基于领域知识设定合理取值范围 | 所有类型,尤其离散变量 | 如年龄 < 18 或 > 100 视为异常 |
实战经验:在风险定价场景中,建议优先使用 IQR 法 + 业务规则法组合。IQR 对偏态分布(如收入、贷款金额)稳健,业务规则法可捕获统计方法无法识别的逻辑异常(如“贷款发放日期晚于逾期日期”)。
2.5 数据准备完整流程示例
以下代码展示一个简化的数据准备流程,涵盖缺失值填充与异常值识别,使用 Python 伪代码风格。实际生产环境需根据数据规模与业务逻辑调整。
import pandas as pd
import numpy as np
# 1. 加载原始数据
df = pd.read_csv('loan_data_raw.csv')
# 2. 数据清洗:删除完全重复行
df = df.drop_duplicates()
# 3. 缺失值处理:训练集上计算填充参数
train_mask = df['date'] < '2024-01-01'
train_data = df[train_mask]
# 数值变量:中位数填充
income_median = train_data['income'].median()
df['income'] = df['income'].fillna(income_median)
# 分类变量:众数填充
education_mode = train_data['education'].mode()[0]
df['education'] = df['education'].fillna(education_mode)
# 4. 异常值识别:IQR 法
Q1 = train_data['loan_amount'].quantile(0.25)
Q3 = train_data['loan_amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 标记异常值,不直接删除
df['loan_amount_outlier'] = ((df['loan_amount'] < lower_bound) |
(df['loan_amount'] > upper_bound)).astype(int)
# 5. 输出清洗后数据
df.to_csv('loan_data_cleaned.csv', index=False)
重要:上述代码中,填充参数(median、mode)和异常值边界(Q1、Q3)均基于训练集计算。验证集和测试集只能使用这些预计算参数进行转换,不得重新计算。这是防止数据泄露的核心原则。
数据准备是风险定价模型生命周期中最耗时但最具价值的环节。完成上述步骤后,即可进入下一阶段:特征工程与训练集/验证集划分。请确保每一步都保留完整的转换参数与日志,为模型的可解释性与监管审计提供支撑。