3. 催收数据准备:逾期客户数据采集、数据清洗与缺失值处理、数据标准化与分箱
在构建催收Spark评分模型之前,数据准备是决定模型上限的关键环节。本章将系统讲解从原始逾期客户数据到可用于建模的标准化特征矩阵的完整流程,涵盖数据采集、清洗、缺失值处理、标准化与分箱四大核心步骤。
3.1 逾期客户数据采集
数据采集是催收分析的起点。我们需要从多个数据源整合与逾期客户相关的信息,构建统一的宽表数据集。
| 数据源类型 | 典型字段 | 采集方式 |
|---|---|---|
| 核心信贷系统 | 合同号、逾期天数、逾期金额、剩余本金、还款计划 | ODBC/JDBC 直连 |
| 客户关系管理 | 年龄、性别、职业、收入、学历、婚姻状况 | API 接口 |
| 历史催收记录 | 催收次数、承诺还款金额、实际还款金额、催收员ID | Hive/Spark SQL |
| 外部征信数据 | 征信查询次数、逾期历史、多头借贷数 | 第三方接口 |
| 行为日志数据 | APP登录次数、浏览产品页数、客服通话时长 | Kafka 流式采集 |
采集要点:建议以
contract_id 作为主键进行多表关联,采集时间窗口统一为逾期后第1天至第30天,避免时间偏移导致特征不一致。
3.2 数据清洗与缺失值处理
原始数据通常包含重复记录、异常值、格式不一致等问题。数据清洗的目标是消除这些噪声,确保数据质量。
3.2.1 常见数据质量问题
- 重复记录:同一合同号出现多条记录,需按时间戳去重保留最新一条。
- 异常值:如年龄为负数、逾期天数超过合同期限、金额字段出现负值。
- 格式不一致:日期格式混用(yyyy-MM-dd vs yyyy/MM/dd)、性别字段编码不统一(男/1/M)。
- 逻辑冲突:逾期金额大于剩余本金、还款日期早于放款日期。
3.2.2 缺失值处理策略
| 缺失类型 | 处理方法 | 适用场景 |
|---|---|---|
| 完全随机缺失 | 删除记录(行删除) | 缺失率 < 5% 且样本量充足 |
| 随机缺失 | 均值/中位数填充 | 连续型特征(如收入、年龄) |
| 非随机缺失 | 模型预测填充(如KNN、回归) | 重要特征且缺失率 5%-20% |
| 高缺失率(> 50%) | 单独编码为“未知”类别 | 分类特征(如职业、学历) |
Spark 实现示例:使用
pyspark.ml.feature.Imputer 进行均值填充。
from pyspark.ml.feature import Imputer
imputer = Imputer(
inputCols=["age", "income", "overdue_days"],
outputCols=["age_imputed", "income_imputed", "overdue_days_imputed"]
).setStrategy("mean")
df_imputed = imputer.fit(df).transform(df)
3.3 数据标准化与分箱
标准化和分箱是特征工程的核心步骤,直接影响评分模型的稳定性和可解释性。
3.3.1 数据标准化
标准化将不同量纲的特征映射到同一尺度,避免数值较大的特征主导模型训练。催收场景中常用的标准化方法:
| 方法 | 公式 | 输出范围 | 适用特征 |
|---|---|---|---|
| Z-Score 标准化 | \( z = \frac{x - \mu}{\sigma} \) | 无固定范围,均值为0,标准差为1 | 近似正态分布的特征(如年龄、收入) |
| Min-Max 归一化 | \( x' = \frac{x - min}{max - min} \) | [0, 1] | 有明确上下界的特征(如逾期天数) |
| Robust 缩放 | \( x' = \frac{x - median}{IQR} \) | 无固定范围,受异常值影响小 | 存在异常值的特征(如逾期金额) |
3.3.2 特征分箱
分箱将连续特征离散化为有限个区间,能够增强模型的鲁棒性和可解释性,同时捕捉非线性关系。
常见分箱方法对比:
| 分箱方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 等距分箱 | 将特征值范围均匀划分为k个区间 | 实现简单,区间宽度一致 | 数据分布不均时箱内样本差异大 |
| 等频分箱 | 每个箱内包含相同数量的样本 | 箱内样本量均衡,避免空箱 | 区间边界可能不直观 |
| 最优分箱(决策树) | 基于目标变量(如是否还款)寻找最佳切分点 | 与目标变量相关性最强,提升模型区分度 | 计算成本较高,易过拟合 |
| 自定义分箱 | 根据业务经验手动设定区间 | 可解释性强,符合业务逻辑 | 依赖专家经验,可能不最优 |
分箱注意事项:分箱后需检查每个箱内的坏账率(逾期未还比例)是否呈现单调性。若出现非单调趋势,应调整分箱边界或合并相邻箱。
3.4 数据准备流程总览
下图展示了从原始数据到建模特征矩阵的完整数据准备流程:
3.5 实战案例:逾期天数分箱
以逾期天数(overdue_days)为例,展示分箱前后的效果对比:
from pyspark.ml.feature import Bucketizer
# 定义分箱边界(基于业务经验)
splits = [0, 7, 15, 30, 60, 90, float('inf')]
bucketizer = Bucketizer(
splits=splits,
inputCol="overdue_days",
outputCol="overdue_bin"
)
df_binned = bucketizer.transform(df_imputed)
# 查看分箱结果
df_binned.groupBy("overdue_bin").agg(
count("*").alias("count"),
avg("is_default").alias("default_rate")
).orderBy("overdue_bin").show()
| 分箱区间 | 样本数 | 坏账率 | IV值 |
|---|---|---|---|
| [0, 7] | 12,450 | 0.08 | 0.35 |
| [7, 15] | 8,320 | 0.21 | 0.28 |
| [15, 30] | 5,680 | 0.45 | 0.42 |
| [30, 60] | 3,210 | 0.72 | 0.51 |
| [60, 90] | 1,450 | 0.89 | 0.38 |
| [90, ∞) | 890 | 0.96 | 0.22 |
结论:逾期天数分箱后,坏账率呈现严格的单调递增趋势,IV值均大于0.02,说明该分箱方案具有良好的区分能力和业务可解释性。
3.6 本章小结
数据准备是催收评分模型的基础工程,直接影响模型的上限和稳定性。本章重点:
- 数据采集:多源整合,以合同号为主键,统一时间窗口。
- 数据清洗:去重、异常值处理、格式统一,确保数据质量。
- 缺失值处理:根据缺失机制和缺失率选择填充、删除或编码策略。
- 标准化:Z-Score、Min-Max、Robust 三种方法按特征分布选择。
- 特征分箱:等频、最优、自定义等方法,分箱后需验证单调性和IV值。
完成上述步骤后,即可获得一份干净、标准化、离散化的特征矩阵,为后续的Spark评分模型训练奠定坚实基础。