第3章 特征工程优化策略:连续变量分箱技巧与缺失值处理
连续变量分箱是将原始数值特征划分为有限个离散区间(箱)的过程,在评分卡、风控和信用评分模型中极为常见。合理分箱能够:
- 处理异常值与噪声:极端值被约束到边界箱内,降低对模型的干扰。
- 捕捉非线性关系:无需引入多项式或核变换,分箱后可直接学习分段线性效应。
- 提升模型稳定性:离散特征对数据分布变化(如时间迁移)更鲁棒。
- 便于业务解释:如“年龄30-40岁”比“年龄32.7岁”更直观。
本章系统介绍三种主流分箱策略(等频、等距、最优分箱),并给出缺失值处理的可靠方案。
3.1 等频分箱(Equal‑Frequency Binning)
原理:将观测值按升序排列,每个箱包含大致相同数量的样本。
实现:通常用分位数确定边界(如每20%一个箱,共5箱)。
示例:Python 中使用
pandas.qcut() 实现等频分箱。import pandas as pd
import numpy as np
# 模拟贷款金额(单位:千元)
np.random.seed(42)
amounts = np.random.exponential(scale=50, size=1000)
df = pd.DataFrame({'loan_amount': amounts})
# 等频分箱:5箱,每箱约200条
df['amount_bin_qcut'], bins = pd.qcut(df['loan_amount'], q=5,
labels=['VeryLow','Low','Medium','High','VeryHigh'],
retbins=True)
print('边界(千元):', bins)
df['amount_bin_qcut'].value_counts().sort_index()
适用场景:数据分布偏态严重时,等频分箱可保证每箱均有足够样本,避免空箱。
风险:可能将相近数值分割到不同箱,破坏排序局部性;需结合业务逻辑微调边界。
3.2 等距分箱(Equal‑Width Binning)
原理:将数值范围均匀划分成宽度相等的区间,每个箱的数值区间长度相同。
实现:直接指定箱数或箱宽。
# 等距分箱:5箱,宽度 = (max-min)/5
bins_width = np.linspace(df['loan_amount'].min(), df['loan_amount'].max(), 6)
df['amount_bin_cut'] = pd.cut(df['loan_amount'], bins=bins_width,
labels=['VeryLow','Low','Medium','High','VeryHigh'])
df['amount_bin_cut'].value_counts().sort_index()
适用场景:数据均匀分布或与目标呈线性关系时,等距分箱结果自然、易解释。
风险:长尾分布下某些箱可能包含极少数样本,导致不稳定;建议与等频分箱结合使用。
3.3 最优分箱(Optimal Binning)
原理:基于目标变量(如违约/未违约)的分布,通过统计检验或决策树分裂准则寻找使组间差异最大化的分割点。常用方法包括:
- 卡方分箱(Chi‑Merge):合并相邻区间直到卡方统计量超过阈值。
- 决策树分箱:用决策树(如CART)对连续特征拟合目标变量,取分裂点作为分箱边界。
- WOE/IV 分箱:以证据权重(Weight of Evidence)和信息量(IV)为目标,手动或自动搜索。
以下使用
optbinning 库(需安装)演示最优分箱:# pip install optbinning
from optbinning import OptimalBinning
optb = OptimalBinning(name='loan_amount', dtype='numerical', solver='cp',
min_bin_size=0.05, max_n_bins=6)
optb.fit(df['loan_amount'], y=labels) # labels 为 0/1 目标变量
binning_table = optb.binning_table.build()
print(binning_table[['Bin', 'Count', 'Count (%)', 'WoE', 'IV']])
优势:自动适应数据分布和目标关系,通常能提升模型区分度;推荐在评分卡建模中优先尝试。
注意:最优分箱对缺失值敏感,需先处理缺失或单独设定缺失箱。
3.4 缺失值处理策略
缺失值在评分场景中频繁出现,直接丢弃可能导致信息损失。推荐以下方案:
| 策略 | 操作 | 适用条件 |
|---|---|---|
| 单独分箱 | 将缺失值作为独立类别(如“Missing”箱),与其他箱并列 | 缺失有业务含义(如客户未提供收入) |
| 统计填充 | 均值/中位数/众数填充后再分箱 | 缺失比例低(<5%)且随机 |
| 模型预测填充 | 用其他特征预测缺失值(如KNN、回归) | 特征间相关性较强 |
| 创建缺失指示器 | 增加“是否缺失”二元特征,原特征用填充值或单独箱 | 希望保留缺失位置信息 |
与分箱的集成:先处理缺失(填充或设为单独类),再对非缺失部分执行分箱。缺失比例高(>10%)时,推荐“单独分箱 + 缺失指示器”组合。
处理缺失的典型流程(以单独分箱为例):
# 1. 将缺失值设为特殊标记
df['feature_missing'] = df['feature'].isna().astype(int)
# 2. 对非缺失部分分箱
non_missing = df.loc[df['feature'].notna(), 'feature']
bins = pd.qcut(non_missing, q=4, labels=['Q1','Q2','Q3','Q4'],
duplicates='drop')
# 3. 合并:非缺失用分箱,缺失用 'Missing'
df['feature_bin'] = 'Missing'
df.loc[df['feature'].notna(), 'feature_bin'] = bins
3.5 分箱与缺失处理整体流程
下图展示了从原始连续特征到最终离散特征的完整策略树,包含分箱方法选择和缺失处理分支。
3.6 分箱策略对比总览
| 方法 | 边界划分依据 | 对异常值敏感 | 与目标变量相关性 | 业务解释性 | 推荐场景 |
|---|---|---|---|---|---|
| 等频分箱 | 样本分位数 | 低 | 弱(仅依据分布) | 高(箱内样本数相同) | 偏态分布、需要稳定样本量 |
| 等距分箱 | 数值区间宽度 | 高 | 弱 | 高(宽度一致) | 均匀分布、线性效应 |
| 最优分箱 | 目标变量分布 | 可控(可设最小箱比例) | 强 | 中等(需结合IV解释) | 评分卡、追求模型区分度 |
3.7 常见性能瓶颈与稳定性提升技巧
- 空箱或稀疏箱:等距分箱在长尾分布下易产生空箱;解决方案:设定
duplicates='drop'或合并尾箱。 - 过拟合风险:最优分箱在数据量小或箱数过多时可能捕捉噪声;建议设置
min_bin_size(如≥5%样本)和max_n_bins(如≤10)。 - 分箱边界漂移:训练集和测试集分布不一致时,等频分箱的边界可能不适用;解决方案:基于训练集确定边界,测试集固定使用相同边界,或使用等距分箱。
- 缺失值影响分箱结果:先填充再分箱可能扭曲分布;优先采用“单独箱 + 缺失指示器”,在模型训练时让模型自行学习缺失权重。
- 计算效率:最优分箱(如Chi‑Merge)在大数据量(>100万行)时耗时久;可先采样或使用决策树分箱替代。
工程实践建议:在评分模型迭代中,先运行等频分箱作为基线(稳定、快速),再用最优分箱微调前几大重要特征,同时配合缺失单独处理,通常能获得显著效果提升。