机器学习总结---集成学习Boosting----LightGBM

本文部分参考和摘录了以下文章,在此由衷感谢以下作者的分享!
https://zhuanlan.zhihu.com/p/87885678
https://blog.csdn.net/anshuai_aw1/article/details/83275299
LightGBM a highly efficient gradient boosting decision tree
https://zhuanlan.zhihu.com/p/85053333

LightGBM

这个算法比我之前写的那个XGBoost要更加的猛,也是基于GBDT的算法,但是速度要比XGBoost快得多,但是精度缺和XGBoost相差无几。如果还没学习过XGBoost的 机器学习—集成学习boosting----GBDT/XGBoost
传送门了解一下。

这里就介绍一下相较于XGBoost,LightGBM上的改进。

直方图算法

在寻找最优划分点的时候,xgboost采用的是预排序的方法,但是这个方法的复杂度太高了,需要遍历每个样本点来寻找划分点。
而LightGBM采用了histogram,直方图算法。就是将所有的特征变量做统一的分箱,比如特征原本有1000个值,我们可以将他划分到5个箱子里去,这样我们只用遍历四个间隔就可以找到最优分割点了。

lightgbm对于连续值和离散值采取的分箱策略是不同的:
1、连续值分箱
在进行分桶之前我们要先统计特征的不重复值以及每个值对应的次数,比如[1,3,5,3,2,4,5,6,3,6,5,4,3,1,3,2,4],不重复值为distinct_values=[6,5,4,3,2,1]从大到小分,对应的次数为counts=[2,3,3,5,2,2]。

在lightgbm中有一个参数叫,max_bin,默认值为255,这是最大分箱数。

如果distinct_values<max_bin,那么一个数就占一个箱子,但是要注意的是,lightgbm里还有一个参数叫min_data_in_bin,他限制了箱子里的数,默认值是3,也可以自己设置,就是如果箱子里的数少于3个是不能单独分箱的,会和后边一个数放进一个箱子里。划分点为前一个箱子的最大值和后一箱子的最小值的均值,如上面得到的划分点为[-inf,4.5,3.5,2.5,inf],根据这个划分再去计算增益。

如果distinct_values>max_bin
A、定义一个界限,mean_bin_size = #data/max_bin,用来区分“大数”和“小数”,distinct_values里的counts如果大于mean_bin_size定义为大数,小于定义为小数。要注意的是,每次迭代要重新计算这个mean_bin_size
B、当distinct_values被标记为大数的时候,则单独占一个箱子,分界点为前一个箱子的最大值和后一箱子的最小值的均值
C、当distinct_values被标记为小数的时候,进行累计,直到达到大数标准再进行分箱,如果再累计过程中,下一个碰到了大数,那么则对其进行分箱,因为大数要单独占一个箱。

2、离散值分箱
离散分箱要比连续值分箱要简单一些
也是计算distinct_values和count,但是会去掉一些出现很少的类别特征(1%),distinct_values按照出现的次数进行排列(从大到小),每个值建立一个bin
A、如果类别个数较少,用oneVSmany的方法扫描
B、如果类标比较多,挑出有较多取值的bin,实行manyVSmany的策略,按照如下计算公式计算每个bin的值,所有样本的一阶梯度之和 / 该bin容器下所有样本的二阶梯度之和 + 正则项(参数cat_smooth),根据此值从小到大排列,然后分从左到右、从右到左进行搜索,得到最优分裂阈值。但是有一点,没有搜索所有的bin容器,而是设定了一个搜索bin容器数量的上限值,程序中设定是32,即参数max_num_cat。

GOSS 基于梯度的单边采样

这个方法主要是想在训练过程中减少训练样本来提升速度,但是他缺不会让精度下降很多。
主要思想是,在训练过程中,梯度大的样本在就是那增益的时候扮演着主要作用,这些样本点会提供更多的增益,所以可以对样本进行下采样,保留梯度大的样本。也可以理解为如果一个样本的梯度小的话,那么该样本训练误差就小了,这个样本已经经过了比较好的训练了。
但是有一个问题,就是我们一味的丢弃梯度小的特征而保留梯度大的特征,会导致我们的数据分布发生改变,从而降低我们的精度

算法描述:
a、在训练好一个弱分类器,并准备训练下一个弱分类器的时候,计算当前弱分类器的所有样本的梯度,对他们进行降序处理
b、选取前 a100%的数据生成大梯度样本集合
c、对剩下的样本,随机选取b
100%的样本组成小梯度样本集
d、合并两个样本集
e、使用合并好的样本集
f、将小梯度样本乘上权重系数(1-a)/b
g、用上边的样本学习一个新的弱分类器
h、不断重复上面的步骤,知道达到迭代次数或者收敛

EFB 互斥特征捆绑

在这里插入图片描述
不知道谁写的 = =。
GOSS是从样本上入手缩减训练速度,EFB是从特征维度上入手,减少训练时间
主要思想:主要是处理稀疏特征,对特征进行捆绑,以达到减少特征维度提升效率的效果,被捆绑的特征都是互斥的,就是他们不同时取非0值。
冲突率:用来衡量两个特征互斥的程度,冲突率越大,说明两个特征互斥的情况比较少,我们可以选取冲突率比较小的两个特征进行合并。

如何选取特征呢?
1、我们先对特征进行从大到小排序,排序的方法是特征非零的值的个数,可以认为,当特征非零数越多,那么他可能会有更高的冲突率。
2、遍历每个特征,如果他和现有的bundle有比较小的冲突率(设定的冲突率),则放入这个bundle,否则就新建一个bundle

如何将捆绑的特征合并成一个特征?
因为之前我们已经使用了直方图算法进行分箱,EFB算法为了保留特征,将bundle里的特征加上一个偏移常量,让不同的特征的值分不到bundle的不同bin内,比如说特征A的取值范围为[0,10],特征B的取值范围为[0,20],那么,我们可以对B特征加一个偏移常量10,将其范围变为[10,30],这样就完成了AB的捆绑。

Leaf-wise生长策略

与之对比的是xgboost的level-wise,即一次分裂同层的叶子,不加区分的对待每一层的叶子。
Leaf-wise则在所有的子节点上找到分裂增益最大的叶子再进行分裂

常总结,常进步。有什么问题希望大家可以一起讨论一下~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值