数据预处理:缺失值处理、异常值处理、数据标准化
讲到数据预处理,很多新手会觉得这就是个「洗菜」的环节,随便弄弄就行。嗯,我在风控行业摸爬滚打了这些年,可以负责任地告诉你:数据预处理的质量,直接决定了模型的天花板。你想想看,信用评分模型本质上是在数据中学规律,如果数据本身就是脏的,模型学出来的只能是「脏规律」。
这一章,我会把三个最关键的预处理环节拆开讲。每个环节我都会结合踩过的坑和实际项目经验,帮你把思路理清楚。
缺失值处理:别让「未知」毁了模型
信用评分数据里,缺失值简直无处不在。客户不填职业信息、征信接口超时、历史数据未采集……说白了,缺失本身就是一种信息。我个人习惯先把缺失分为三类:随机缺失、非随机缺失、完全随机缺失。但实际项目中,我们没空做这么精细的检验,通常按缺失率分层处理。
我曾在某消费金融项目里遇到一个字段「近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一旦确定,基本不会因为极端新样本而剧烈变化。
上面这张图概括了数据预处理的完整流程。你注意看,每个阶段都有多种可选策略,具体选哪个全看业务场景和数据诊断结果。我每次做项目,都会先花20%的时间做数据探索,再决定预处理的链路,而不是上来就直接套模板。