LightGBM的基本原理以及使用

LightGBM的基本原理

LightGBM是一款常用的GBDT工具包,由微软亚研院开发,速度比XGBoost快,精度稍低 。他的设计理念是:1.单个机器在不牺牲速度的情况下,尽可能使用上更多的数据。2.多机并行的时候,通信的代价尽可能的低,并且在计算上可以做到线性加速。
所以其使用分布式的GBDT,选择了基于直方图的决策树算法
在这里插入图片描述
直方图算法把连续的浮点特征值离散化为k个整数(也就是分桶bins的思想),比如[0,0.1)->0,[0.1,0.3)->1。并根据特征所在的bin对其进行梯度累加和个数统计,然后根据直方图,寻找最优的切分点。
在这里插入图片描述
直方图算法的优点:
1)减少内存占用
2)缓存命中率提高,直方图中梯度存放是连续的
3)计算效率提高,相对于XGBoost中预排序每个特征都要遍历数据,复杂度为O(#feature*#data),而直方图算法只需要遍历每个特征的直方图即可,复杂度为O(#feature*#bins)
4)在进行数据并行时,可大幅降低通信代价

单边梯度法

单边梯度抽样算法(Gradient-based One-Side Sampling)是从减少样本的角度出发, 排除大部分权重小的样本,仅用剩下的样本计算信息增益,它是一种在减少数据和保证精度上平衡的算法。
GOSS在进行数据采样的时候只保留了梯度较大的数据,但为了避免丢弃梯度小的数据而带来样本分布的改变,在计算增益时为梯度小的样本引入一个常数进行平衡。GOSS算法首先将要进行分裂的特征的所有取值按照绝对值大小降序排序,选取绝对值最大的 a%个数据。然后在剩下的较小梯度数据中随机选择b%个数据。接着将这 b 个数据乘以一个常数 1 − a b \frac{1−a}{b} b1a
,这样算法就会更关注训练不足的样本,而不会过多改变原数据集的分布。最后使用这( a + b ) % 个数据来计算信息增益。

特征互斥算法

高维度的数据往往是稀疏的,这种稀疏性启发我们设计一种无损的方法来减少特征的维度。通常被捆绑的特征都是互斥的(即特征不会同时为非零值,像one-hot),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,我们可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。EFB算法就是通过捆绑特征来降低特征的维度。未使用EFB算法的时间复杂度为

LightGBM的优缺点汇总

速度更快
1)LightGBM采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度
2)LightGBM在训练过程中采用单边梯度的算法过滤梯度小的样本,减少了大量的计算
3)LightGBM采用了基于Leaf-wise算法的增长策略构建树,减少了很多不必要的计算量
4)LightGBM采用优化后的特征并行、数据并行的方法加速计算,当数据量非常大的时候还可以采用投票并行的方法
5)LightGBM对缓存也进行了优化,增加了缓存的命中率
6)直接支持标签类变量
内存更小
1)LightGBM采用了直方图算法将存储特征值转变为存储bin值,且不需要特征值到样本的索引,降低了内存消耗
2)LightGBM在训练过程中采用了互斥特征捆绑算法减少了特征数量,降低了内存消耗
缺点
1)可能会长出比较深的决策树,产生过拟合。因此LightGBM在leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合
2)和所有Boosting算法一样通过增加方差来减小偏差

LightGBM的调参

和XGBOOST类似,LightGBM也有以下几类参数
XGBOOST的参数一般分为三类:

通用参数:控制宏观函数的调用
Booster参数:控制每一个booster生成的参数。booster参数一般可以调控模型的效果和计算代价。所以我们说的调参,很大程度上就是调整booster参数
学习目标参数:控制训练目标的表现。我们对于问题的划分主要体现在学习目标参数上。比如我们要做回归还是分类,主要体现在目标函数上面。
通用参数:
boosting_type:gbdt(默认):传统gbdt模型,dart: Multiple Additive Regression Trees,goss:Gradient-based One-Side Sampling. rf: Random Forest
n_jobs:默认全部核心-1,也可以自己设置核心数量
booster参数:
n_estimators: 基学习器数量默认10
learning_rate: 学习率,默认0.1
num_leaves :最大叶子节点树,它的数量应该小鱼2^(max_depth)
max_bin: 存储feature最大bin的数量,默认255
subsample_for_bin:用来构建直方图数据的样本数量
min_split_gain:最小切分的信息增益值,默认0
min_child_weight:决定最小叶子节点样本权重和(hessian)的最小阈值,若是基学习器切分后得到的叶节点中样本权重和低于该阈值则不会进一步切分,在线性模型中该阈值就对应每个节点的最小样本数。当它的值较大时,可以避免模型学习到局部的特殊样本,防止模型过拟合。但如果这个值过高,又会导致欠拟合,默认0.001
min_child_samples:默认20,叶子节点中最小的样本数量
subsample:样本抽样,默认1
subsample_freq:样本抽样的频率,默认1,也就时每个基学习器都会执行subsample,但也可以设置成n,表示每n个基学习器都会执行bagging
colsample_bytree:特征抽样比率,默认1
reg_alpha:L1正则系数
reg_lambda:L2正则系数
学习目标参数
objective:regression(默认)针对回归树,binary或者multiclass针对分类树,lambdarank正对排序器

首先对n_estimators以及learning_rate进行网格化搜索,发现当n_estimators达到50之后auc就没有明显提升了,learning_rate取0.1即可
在这里插入图片描述
对抽样类的参数进行调整,发现其实影响不大,取subsample=0.7,colsample_bytree=0.6
在这里插入图片描述
调整剪枝参数对于效果的影响不大,这里默认max_depth=10,min_child_samples=20
在这里插入图片描述
调整分箱函数max_bin,subsample_for_bin,我们发现max_bin超过50之后效果就不明显了,所以取max_bin=50,subsample_for_bin取默认
在这里插入图片描述
加入L2正则项,发现当reg_lambda=0.1的时候方差最小,所以取0.1
[mean: 0.87971, std: 0.00091, params: {‘reg_lambda’: 0.001},
mean: 0.87970, std: 0.00083, params: {‘reg_lambda’: 0.01},
mean: 0.87968, std: 0.00064, params: {‘reg_lambda’: 0.1},
mean: 0.87968, std: 0.00095, params: {‘reg_lambda’: 1}]

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐