数据预处理:缺失值处理、异常值处理、数据标准化

讲到数据预处理,很多新手会觉得这就是个「洗菜」的环节,随便弄弄就行。嗯,我在风控行业摸爬滚打了这些年,可以负责任地告诉你:数据预处理的质量,直接决定了模型的天花板。你想想看,信用评分模型本质上是在数据中学规律,如果数据本身就是脏的,模型学出来的只能是「脏规律」。

这一章,我会把三个最关键的预处理环节拆开讲。每个环节我都会结合踩过的坑和实际项目经验,帮你把思路理清楚。

核心原则:预处理不是「一刀切」的流程,而是一套需要根据业务场景和数据分布动态决策的策略体系。别指望一个方法打天下。

缺失值处理:别让「未知」毁了模型

信用评分数据里,缺失值简直无处不在。客户不填职业信息、征信接口超时、历史数据未采集……说白了,缺失本身就是一种信息。我个人习惯先把缺失分为三类:随机缺失、非随机缺失、完全随机缺失。但实际项目中,我们没空做这么精细的检验,通常按缺失率分层处理。

我曾在某消费金融项目里遇到一个字段「近6个月最大逾期天数」,缺失率高达40%。一开始团队想直接删掉,我拦住了。为什么?因为缺失很可能代表「从未逾期」,删除反而丢掉了关键信息。后来我们用了业务规则填充:若其他逾期字段均为零,则填0;否则用决策树预测。

下面这张表是我常用的缺失值处理策略对照表:

缺失率 常用方法 适用场景 避坑提示
<5% 直接删除对应样本 样本量充足,且缺失随机 注意不要删除标签列有缺失的样本
5%~30% 均值/中位数/众数填充 数值型偏态分布用中位数,正态用均值 需要先做异常值处理后填充,否则均值被拉偏
30%~60% 模型预测(KNN、随机森林) 缺失字段与其他字段相关性较强 我曾用KNN填充职业代码,结果过拟合了…
>60% 单独分箱标记为「缺失类」 缺失可能蕴含业务含义 分箱后需做WOE编码,不要直接当独立变量
我曾经踩过的坑:在一次供应链金融评分卡项目中,我偷懒直接用均值填充了「企业注册资本」的缺失值。结果模型上线后,对小微企业严重低估风险。后来发现缺失的几乎都是小微企业,均值被大企业拉高,直接填坏了分布。从那以后,我坚持先分析缺失模式,再选填充策略。

异常值处理:别让「胖子」压扁了回归线

异常值在信用评分里有个特点:它们往往不是数据录入错误,而是真实的极端客户。比如一个申请人年收入填了1000万,但征信报告里信用卡额度才1万——这明显有问题。但另一种情况:一个高净值客户收入500万,征信良好,这个「异常值」反而是优质样本。

所以我的经验是,异常值处理必须分两步走:先检测,再判断业务合理性。

常用检测方法:

  • 3σ原则:适用于近似正态分布的数据
  • 箱线图法(IQR):不依赖分布,稳健性好,适合偏态数据
  • Z-score修正版:用中位数替代均值,MAD替代标准差
  • 业务阈值法:比如年龄>100岁直接标记

你想想看,如果用3σ原则处理收入字段,信用评分场景下收入往往是右偏分布,均值被高收入拉高,标准差也很大,结果把正常高收入客户反而判定为异常。所以我个人偏爱IQR法,除非你能确认数据正态。

处理异常值的手段也有讲究:

  • 截尾(Winsorize):将超出边界的值替换为边界值,保留样本量
  • 删除:明显错误数据,比如年龄负值
  • 单独分箱:将异常值归为一个类别,比如「极高收入」
避坑指南:千万不要在分训练集和测试集之前做异常值截尾。应该先分割,再根据训练集的边界去截测试集和验证集,避免数据泄露。

数据标准化:让不同量纲的变量站上同一起跑线

逻辑回归、SVM、KNN这些模型对特征的尺度非常敏感。一个收入(几万)和一个逾期次数(个位数),量纲差几个数量级,模型会把注意力全放在收入上。说白了,不标准化的话,变量之间的权重比较没有意义。

我做风控评分卡时最常用的两种标准化方式:

方法 公式 输出范围 适用场景
Z-score标准化 (x - μ) / σ 均值0,标准差1 数据近似正态分布,或需要保留离群信息
Min-Max标准化 (x - min) / (max - min) [0, 1] 数据有明确边界(如年龄0~100)
Robust标准化 (x - median) / IQR 无固定范围 数据含较多异常值,不想被极端值影响

有一次我接手一个老项目,发现模型效果一直不稳定。排查后发现,开发者在训练集上用了Min-Max,但因为线上请求的字段值偶尔会超出历史min-max范围,导致标准化后的值变成负数或大于1,模型直接崩溃。后来我改成Z-score,并做了上下限截断(比如限制在-3到3之间),问题解决。

所以啊,标准化不是选一个方法就完事。你还需要考虑线上推理时的稳定性。我个人建议:风控场景首选Robust标准化,因为它对异常值不那么敏感,而且线上推理时中位数和IQR一旦确定,基本不会因为极端新样本而剧烈变化。

记住:预处理策略一定要固化到模型管线里。把缺失填充规则、异常值截尾边界、标准化参数都序列化保存,否则上线后训练和推理用的不是同一套规则,模型效果必然打折扣。
数据预处理三阶段流程 缺失值处理 按缺失率分层决策 删除样本 均值/中位数填充 模型预测填充 单独分箱标记 异常值检测与处理 IQR箱线图 3σ原则 截尾(Winsorize) 删除 单独分箱 最后别忘了 标准化哦

上面这张图概括了数据预处理的完整流程。你注意看,每个阶段都有多种可选策略,具体选哪个全看业务场景和数据诊断结果。我每次做项目,都会先花20%的时间做数据探索,再决定预处理的链路,而不是上来就直接套模板。

一个小建议:在代码中把预处理逻辑封装成可配置的Pipeline,把缺失填充策略、标准化方法都作为参数暴露出来。这样你做超参数搜索时,可以连预处理策略一起调,往往能带来意外的提升。我去年在一个信用贷项目中,单是把标准化从Min-Max换成Robust,KS就提升了3个百分点。