LightGBM 特征分箱

正午 2021-03-28 PM 636℃ 0条

LightGBM 采用基于直方图的算法,所有的特征都会先分箱。可以让训练更快,使用更少内存。特征分箱本是特征预处理的常用方式,可以减少异常样本的影响,对于线性模型还会带来非线性的能力。分箱的方法有很多,用领域知识或者等距,等频这些静态方法。

LightGBM 的实现提供了很多参数来控制分箱的策略,为了效率,会从训练数据中采样一定数量的样本,这个数量通过参数 bin_construct_sample_cnt 控制,默认是 200000 。为了防止过拟合,可以定义通过min_data_in_bin限制每个箱子的最小样本数量,或者定义每个特征最大箱子数max_bin ,这个参数是对每个特征有效,这样可能会有不合理的情况,max_bin_by_feature 可以定义每个特征的最大分箱数量。或者直接自定义分箱结果 forcedbins_filename

在分箱之前,会统计特征中每个值出现的次数

类别特征

类别特征需要先对取值按出现的次数排序。
类别特征的分箱方法相对简单,每个类别本身作为一个 bin , LightGBM 在细节处做了些处理

  1. 最大 bin 数不能大于 max_bin
  2. 会舍弃调一些样本很少的类别
    按特征取值的出现次数从大到小遍历,每一个值作为一个箱,如果箱的数量到达 max_bin 或 已经覆盖的样本数占总样本的 0.99 就停止。这个 0.99 是直接写死代码里的。

连续特征

连续特征相对复杂,在统计完各个值出现的次数后,按特征取值的大小排序。
通过 kZeroThreshold = 1e-35f 把特征分为三部分

Screenshot from 2021-03-28 22-28-12.png

然后分别对左右两边使用 GreedyFindBin 方法进行划分。
GreedyFindBin 的实现分两种情况。

  1. 如果当前的取值个数比 max_bin 少,就合并相临取值让其满足 min_data_in_bin 的限制即可
  2. 取值个数比 max_bin 多。
  1. 根据 max_bin 和 剩下的样本数计算每个 bin 里的平均样本数 mean_bin_size
    循环所有取值:

    1. 如果当前取值的个数比 mean_bin_size 大,就直接产生一个新的 bin ,调整生效的 bin 的个数和样本数,重新计算mean_bin_size
    2. 如果当前取值的个数比 mean_bin_size小则继续累计,知道这个累计大于 mean_bin_size 就创建一个新的bin,重新调整 mean_bin_size

代码中有很多细节需要处理,比如空值的处理,如果划分左右两边的 bin 的数量等等。

标签: none

非特殊说明,本博所有文章均为博主原创。

上一篇 编程语言的学习
下一篇 没有了

评论