数据清洗:缺失值分析、填充策略
做信用评分模型,数据清洗占了我大概60%的时间。这话一点不夸张。而缺失值处理,又是数据清洗里最让人头疼,也最容易被低估的一环。
很多人上来就用均值一通填,模型跑完才发现KS值怎么都上不去。嗯,问题多半出在缺失值处理上。
我个人习惯把缺失值处理拆成两步:先做分析,再做填充。分析不到位,填充就是瞎填。
缺失值分析——不只是数个数
我习惯从三个维度来审视缺失值。只看比例,远远不够。
维度一:缺失比例
这个最简单,每个变量缺失了多少。低于5%的基本不用太操心。超过20%的就得认真琢磨——直接删掉变量、单独编码、还是用模型预测,都需要掂量。
维度二:缺失模式
这个容易被忽略。缺失模式有三种:
- MCAR(完全随机缺失)——缺失跟任何变量都没关系。少见。
- MAR(随机缺失)——缺失跟其他变量有关,跟自己无关。最常见。
- MNAR(非随机缺失)——缺失跟自己有关。比如高收入人群更不愿意填收入字段。
真实项目中,MCAR很少见。大部分是MAR或MNAR。判断清楚缺失模式,才能选对填充策略。
维度三:缺失与目标变量的关系
这一点很多人忽略。缺失本身可能就是一种信号。我在一个信贷项目中遇到过,某个字段缺失的客户违约率是正常值的两倍。后来我们把"是否缺失"作为一个单独特征加入模型,KS提升了将近2个百分点。
核心观点:缺失值不是噪音,它可能携带信息。先分析,再填充。
四种填充策略实战对比
下面这个表格,是我自己项目里常用的对比框架。四种策略没有绝对的好坏,关键看场景。
| 策略 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 均值填充 | 连续变量,分布对称 | 简单,计算快 | 对异常值敏感,降低方差 |
| 中位数填充 | 连续变量,偏态分布 | 稳健,不受异常值影响 | 可能忽略分布细节 |
| 众数填充 | 分类型变量 | 保持类别分布 | 可能引入偏误 |
| 模型预测填充 | 缺失模式复杂,变量间关系强 | 更准确,保持数据结构 | 计算成本高,可能过拟合 |
均值填充是很多人的默认选择,但我不建议无脑用。你想想看,如果收入这个变量存在极端高值,均值会被拉高,填充后反而扭曲了分布。中位数在偏态分布下更靠谱。
模型预测填充是我个人比较喜欢的方式,尤其是当变量之间存在较强相关性时。用随机森林或KNN来预测缺失值,往往能保留更真实的数据结构。但要注意——不能引入未来信息,只能用训练集来拟合模型。
提示:模型预测填充时,记得在验证集上用同样的模型参数做填充,不要重新训练。否则会数据泄露。
警告:我曾经在一个项目中,对所有缺失值都用均值填充,结果模型在验证集上KS掉了一半。后来发现是因为收入变量存在"收入越高越不愿意填写"的模式(MNAR),均值填充完全扭曲了分布。