JoshWindsor 发表于 2022-6-24 11:53

LightGBM模型及调参整理

一、模型简介



LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。
lightgbm是xgboost的加强升级版.
LightGBM=XGBoost+Histogram+GOSS+EFB
其中,Histogram算法是直方图算法,作用:减少后选分类点的算法
GOSS是基于梯度的单边采样算法,作用减少样本数量
EFB算法是互斥特征捆绑算法,作用是减少特征数量
基于以上三个算法,LightGBM生产一片叶子需要的复杂度大大降低了,从而极大节约了计算时间。同时Histogram算法还将特征浮点数转换成0~255位的整数进行存储,从而极大节约了内存存储空间。
(1)基于leaf-wise的决策树的生长策略

对于大部分决策树算法使用的试level-wise生长策略,即同一层的叶子节点每次都一起分裂,但是实际上一些叶子节点的分裂增益较低,这样分裂会增加不小的开销。lightGBM使用的leaf-wise策略,每次在当前的叶子节点中,找出分裂增益最大的叶子节点进行分裂,而不是所有节点都进行分裂,这样可以提高精度。
(2)直方图算法

简答来说,就是先对特征值进行装箱处理,把连续的浮点特征值离散化成k个整数,形成一个一个的箱体,同时构造一个宽度为k的直方图,在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计值(因此这里试频数直方图),当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
对于连续的特征来说,装箱处理时特征工程中的离散化:如[0,10)区间的值都可以幅值为0,[10,20)区间的值都可以赋值为1等,这样就可以把众多的数据值划分为到有限的分箱中,在LightGBM中默认分箱数(bins)为256。对于分类的特征来说,则是每一种取值放入一个分箱中,且当取值的个数大于最大分箱数是,会忽略哪些很少出现的分类值。
(3)GOSS算法

单边梯度采样GOSS算法是通过对样本采样的方法来减少计算目标函数增益时候的复杂度。
在GOSS算法中,梯度更大的样本点在计算信息增益的时候占有更重要的作用,当我们对样本进行下采样的时候,保留这些体大较大的样本点,并随机取掉梯度小的样本。
首先把样本按照梯度排序,选出梯度最大的a%个样本,然后在剩下的小梯度样本数据中随机选取b%个样本,在计算信息增益的时候,将选出来的b%小梯度样本的信息增益扩大1-a/b的倍数。
(如果一个样本的梯度很小,证明该样本拟合较好,所以不需要再计算新的增益了。但是如果全部舍去梯度小的样本,那么精度就会下降,所以随机去掉梯度小的样本。)
(4)EFB算法:

互斥特征绑定算法,即将互斥特征绑定在一起以减少特征维度;EFB算法可以有效减少用于构建直方图的特征数量,从而降低计算复杂度,尤其是特征中包含大量稀疏特征的时候。LightGBM可以直接将每个类别取值和一个bin关联,从而自动处理它们,而无需预处理成onehot编码。
(5)并行学习

LightGBM支持特征并行和数据并行两种。传统的特征并行主要思想是在并行化决策树中寻找最佳切分点,在数据量大时难以加速,同时需要切分结果进行通信整合。LightGBM则是使用分散规则,它将直方图合并的任务分给不同的机器,降低通信和计算的开销,并利用直方图加速训练,进一步减少开销。
(6)支持类别特征

传统的机器学习一般不能支持直接输入类别特征,需要先转化成多维的0-1特征,这样无论在空间上还是时间上效率都不高。LightGBM通过更改决策树算法的决策规则,直接原生支持类别特征,不需要转化,提高了近8倍的速度。
(7)支持并行学习

LightGBM原生支持并行学习,目前支持特征并行(Featrue Parallelization)和数据并行(Data Parallelization)两种,还有一种是基于投票的数据并行(Voting Parallelization)。
特征并行的主要思想是在不同机器、在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
LightGBM针对这两种并行方法都做了优化。
(8)支持增量学习

每次读取文件的一部分,用于训练模型,并保存模型的训练结果;然后读取文件的另一部分,再对模型进行更新训练;迭代读取全部数据完毕,最终完成整个文件数据的训练过程。

二、LightGBM与XGBoost的区别

(1)XGBOOST的缺点

在LightGBM提出之前,最有名的GBDT工具就是XGBoost了,它是基于预排序方法的决策树算法。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用O(\#data)O(#data)的代价找到一个特征上的最好分割点。最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。
这样的预排序算法的优点是能精确地找到分割点。但是缺点也很明显:首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如,为了后续快速的计算分割点,保存了排序后的索引),这就需要消耗训练数据两倍的内存。其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。最后,对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
(2)LIGHTGBM的优化

为了避免上述XGBoost的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上进行了如下优化:

[*]基于Histogram的决策树算法。
[*]单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
[*]互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
[*]带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
[*]直接支持类别特征(Categorical Feature)
[*]支持高效并行
[*]Cache命中率优化
三、模型调参整理

(1)首先选择较高的学习率,大概0.1附近,这样是为了加快收敛的速度。这对于调参是很有必要的。


[*]不管怎么样,我们先把学习率先定一个较高的值,这里取 learning_rate = 0.1;
[*]其次确定估计器boosting/boost/boosting_type的类型,不过默认都会选gbdt;
[*]为了确定估计器的数目(boosting迭代的次数),也可以说是残差树的数目,参数名为n_estimators/num_iterations/num_round/num_boost_round。我们可以先将该参数设成一个较大的数,然后在cv结果中查看最优的迭代次数。
(2)对决策树基本参数调参,这是提高精确度的最重要的参数。


[*]max_depth :设置树深度,深度越大可能过拟合
[*]num_leaves:因为 LightGBM 使用的是 leaf-wise 的算法,因此在调节树的复杂程度时,使用的是 num_leaves 而不是 max_depth。大致换算关系:num_leaves = 2^(max_depth),但是它的值的设置应该小于 2^(max_depth),否则可能会导致过拟合。
我们也可以同时调节这两个参数,对于这两个参数调优,我们先粗调,再细调:
这里我们引入sklearn里的GridSearchCV()函数进行搜索。这个函数特别耗内存,特别耗时间,特别耗精力。
(3)正则化参数调参,到这里,就该降低过拟合了。


[*]min_data_in_leaf 是一个很重要的参数, 也叫min_child_samples,它的值取决于训练数据的样本个数和num_leaves. 将其设置的较大可以避免生成一个过深的树, 但有可能导致欠拟合。
[*]min_sum_hessian_in_leaf:也叫min_child_weight,使一个结点分裂的最小海森值之和(Minimum sum of hessians in one leaf to allow a split. Higher values potentially decrease overfitting)
[*]feature_fraction参数来进行特征的子抽样。这个参数可以用来防止过拟合及提高训练速度。
[*]bagging_fraction+bagging_freq参数必须同时设置,bagging_fraction相当于subsample样本采样,可以使bagging更快的运行,同时也可以降拟合。bagging_freq默认0,表示bagging的频率,0意味着没有使用bagging,k意味着每k轮迭代进行一次bagging。
[*]正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda),毫无疑问,是降低过拟合的,两者分别对应l1正则化和l2正则化。我们也来尝试一下使用这两个参数。
(4)最后降低学习率,这里是为了最后提高准确率

之前使用较高的学习速率是因为可以让收敛更快,但是准确度肯定没有细水长流来的好。最后,我们使用较低的学习速率,以及使用更多的决策树n_estimators来训练数据,代入之前优化好的参数。
LightGBM的优点

这部分主要总结下 LightGBM 相对于 XGBoost 的优点,从内存和速度两方面进行介绍。
(1)速度更快


[*]LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;
[*]LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
[*]LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
[*]LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;
[*]LightGBM 对缓存也进行了优化,增加了缓存命中率;
(2)内存更小


[*]XGBoost使用预排序后需要记录特征值及其对应样本的统计值的索引,而 LightGBM 使用了直方图算法将特征值转变为 bin 值,且不需要记录特征到样本的索引,将空间复杂度从 O(2*\#data)O(2#data) 降低为 O(\#bin)O(#bin) ,极大的减少了内存消耗;
[*]LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,降低了内存消耗;
[*]LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
四、LightGBM的缺点


[*]可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合;
[*]Boosting族是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,模型的偏差(bias)会不断降低。由于LightGBM是基于偏差的算法,所以会对噪点较为敏感;
[*]在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去;
<hr/>部分转载整理自:

[*]lightGBM参数解析及其参数调优_LS_learner的博客-CSDN博客_lightgbm参数详解
[*]https://www.freesion.com/article/9219250658/
页: [1]
查看完整版本: LightGBM模型及调参整理