数据分箱的含义就是把连续数据按照特定规则分组,进行离散化,例如年龄这一个特征,可以将年龄分箱为18-30青年,31-50中年,50岁以上老年等三类。

把数据进行分箱处理后,数据会变得更加稳定,之前取值范围不定的数据经过分箱后,变成了取值固定的数据。这样经过分箱后,特征包容异常值的能力增强,特征出现模型无法处理值的可能性也就降低了很多。举例来说,如果突然出现了一个1000岁的人在年龄这个特征中的话,如果没分箱,模型就炸了;但分箱后,只会把它放到“50岁以上”这个分类中,不会对模型有影响。所以模型的稳定性与鲁棒性也就提高了。

同时,在实际的建模过程中,常有一些连续型变量对结果的影响效果非常大,比如客户的资产极大的影响了客户在未来是否会对产品进行购买。这时候,这种特征会影响其他特征的表现,让模型无法将注意力放在其他特征中。因此,通过分箱,可以使特征提供的信息变得模糊,这样特征的精准度降低,模型的泛化能力增强,过拟合可能性也随之降低。

除了上面这两个比较大的好处,分箱另一个优势是会加快模型的训练速度,对数据进行离散化后,模型的复杂性降低了,计算速度会比之前快,并能够加快模型的训练速度。所以对使用数据集规模大、对模型运行效率或响应速度有要求的以及需要部署上线的模型比较合适。

此外,分箱的实际操作中,一般会将空值、缺失值单独处理,将他们在分箱操作时作为一个特殊类别存在,这样既能很好的处理空值,又能保证其存在被模型训练考虑在内。

最后,特别说一下,分箱的过程在很多分类问题上都会进行,但应用最广泛的是逻辑回归算法。这是因为在逻辑回归模型中,这主要是因为逻辑回归属于广义线性模型,它与树模型的建模原理本质是不同的。

在实际的应用中我们会尝试多种分箱方法,然后测试哪种分箱方法最好。

连续型数据分箱有两类:有监督和无监督分箱
(1)无监督分箱:不需要提供Y,仅凭借特征就能实现分箱,一般有等宽分箱,等频分箱等方法
(2)有监督分箱:需要结合Y的值,通过算法实现分箱,有决策树分箱,卡方分箱等方法。

无监督分箱

等频分箱
等频法属于自动分箱,每个箱内的样本数量是相同的,假设有10000个样本,设置频数为100,则按照数值排序后,就会分成100个箱子。

#python实现等频分箱
import pandas as pd
import numpy as np
sales = pd.Series(np.random.randint(100,size=10000))
pd.qcut(sales,q=100,duplicates="drop")

等宽分箱
划分的间距是相同的。例如对于年龄每10岁进行分箱,则从0到100可以分为10个箱子

#python实现等宽分箱
print(pd.cut(sales,20))

自定义分箱
通常在业务中,会根据经验,对分箱规则做出定义。这里的经验既可以是专业人员的多年经验,也可以是在前期的数据探索性分析中得出的结论。自定义法在python中的实现如下所示。

sales = pd.Series(np.random.randint(100,size=10000))
pd.cut(sales,[0,3,6,18,50,60,100])

聚类分箱
利用聚类的方法将相似的数据聚类在一起,从而确定对应的范围和划分。这类方法需要用到机器学习中的聚类,暂时不展开

有监督分箱

split分箱
该分箱方法与决策树划分节点相类似,切分点的选择标准为熵,gini指数,IV值。该分箱方法采用二分法,每一次以熵/gini指数/IV值选择一个节点进行两个part的划分。直到划分出设定的箱子数目或者设定的最小熵/gini指数/IV值。
在这里插入图片描述

merge分箱
该分箱方法与split不同,split是自顶向下,merge是自底向上。可以理解为层次聚类。如卡方分箱(Chi-Square Binning),其步骤是将连续变量按照某种方式分成若干组,然后对于每两组计算卡方值,卡方值越大表示两组之间差异越大,分组效果越好。最终,得到的每组之间的卡方值可以作为离散化的依据,将相似度高的变量放在同一组中。在这里插入图片描述

Python实现卡方分箱代码如下:

import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
# 生成一些示例数据
data = pd.DataFrame({'value': np.random.normal(0, 1, 100)})
# 卡方分箱
n_bins = 5
group = pd.qcut(data['value'], n_bins, labels=False)
for i in range(n_bins-1):
while True:
if len(np.unique(group)) <= 2:
break
freq_table = pd.crosstab(group, columns=data['value'])
chi2, p, dof, expected = chi2_contingency(freq_table)
if chi2 <= chi2_critical:
break
else:
idx = np.argmin(expected.sum(axis=1))
group[group == idx] = np.unique(group)[-2]
data['bin'] = group

决策树分箱
使用决策树模型来进行分箱。决策树模型类似于做决策的过程,根据模型可以计算出较好的划分变量和划分标准,从而可以来进行分箱。

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐