在这篇文章中,我将介绍一种数据预处理的技术——分箱,然会将会从概念、步骤、分类、应用场景、注意事项与实际操作等方面去介绍它。
一、概念
分箱(Binning)是一种数据预处理技术,在数据分析和机器学习中经常使用。它的主要目的是将连续型数值变量转换为离散的区间或类别,从而简化数据处理过程,并且有时候可以提高模型的性能。分箱可以应用于各种场景,包括但不限于金融风险评估、市场分析以及客户行为预测等。
实际上,我们就是将一组连续的数值放入到在特征的输入范围内划分成的个数固定的箱子(bin)中去,以此来实现离散化。
二、步骤
在知道概念后,我们来正式明确下分箱的具体步骤:
1.确定区间数量,即明确我们将划分的箱子的个数。至于如何确定它则需要考虑这些因素:数据分布(如果数据分布均匀,则需要较少的箱数量,反之则需要较多的数量)、数据量(当数据较大时,我们需要考虑数据划分后的粒度,否则可能会出现过拟合等问题)、业务需求(比如在金融领域,我们可以根据业务上对于信贷风险评估的划分等级来确定箱子数量)等。此外,还常常会用等宽分箱、等宽分箱以及信息增益与信息熵来确定数量。
通常情况下,我们可以选择4到7个箱子,因为大部分情况下用这个范围内的箱子数量都不会出现划分过细或过粗略等问题;
2.确定区间边界。关于确定区间边界,我们可以考虑使用等宽分箱、等宽分箱、自定义分箱、基于统计量进行分箱等;
3.分配数据点。根据之前确定好的箱子,直接将数据集中的数据点进行分配即可。
三、分类
其实可以说分箱如何分类就是根据上述中如何确定箱子数量与边界而确定的,所以,关于分箱的分类可以分为如下几种:
3.1 基于区间宽度的分箱
等宽分箱:
将数据范围分割成具有相同宽度的区间。这种方法简单直观,但可能不适合数据分布不均匀的情况。
举个例子:
假设有如下年龄数据(单位:岁): 23,28,31,35,38,42,45,47,50,52,55,58,60,62,65,68,70,72,75,78。
然后我们欲将之分为5个箱子来放之。
所以我们先找到最大值与最小值,分别为78与23。那么我们就可的区间宽度为:,所以关于边界的问题也可以得到答案:
第一个区间:[23, 34)
第二个区间:[34, 45)
第三个区间:[45, 56)
第四个区间:[56, 67)
第五个区间:[67, 78]
3.2 基于数据频率的分箱
等频分箱:
将数据分割成包含相同数量数据点的区间。这种方法能够较好地处理数据分布不均匀的情况。
同样举个例子:
问题不变,还是那些数据与5个箱子,但这时我们要做的第一件事不同,不是找最值而是前去进行一个排序,然后可以得到:23,28,31,35,38,42,45,47,50,52,55,58,60,62,65,68,70,72,75,78
一共有20个数据点,要分5个箱子,则每个箱子包含的数据点为:。
那么关于边界的划分同样明确了:
第一个区间:前 4 个数据点
第二个区间:第 5 到第 8 个数据点
第三个区间:第 9 到第 12 个数据点
第四个区间:第 13 到第 16 个数据点
第五个区间:最后 4 个数据点
3.3 基于统计量的分箱
百分位数分箱:
根据数据的百分位数来划分区间。
四分位数分箱:
将数据分为四个部分,分别对应四分之一、二分之一、四分之三和全部数据。
举个例子:
假设有如下年龄数据(单位:岁): 23,28,31,35,38,42,45,47,50,52,55,58,60,62,65,68,70,72,75,78。
我们去找这组数据的四分位位置是哪个数,如此往后而可进行分箱,即:
对于给定的数据集(因为已排序,所以不必重复排序操作,如果数据集在开始时是乱的则还需要排序),我们首先计算四分位数:
最小值(Min):23
第一四分位数(Q1):第 25% 的位置,即第 5 个数据点(38)
中位数(Q2):第 50% 的位置,即第 10 个数据点(52)
第三四分位数(Q3):第 75% 的位置,即第 15 个数据点(65)
最大值(Max):78
所以,根据四分位数,我们可以确定以下区间边界:
第一个区间:[Min, Q1) 即 [23, 38)
第二个区间:[Q1, Q2) 即 [38, 52)
第三个区间:[Q2, Q3) 即 [52, 65)
第四个区间:[Q3, Max] 即 [65, 78]
3.4 自定义分箱
根据某些业务需求,就像之前说的金融信贷问题去分箱等。在此不赘述。
3.5 组合分箱
我们还可以将上述的情况在某些特定情况下组合使用。
四、应用场景
异常值处理:通过分箱可以将异常值的影响降到最低。
模式识别:在某些情况下,分箱可以帮助发现数据中的模式。
模型构建:分箱后的数据更容易用于分类算法,尤其是在处理非线性关系或者与连续变量相关的复杂关系时。
五、注意事项
我们在分箱的过程中是很容易出现过度分箱和分箱不足的情况的,这样就会导致信息丢失与细节的不足,所以需要我们及时发现与修正。
此外,在划分边界上,我们需要考虑那些在边界上的点以确保数据的准确性。
六、python实践
import pandas as pd
# 创建数据
data = {
'Age': [23, 28, 31, 35, 38, 42, 45, 47, 50, 52, 55, 58, 60, 62, 65, 68, 70, 72, 75, 78]
}
# 创建 DataFrame
df = pd.DataFrame(data)
print(df)
# 等宽分箱
# 设定区间数量
num_bins = 5
# 计算每个区间的宽度
width = (df['Age'].max() - df['Age'].min()) / num_bins
# 使用 Pandas 的 cut 函数进行分箱
df['Age_Bins'] = pd.cut(df['Age'], bins=num_bins, right=False)
# 显示结果
print("Equal-Width Binning:")
print(df)
# 等频分箱
# 设定区间数量
num_bins = 5
# 使用 Pandas 的 qcut 函数进行分箱
df['Age_Bins'] = pd.qcut(df['Age'], q=num_bins, duplicates='drop')
# 显示结果
print("Equal-Frequency Binning:")
print(df)
输出为:
Age
0 23
1 28
2 31
3 35
4 38
5 42
6 45
7 47
8 50
9 52
10 55
11 58
12 60
13 62
14 65
15 68
16 70
17 72
18 75
19 78
Equal-Width Binning:
Age Age_Bins
0 23 [23.0, 34.0)
1 28 [23.0, 34.0)
2 31 [23.0, 34.0)
3 35 [34.0, 45.0)
4 38 [34.0, 45.0)
5 42 [34.0, 45.0)
6 45 [45.0, 56.0)
7 47 [45.0, 56.0)
8 50 [45.0, 56.0)
9 52 [45.0, 56.0)
10 55 [45.0, 56.0)
11 58 [56.0, 67.0)
12 60 [56.0, 67.0)
13 62 [56.0, 67.0)
14 65 [56.0, 67.0)
15 68 [67.0, 78.055)
16 70 [67.0, 78.055)
17 72 [67.0, 78.055)
18 75 [67.0, 78.055)
19 78 [67.0, 78.055)
Equal-Frequency Binning:
Age Age_Bins
0 23 (22.999, 37.4]
1 28 (22.999, 37.4]
2 31 (22.999, 37.4]
3 35 (22.999, 37.4]
4 38 (37.4, 48.8]
5 42 (37.4, 48.8]
6 45 (37.4, 48.8]
7 47 (37.4, 48.8]
8 50 (48.8, 58.8]
9 52 (48.8, 58.8]
10 55 (48.8, 58.8]
11 58 (48.8, 58.8]
12 60 (58.8, 68.4]
13 62 (58.8, 68.4]
14 65 (58.8, 68.4]
15 68 (58.8, 68.4]
16 70 (68.4, 78.0]
17 72 (68.4, 78.0]
18 75 (68.4, 78.0]
19 78 (68.4, 78.0]