信用评分IV特征分层实战课 - 第4节
缺失值处理与异常值处理
做评分卡的人都知道一句话:垃圾进,垃圾出。数据里要是满是缺失和异常,后面算出来的 IV 再高也是骗人的。我刚开始做风控建模那会儿,接过一个信贷数据集,光缺失率就超过 40%,我当时天真地想「删掉不就完了」……结果样本量直接砍掉三分之一,模型压根儿不收敛。后来我学乖了——缺失值和异常值,不能无脑删,也不能不处理。
说白了,这一步是给特征做「体检」。你想想看,一个特征如果有一半的值都缺着,变量重要性再高也没用;一个特征如果尾巴上挂几个极端值,IV 可能被拉偏到离谱。所以这一章,咱们就聊聊怎么给这些「病人」对症下药。
一、缺失值处理
1.1 缺失类型:三种「病因」
处理之前,先要弄清楚数据为什么缺失。我一般把它分成三类:
| 类型 | 含义 | 例子 | 处理策略 |
|---|---|---|---|
| 完全随机缺失 | 缺失与任何变量无关 | 录入时不小心漏填 | 删除或简单填充 |
| 随机缺失 | 缺失与其他观测变量有关 | 高收入者更不愿透露收入 | 模型填充或分组填充 |
| 非随机缺失 | 缺失与缺失值本身有关 | 坏客户故意不填联系人 | 单独作为一类 |
1.2 常见处理方法
我个人常用的方法有这几种,按优先级排:
- 直接删除 —— 缺失率很低(<5%)且样本量够大时,删掉无妨。但注意!测试集和验证集得跟着删,不能只在训练集删。
- 均值/中位数填充 —— 连续型变量用中位数更稳健,因为均值容易被异常值带偏。我在项目中试过,用中位数填充后的 IV 通常比用均值更稳定。
- 众数填充 —— 分类变量用众数。但要注意:如果众数占比太高,填充后可能让变量失去区分度,IV 会断崖式下跌。
- 模型预测填充 —— 用其他完整特征去预测缺失值。比如用随机森林或者 KNN。我建议只在缺失率 20%~50% 时用,否则容易过拟合。
- 单独作为一档 —— 这是评分卡最常用的方式。把缺失单独作为一个分箱,和其他值一起进入 WoE 编码。嗯,这里要注意:分箱后要保证缺失档有足够的样本,否则 WoE 会不稳定。
1.3 缺失值对 IV 的影响
IV 计算需要每个分箱都有样本,如果一个特征缺失太多,分箱时会合并不足,导致 IV 方差极大。我一般建议:先填充缺失再分箱,还是先分箱再处理缺失?答案是「先分箱,再对缺失单独设一档」。因为分箱时缺失值不会干扰正常值的分箱边界,而且后续 WoE 编码可以保留「缺失」这个独特模式。
二、异常值处理
2.1 什么叫「异常」?
异常值没有通用定义,得结合业务看。我记得有个信用卡交易数据集,单笔交易金额 100 万,对普通用户来说是异常,但对企业级客户可能就是正常。所以第一步是分客群。
常用的检测方法有:
- IQR 法: 低于 Q1-1.5×IQR 或高于 Q3+1.5×IQR 的视为异常。简单粗暴,适合快速排查。
- Z-score 法: 偏离均值 3 个标准差以上的视为异常。适合正态分布的数据。
- 业务规则: 比如年龄超过 120 岁,或者收入为负数。这些业务上能直接定义的,优先用。
- 模型法: 孤立森林、LOF 等。一般只对复杂场景才用。
2.2 处理方式:别让异常值「带偏」IV
异常值对 IV 的影响非常大——你想想看,如果某个分箱里混进去一两个极端值,WoE 可能直接从 0.5 跳到 2.0,IV 虚高。所以必须处理。我常用的手段:
| 方式 | 适用场景 | 操作 | 注意 |
|---|---|---|---|
| 截尾(Winsorize) | 连续变量,异常值数量少 | 将异常值替换为 99% 分位值或 1% 分位值 | 不要截太狠,否则会丢失信息 |
| 分箱合并 | 连续变量,异常值区域有业务含义 | 把异常值单独设一个分箱,和正常值一起编码 | 保证异常箱样本量 > 5% 总样本 |
| 单独类别 | 分类变量,异常类别罕见 | 聚合成「其他」类 | 如果罕见类有强预测能力,慎合 |
| 不予处理 | 异常值本身是模型重点(如欺诈) | 保留原值,靠模型自己去学 | IV 可能会被拉偏,需交叉验证 |
2.3 一个真实案例
我前年做某银行的分期贷款评分卡,「月还款额/月收入」这个比率(DTI)有个客户是 8.5,正常值都在 0~2 之间。如果不处理,这个特征 IV 算出来 0.45,看起来非常优秀。但我仔细一查,那 8.5 是因为收入字段填错了(漏了一个小数点)。后来我截尾到 99% 分位值 2.2,IV 回归到 0.12,反而更符合业务直觉。所以你看,异常值处理不能只看统计指标,一定要回去看原始数据。
三、缺失与异常处理的「协同效应」
这两个步骤其实不是独立的。举个例子:你先用均值填充了缺失值,均值本身就被异常值影响,结果填充进来的值也是「带偏的」。所以我建议的顺序是:
- 先做异常值检测,但不要急着处理——只标记出来。
- 再处理缺失值(填充或单独分箱)。
- 最后根据标记截尾异常值。
这样做的好处是:缺失处理阶段不会引入异常污染,异常处理阶段也不会因为缺失值而误判。
好了,这一章的内容就到这里。我觉得处理缺失和异常,有点像做手术前的消毒步骤——看起来麻烦,但漏掉一步,整个模型都可能会感染。希望你能把这些方法记牢,在实际项目中用起来。