LightGBM提出的主要缘由是为了解决GBDT在海量数据遇到的问题,让GBDT能够更好更快地用于工业实践。html
XGboost的不足之处主要有:python
每轮迭代时,都须要遍历整个训练数据屡次。若是把整个训练数据装进内存则会限制训练数据的大小;若是不装进内存,反复地读写训练数据又会消耗很是大的时间。算法
优势:能够找到精确的划分条件apache
缺点:数组
首先,空间消耗大。这样的算法须要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里须要消耗训练数据两倍的内存。其次时间上也有较大的开销,在遍历每个分割点的时候,都须要进行分裂增益的计算,消耗的代价大。安全
优势:多线程
缺点:效率低下,可能产生没必要要的叶结点机器学习
生成决策树是level-wise级别的,也就是预先设置好树的深度以后,每一颗树都须要生长到设置的那个深度,这样有些树在某一次分裂以后效果甚至没有提高但仍然会继续划分树枝,而后再次划分....以后就是无用功了,耗时。ide
在预排序后,特征对梯度的访问是一种随机访问,而且不一样的特征访问的顺序不同,没法对cache进行优化。同时,在每一层长树的时候,须要随机访问一个行索引到叶子索引的数组,而且不一样特征访问的顺序也不同,也会形成较大的cache miss。函数
思想:将连续的浮点特征离散成k个离散值,具体过程是首先肯定对于每个特征须要多少的桶bin,而后均分,将属于该桶的样本数据更新为bin的值,最后用直方图表示。在进行特征选择时,只须要根据直方图的离散值,遍历寻找最优的分割点。
使用直方图算法有不少优势。首先最明显就是内存消耗的下降,直方图算法不只不须要额外存储预排序的结果,并且能够只保存特征离散化后的值,而这个值通常用8位整型存储就足够了,内存消耗能够下降为原来的1/8。
而后在计算上的代价也大幅下降,预排序算法每遍历一个特征值就须要计算一次分裂的增益,而直方图算法只须要计算k次(k能够认为是常数),时间复杂度从O(#data*#feature)优化到O(k*#features)。
Histogram算法有几个须要注意的地方:
Histogram算法的优缺点:
Histogram算法还能够进一步加速:
在Histogram算法之上,LightGBM进行进一步的优化。首先它抛弃了大多数GBDT工具使用的按层生长 (level-wise)的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise)算法。
XGBoost采用的是按层生长level(depth)-wise生长策略,可以同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了不少不必的开销。由于实际上不少叶子的分裂增益较低,不必进行搜索和分裂。
LightGBM采用leaf-wise生长策略,每次从当前全部叶子中找到分裂增益最大(通常也是数据量最大)的一个叶子,而后分裂,如此循环。所以同Level-wise相比,在分裂次数相同的状况下,Leaf-wise能够下降更多的偏差,获得更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。所以LightGBM在Leaf-wise之上增长了一个最大深度的限制,在保证高效率的同时防止过拟合。
一个叶子的直方图能够由它的父亲节点的直方图与它兄弟的直方图作差获得。一般构造直方图,须要遍历该叶子上的全部数据,但直方图作差仅需遍历直方图的k个桶。利用这个方法,LightGBM能够在构造一个叶子的直方图后,能够用很是微小的代价获得它兄弟叶子的直方图,在速度上能够提高一倍。
实际上大多数机器学习工具都没法直接支持类别特征,通常须要把类别特征,转化one-hot特征,下降了空间和时间的效率。而类别特征的使用是在实践中很经常使用的。基于这个考虑,LightGBM优化了对类别特征的支持,能够直接输入类别特征,不须要额外的0/1展开。并在决策树算法上增长了类别特征的决策规则。
one-hot编码是处理类别特征的一个通用方法,然而在树模型中,这可能并不必定是一个好的方法,尤为当类别特征中类别个数不少的状况下。主要的问题是:
下图右边叶子节点的含义是X=A或者X=C放到左孩子,其他放到右孩子。
具体实现方法:
为了解决one-hot编码处理类别特征的不足。LightGBM采用了Many vs many的切分方式,实现了类别特征的最优切分。用LightGBM能够直接输入类别特征,并产生上图右边的效果。在1个k维的类别特征中寻找最优切分,朴素的枚举算法的复杂度是$O(2^k)$,而LightGBM采用了如On Grouping For Maximum Homogeneity的方法实现了$O(klogk)$的算法。
算法流程下图所示:在枚举分割点以前,先把直方图按每一个类别的均值进行排序;而后按照均值的结果依次枚举最优分割点。从下图能够看到,Sum(y)/Count(y)为类别的均值。固然,这个方法很容易过拟合,因此在LGBM中加入了不少对这个方法的约束和正则化。
LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。特征并行的主要思想是在不一样机器在不一样的特征集合上分别寻找最优的分割点,而后在机器间同步最优的分割点。数据并行则是让不一样的机器先在本地构造直方图,而后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
LightGBM针对这两种并行方法都作了优化,在特征并行算法中,经过在本地保存所有数据避免对数据切分结果的通讯;在数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不一样的机器,下降通讯和计算,并利用直方图作差,进一步减小了一半的通讯量。
基于投票的数据并行则进一步优化数据并行中的通讯代价,使通讯代价变成常数级别。在数据量很大的时候,使用投票并行能够获得很是好的加速效果。
为了可以在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上加了两个技术:
GBDT虽然没有数据权重,但每一个数据实例有不一样的梯度,根据计算信息增益的定义,梯度大的实例对信息增益有更大的影响,所以在下采样时,咱们应该尽可能保留梯度大的样本(预先设定阈值,或者最高百分位间),随机去掉梯度小的样本。咱们证实此措施在相同的采样率下比随机采样得到更准确的结果,尤为是在信息增益范围较大时。
捆绑互斥特征,也就是他们不多同时取非零值(也就是用一个合成特征代替)。一般应用中,虽然特征量比较多,可是因为特征空间十分稀疏,是否能够设计一种无损的方法来减小有效特征呢?特别在稀疏特征空间上,许多特征几乎是互斥的(例如许多特征不会同时为非零值,像one-hot),咱们能够捆绑互斥的特征。最后,咱们将捆绑问题归约到图着色问题,经过贪心算法求得近似解。
GOSS在进行数据采样的时候只保留了梯度较大的数据,可是若是直接将全部梯度较小的数据都丢弃掉势必会影响数据的整体分布.为了抵消对数据分布的影响,计算信息增益的时候,GOSS对小梯度的数据引入常量乘数。GOSS首先根据数据的梯度绝对值排序,选取top a个实例。而后在剩余的数据中随机采样b个实例。接着计算信息增益时为采样出的小梯度数据乘以(1-a)/b,这样算法就会更关注训练不足的实例,而不会过多改变原数据集的分布。
EFB是经过特征捆绑的方式减小特征维度(实际上是降维技术)的方式,来提高计算效率。一般被捆绑的特征都是互斥的(一个特征值为零,一个特征值不为零),这样两个特征捆绑起来才不会丢失信息。若是两个特征并非彻底互斥(部分状况下两个特征都是非零值),能够用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,咱们能够选择把不彻底互斥的两个特征捆绑,而不影响最后的精度。
EBF的算法步骤以下:
高位的数据一般是稀疏的,这种稀疏性启发咱们设计一种无损地方法来减小特征的维度。特别的,稀疏特征空间中,许多特征是互斥的,例如他们从不一样时为非零值。咱们能够绑定互斥的特征为单一特征,经过仔细设计特征臊面算法,咱们从特征捆绑中构建了与单个特征相同的特征直方图。这种方式的间直方图时间复杂度从O(#data * #feature)降到O(#data * #bundle),因为#bundle << # feature,咱们可以极大地加速GBDT的训练过程并且损失精度。
有两个问题:
理论1:将特征分割为较小量的互斥特征群是NP难的
bundle(什么样的特征被绑定)算法流程:
merging features(特征合并):
如何合并同一个bundle的特征来下降训练时间复杂度。关键在于原始特征值能够从bundle中区分出来。鉴于直方图算法存储离散值而不是连续特征值,咱们经过将互斥特征放在不一样的箱中来构建bundle。这能够经过将偏移量添加到特征原始值中实现,例如,假设bundle中有两个特征,原始特征A取值[0, 10],B取值[0, 20]。咱们添加偏移量10到B中,所以B取值[10, 30]。经过这种作法,就能够安全地将A、B特征合并,使用一个取值[0, 30]的特征取代AB。
EFB算法可以将许多互斥的特征变为低维稠密的特征,就可以有效的避免没必要要0值特征的计算。实际,经过用表记录数据中的非零值,来忽略零值特征,达到优化基础的直方图算法。经过扫描表中的数据,建直方图的时间复杂度将从O(#data)降到O(#non_zero_data)。固然,这种方法在构建树过程当中须要而额外的内存和计算开销来维持预特征表。咱们在lightGBM中将此优化做为基本函数,由于当bundles是稀疏的时候,这个优化与EFB不冲突(能够用于EFB)
下面几张表为重要参数的含义和如何应用
接下来是调参
下表对应了Faster Spread,better accuracy,over-fitting三种目的时,能够调整的参数
参考文献:
【3】LightGBM——提高机器算法(图解+理论+安装方法+python代码)
【4】https://www.bilibili.com/video/av47496956?from=search&seid=11905257687121452350