1、LightGBM算法简介
LightGBM算法是微软亚洲研究院(MSRA)于2017年提出的一种梯度提升算法。该算法在XGBoost算法的基本原理基础上进行了优化。主要是运行效率和支持类别特征的优化。
2、算法的优化
LightGBM算法的基本原理与XGBoost算法相同。
相对于XGBoost算法,其优化主要体现在以下几点:
(1)直方图算法(Histogram算法)
(2)带深度限制的leaf-wise生长策略
(3)支持类别特征
(4)GOSS数据采样
(5)其它优化,如互斥特征捆绑、多线程优化等。
3、算法优化的说明
这里对部分优化点进行说明。
3.1 直方图算法
直方图算法是LightGBM算法的重大改进。
3.1.1 直方图算法过程
在GBDT和XGBoost算法中,需要对样本进行预排序(pre-sorted),然后节点的分裂需要遍历特征的每一个样本取值,计算分裂后目标函数的增益。在这一过程中,样本的预排序和分裂增益的计算需要消费很大的内存资源。直方图算法将连续的特征取值离散化成若干个整数值,将样本按这些值划分成若干bin。遍历数据时,将离散化后的值作为索引在直方图中累计统计量。完成一次数据遍历后,直方图累积了每个bin的统计量。然后,根据bin的分隔点(即前述离散化后的整数值)遍历寻找最优的分割点。
这里用微软亚洲研究院在LightGBM论文中的流程图说明直方图算法的在梯度提升算法中的应用。
以上流程图中,第3个for循环即是统计每个直方图方的统计量。完成各个直方图统计量的计算后,以直方图各个bin的分割点,将直方图分成左右两部分,计算分裂增益。以分裂增益最大的分割点进行分裂。
直方图算法在统计量的计算中,还可以通过直方图作差的方式提升计算效率。如在上述流程图中,节点右边的统计量直接通过父节点的统计量
减去节点左边的统计量
,无需再单独计算。
3.1.2 直方图算法的效率提升
直方图算法在计算效率上有了很大的提升。XGBoost中默认使用pre-sorted,时间复杂度是(#data*features),与样本数量与特征数量的乘积相关。LightGBM算法中,默认使用直方图算法,时间复杂度是(#bins*features),与直方图bin的数量乘以特征数量的乘积相关。
不仅如此,离散化后的得到的整数bins,节约了数据存储空间,数据访问效率也会提升。
3.1.3 直方图算法与精度牺牲
直方图算法将特征离散成整数值后,牺牲了数值的精度,得到的并不是精确的分割点,会对模型结果产生一定的影响。但是,实践表明,这种精度牺牲对模型的结果影响不大,甚至会对模型产生积极的影响。
原因主要有以下几点:
1、决策树本身就是弱模型,对分割点的精度不太敏感;
2、较粗的分割点起到了正则化的效果,避免了模型的过拟合;
3、较粗的分割点即使对单棵树的精度有影响,但在梯度提升框架下对最终模型结果影响不大。
3.2 带深度限制的leaf-wise生长策略
叶子生长策略有按层生长(level-wise)和按叶子生生(leaf-wise)两种。level-wise对同一层所有叶子进行分裂,直至满足分裂条件。leaf-wise在深度限制的条件下从所有叶子中找到分裂增益最大的叶子进行分裂,与叶子所在的层数无关。
level-wise不加区分地对同一层叶子进行分裂,可以充分利用层中的叶子信息,降低模型复杂度。但不加区分地对待同一层中的所有叶子,带来了很大的计算与存储开销。尤其是对于一些分裂增益较低的叶子来说,进一步分裂的必要性很低。
leaf-wise只对所有叶子中分裂增益最大的叶子进行分裂,极大地提升了节约了计算与存储开销。同时,LightGBM增加了对深度进行限制条件,可以限制树的深度,防止过拟合。
3.3 支持类别特征
无论是GBDT算法,还是XGBoost算法都不能直接处理支持类别特征,需要将其one-hot处理。LightGBM算法可以直接使用类别特征,无需再对数据进行预处理。
3.3.1 one-hot处理
one-hot处理在决策树算法在有着不小的弊端,尤其是在特征的类别较多取值的情况下。首先是分裂的收益可能会很低。当类别较多的情况下,每个类别的样本数量可能会比较少,不仅导致类别分裂的增益可能比较小,还会导致额外的运算支出。其次,会影响模型的效果。即便在类别上能够实现分割,由于这些分割上的数据量非常少,导致统计信息的不准确,模型效果也会变差。
3.3.2 LightGBM对分类特征的处理
对于一个维类别特征,若通过朴素的枚举法进行分割,所有可能的分割即为类别的组合数量,其复杂度为
。当
的数值较大时,组合的数量会很大,会对运算效率产生较大影响。为此,LightGBM算法提出了一个类似于直方图算法的巧妙设计。该算法的过程如下:
1、剔除数量非常少的类别,其余按类别划分bin,形成“直方图”;
2、当bin中的样本数量相对较少时(参数max_cat_to_onehot默认为4),采用one vs other的方式寻找最优分割点;
3、当bin中的样本数量相对较多时,首先计算每个bin的以下值:样本的一阶梯度之和 / 样本的二阶梯度之和 + 正则项(参数cat_smooth)。然后根据该值将bin从小到大排序。然后寻找最优分割点。
3.4 基于梯度的单边采样
当数量据量非常大且特征很多的时候,为提升运算效率,可以考虑从样本数量和特征数量上进行处理,选择相对较少的样本和特征进行模型训练。LightGBM算法通过基于梯度的单边采样(Gradient-based One-Side Sampling)来减少样本数量,通过互斥特征捆绑(Exclusive Feature Bundling,EFB)来减少特征数量。
这里介绍基于梯度的单边采样(GOSS)。
GOSS采样的核心思想是通过样本梯度重构样本。相关算法过程如下:
1、输入:样本,迭代次数
,大梯度样本比例
,小梯度样本比例
;
2、模型初始化和参数设定
型初始化;设定小梯度的样本的权重
,大梯度的样本数量
,小梯度样本的数量
3、进行迭代。
在第次迭代时:
(1)根据模型,根据模型对样本进行预测,得到样本预测值。
(2)根据样本值和预测值计算损失,并据此得到梯度值
;样本权重
。
(3)将样本按梯度的绝对值从大到小排序。选择前个样本,其权重仍为1;在剩余样本中随机选择
个样本,并将其权重设置为前述定义的
。二者组成新的样本。
(4)利用新的样本训练,得到新的弱学习器。
(5)将新的弱学习器加入原模型,得到更新的强学习器
。