特征分箱的目的:
从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
数据分桶的对象:
将连续变量离散化
将多状态的离散变量合并成少状态
分箱的原因:
数据的特征内的值跨度可能比较大,对有监督和无监督中如k-均值聚类它使用欧氏距离作为相似度函数来测量数据点之间的相似度。都会造成大吃小的影响,其中一种解决方法是对计数值进行区间量化即数据分桶也叫做数据分箱,然后使用量化后的结果。
分箱的优点:
处理缺失值:当数据源可能存在缺失值,此时可以把null单独作为一个分箱。
处理异常值:当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。例如,age若出现200这种异常值,可分入“age > 60”这个分箱里,排除影响。
业务解释性:我们习惯于线性判断变量的作用,当x越来越大,y就越来越大。但实际x与y之间经常存在着非线性关系,此时可经过WOE变换。
特别要注意一下分箱的基本原则:
(1)最小分箱占比不低于5%
(2)箱内不能全部是好客户
(3)连续箱单调
以下是对各种数据分桶方法的详细介绍及相应的 Python 代码示例:
一、等宽分箱(Equal Width Binning)
-
原理:
- 将数据的取值范围划分为若干个等宽的区间。
-
步骤:
- 确定数据的取值范围。
- 计算区间宽度。
- 将数据分配到各个区间中。
-
Python 代码示例:
import pandas as pd
data = [22, 25, 30, 35, 40, 45, 50, 55, 60, 65]
df = pd.DataFrame(data, columns=['value'])
# 假设分为 3 个等宽区间
bins = range(20, 70, 15)
labels = ['20-34', '35-49', '50-64']
df['equal_width_binned'] = pd.cut(df['value'], bins=bins, labels=labels)
print(df)
二、等频分箱(Equal Frequency Binning)
-
原理:
- 将数据分成若干个区间,使得每个区间中的数据数量大致相等。
-
步骤:
- 对数据进行排序。
- 根据要划分的区间数量,确定每个区间应包含的数据数量。
- 将数据分配到各个区间中。
-
Python 代码示例:
data = [22, 25, 30, 35, 40, 45, 50, 55, 60, 65]
df = pd.DataFrame(data, columns=['value'])
# 假设分为 3 个等频区间
quantiles = pd.qcut(df['value'], q=3, labels=['low', 'medium',