等距分箱:原理与实现步骤
等距分箱(Equal-Width Binning)是最直观的连续变量离散化方法。它将变量的取值范围划分为 宽度完全相等 的 k 个区间,每个区间内的样本被赋予相同的类别标签或数值代表。该方法不依赖数据分布形态,仅基于数值的极差进行均匀切割。
核心原理
设变量 x 的最小值为 min,最大值为 max,计划分为 k 个箱,则每个箱的宽度 w 为:
w = (max - min) / k
第 i 个箱的区间范围为:
[min + (i-1)*w, min + i*w) (i = 1, 2, ..., k)
最后一个箱通常包含右端点 max,形成闭区间。
实现步骤
- 计算极差:确定变量的最小值 min 和最大值 max。
- 设定箱数:根据业务需求或经验规则(如 Sturges 规则、平方根规则)确定 k 值。
- 计算箱宽:w = (max - min) / k。
- 划分边界:生成 k+1 个分割点:min, min+w, min+2w, ..., max。
- 分配样本:将每个样本值映射到对应的箱区间,通常使用
floor((x - min) / w)计算箱索引。 - 编码输出:将箱索引作为新的离散特征,或使用箱均值/中位数进行平滑。
代码示例(Python / Pandas):
import pandas as pd
import numpy as np
def equal_width_bin(series, k):
min_val = series.min()
max_val = series.max()
width = (max_val - min_val) / k
bins = [min_val + i * width for i in range(k + 1)]
# 使用 pd.cut 进行等距分箱
labels = [f'Bin_{i+1}' for i in range(k)]
binned = pd.cut(series, bins=bins, labels=labels, include_lowest=True)
return binned, bins
适用场景:均匀分布数据
等距分箱在以下场景中表现最佳:
- 数据近似均匀分布:当变量值在 [min, max] 区间内大致均匀分布时,每个箱内的样本数量接近,分箱效果稳定。
- 线性关系建模:若目标变量与原始变量呈近似线性关系,等距分箱能保留这种线性趋势。
- 快速原型验证:在探索性数据分析(EDA)阶段,等距分箱计算简单,适合快速生成离散特征进行初步建模。
- 标准化评分卡:在信用评分等场景中,等距分箱便于解释,每个箱的分数贡献与区间宽度成正比。
经验规则: 对于样本量较大的均匀分布数据,箱数 k 通常取 5~20 之间。可使用 k = √n(n 为样本量)作为初始参考值。
优缺点分析
| 维度 | 说明 |
|---|---|
| 优点 |
|
| 缺点 |
|
避坑提示: 当数据存在明显异常值时,切勿直接使用等距分箱。应先进行截尾处理(如 Winsorization)或改用等频分箱/分位数分箱。异常值会导致箱宽被拉大,使正常数据集中在 1~2 个箱内,完全丧失区分能力。
等距分箱 vs 等频分箱
| 对比维度 | 等距分箱 | 等频分箱 |
|---|---|---|
| 箱宽 | 固定相等 | 不固定 |
| 箱内样本数 | 不固定(依赖分布) | 近似相等 |
| 异常值影响 | 严重 | 较小 |
| 适用分布 | 均匀分布 | 任意分布 |
| 计算复杂度 | O(n) | O(n log n)(需排序) |
| 可解释性 | 高(区间直观) | 中(区间边界为分位数) |
等距分箱流程示意图
异常值影响示例
假设某变量正常取值范围为 [0, 100],分为 5 箱,正常箱宽为 20。若出现一个异常值 1000:
- 新箱宽 = (1000 - 0) / 5 = 200
- 箱区间变为:[0,200), [200,400), [400,600), [600,800), [800,1000]
- 正常数据 0~100 全部落入第 1 箱,其余 4 箱几乎为空
- 分箱完全失去区分能力
解决方案:
- 截尾处理:将变量上下 1% 或 5% 的极端值替换为对应分位数。
- 对数变换:对长尾分布数据先取对数,再进行等距分箱。
- 混合策略:主体使用等距分箱,对尾部异常值单独设箱(如“>99%分位数”)。