第 120 篇文章,本文大约 1200 字,阅读大约需要 3 分钟
今天这篇文章主要是介绍在特征工程中,对数值型特征进行分桶操作的方法。
分桶是离散化的常用方法,将连续型特征离线化为一系列 0/1 的离散特征;
当数值特征跨越不同的数量级的时候,模型可能会只对大的特征值敏感,这种情况可以考虑分桶操作。
分桶操作可以看作是对数值变量的离散化,之后通过二值化进行 one-hot 编码。
分桶的数量和宽度可以根据业务领域的经验来指定,但也有一些常规的做法:
分桶的优点:
需要注意的是:
对于等距分桶的操作:
对数变换是处理具有重尾分布的正数的有力工具。(重尾分布在尾部范围内的概率比高斯分布的概率大)。它将分布在高端的长尾压缩成较短的尾部,并将低端扩展成较长的头部。
下面是展示的代码例子:
数值较少的例子:
import numpy as np
# 生成 20 个 0-99 之间的随机整数
small_counts = np.random.randint(0, 100, 20)
# 进行分箱操作, 通过对数据除以 10 分到 0-9 总共 9 个箱里,
# 返回的结果就是对应数据应该划分到的箱的编号
np.floor_divide(small_counts, 10)
数据之间的间隔较大的例子:
# 构造一个间隔更大的数组例子,可以通过取对数 log10 来进行分箱
large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
np.floor(np.log10(large_counts))
对于等频分桶,也称为按分位数分桶,为了计算分位数和映射数据到分位数箱,我们可以使用 Pandas
库。pandas.DataFrame.quantile
和 pandas.Series.quantile
用于计算分位数。pandas.qcut
将数据映射到所需数量的分位数。
代码例子如下:
large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
# 将数据映射到所需数量的分位数
pd.qcut(large_counts, 4, labels=False)
# 计算指定分位数点的数据
large_counts_series = pd.Series(large_counts)
large_counts_series.quantile([0.25, 0.5, 0.75])
参考文章: