3、数据预处理:缺失值处理与异常值检测
在催收特征工程中,原始数据通常包含大量缺失值和异常值。这些“脏数据”会严重干扰特征重要性的评估结果,导致模型偏向或失效。本节将系统讲解缺失值的三种填充策略与异常值的检测处理方法,确保进入模型的特征矩阵干净、稳定。
3.1 缺失值处理
催收数据中常见的缺失场景包括:客户未填写收入信息、催收员未录入通话时长、外部征信接口返回空值等。根据缺失机制(MCAR/MAR/MNAR)和数据分布特征,选择不同的填充方法。
3.1.1 均值/中位数/众数填充(统计填充)
这是最基础、计算开销最小的填充方式,适用于数值型特征(均值/中位数)和分类型特征(众数)。
| 填充方式 | 适用场景 | 催收示例 | 注意事项 |
|---|---|---|---|
| 均值填充 | 数据近似正态分布,无极端值 | 客户年龄、历史逾期天数 | 会降低特征方差,削弱区分度 |
| 中位数填充 | 数据偏态分布,存在极端值 | 欠款金额、催收通话时长 | 对异常值鲁棒,保留分布位置 |
| 众数填充 | 分类变量或离散变量 | 职业类型、逾期原因代码 | 可能引入偏差,需检查类别平衡 |
实战建议:在催收场景中,欠款金额和通话时长通常呈右偏分布,优先使用中位数填充;年龄和信用分若接近正态,可用均值填充;逾期原因等分类变量使用众数填充前,需确认该类别占比不超过80%,否则填充后特征几乎失去信息。
3.1.2 模型预测填充(高级填充)
利用其他完整特征作为输入,训练模型预测缺失值。这种方法能更好地保留特征间的关联结构,但计算成本较高。
常用模型选择:
- 线性回归/岭回归:适用于连续数值型缺失,特征间线性关系较强时使用。
- KNN填充:基于相似样本的加权平均,适合非线性关系,但需注意K值选择和距离度量。
- 随机森林/梯度提升树:对缺失值鲁棒,能自动捕捉交互效应,是催收数据中最推荐的预测填充模型。
- MICE(链式方程多重插补):迭代填充,生成多个完整数据集,适合后续需要不确定性评估的场景。
催收场景特别提示:当缺失率超过30%时,模型预测填充可能引入较大偏差。此时建议先分析缺失原因(如:是否高逾期客户更易缺失收入信息),再决定是否填充或直接删除该特征。
# Python示例:使用随机森林进行缺失值预测填充
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np
def rf_impute(df, target_col, feature_cols):
"""
使用随机森林预测填充缺失值
:param df: 包含缺失值的数据框
:param target_col: 需要填充的目标列名
:param feature_cols: 用于预测的特征列名列表
:return: 填充后的数据框
"""
# 分离有缺失和无缺失样本
missing_mask = df[target_col].isnull()
train_df = df[~missing_mask]
test_df = df[missing_mask]
# 确保训练集和测试集特征完整
X_train = train_df[feature_cols].values
y_train = train_df[target_col].values
X_test = test_df[feature_cols].values
# 训练模型
rf = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42)
rf.fit(X_train, y_train)
# 预测并填充
predicted_values = rf.predict(X_test)
df.loc[missing_mask, target_col] = predicted_values
return df
3.2 异常值检测与处理
催收数据中的异常值可能来自:录入错误(如年龄200岁)、系统故障(通话时长-1秒)、或真实极端行为(单日催收通话100次)。异常值会扭曲特征分布,影响重要性排序的稳定性。
3.2.1 异常值检测方法
| 检测方法 | 原理 | 催收适用特征 | 阈值设定 |
|---|---|---|---|
| Z-Score法 | 基于均值与标准差,假设正态分布 | 年龄、信用分 | |Z| > 3 视为异常 |
| IQR四分位距法 | 基于中位数与四分位数,对偏态分布鲁棒 | 欠款金额、通话时长 | Q1 - 1.5*IQR 或 Q3 + 1.5*IQR |
| 孤立森林 | 基于随机切割的集成方法,适合高维数据 | 多特征联合异常检测 | 异常分数 > 0.6 或按比例截断 |
| DBSCAN聚类 | 基于密度,识别远离核心簇的点 | 催收行为模式异常 | eps和min_samples调参 |
避坑提醒:不要对分类特征(如逾期原因代码、城市等级)使用Z-Score或IQR法检测异常值。分类特征的“异常”应通过频次分析或业务规则判断(如:出现频率低于0.1%的类别可合并为“其他”)。
3.2.2 异常值处理策略
检测到异常值后,根据业务含义和数据量选择处理方式:
- 删除(截尾):当异常值比例低于5%且确认是录入错误时,直接删除该样本或将该特征值设为NaN后填充。
- 截断(Winsorize):将异常值替换为阈值边界值(如:将超过99%分位数的值替换为99%分位数)。适用于欠款金额等真实但极端的数值。
- 分箱离散化:将连续特征转换为有序分类特征,天然消除极端值影响。如将“通话时长”分为[0-5min, 5-15min, 15-30min, >30min]。
- 单独编码:对异常值单独标记为一个新类别(如“异常高”),保留其信息但不干扰主分布。
催收最佳实践:对于“单日催收通话次数”特征,若发现某客户一天内通话100次(正常范围0-20次),建议使用截断法替换为99%分位数(如25次),而不是直接删除。因为该客户可能是高风险催收对象,其极端行为本身具有预测价值,只是需要控制其对模型的影响程度。
3.3 预处理后的验证与评估
完成缺失值填充和异常值处理后,必须验证预处理效果,避免引入新的偏差:
- 分布对比:绘制填充前后特征的直方图或箱线图,确保填充后的分布形态与原始完整数据一致。
- 相关性检查:计算填充后特征与其他特征的相关性,若相关系数变化超过0.2,说明填充方法可能破坏了原有关系。
- 模型稳定性测试:在填充后的数据上训练轻量模型(如逻辑回归),对比不同填充策略下的特征重要性排序是否稳定。
效率提示:在催收特征重要性评估的初始阶段,建议先使用中位数填充 + IQR截断作为基线预处理方案。该组合计算快、鲁棒性强,能快速产出可用的特征矩阵。待特征重要性初筛完成后,再对Top 20重要特征进行精细化模型预测填充。