目录
Xgboost
属于Boosting的集大成者, 对函数残差近似值进行梯度下降, 用CART回归树做学习器,迭代时利用了二阶梯度信息, 集成模型可分类也可回归. 由于它可在特征粒度上并行计算, 结构风险和工程实现都做了很多优化, 泛化, 性能和扩展性都比GBDT要好。
①改进残差函数
不用Gini作为残差,用二阶泰勒展开+树的复杂度(正则项)
第t次的loss:
对上式做二阶泰勒展开:g为一阶导数,h为二阶导数
带来如下好处:1.可以控制树的复杂度;2.带有关于梯度的更多信息,获得了二阶导数;3.可以用线性分类器;
②采用预排序
因为每一次迭代中,都要生成一个决策树,而这个决策树是残差的决策树,所以传统的不能并行,但是每次建立决策树,在分裂节点的时候,比如选中A特征,就要对A进行排序,再计算残差,这个花很多时间,因此,我们可以每一次残差计算好之后,全部维度预先排序,并且此排序是可以并行的,并行排序好后,对每一个维度,计算一次最佳分裂点,求出对应的残差增益。于是只要不断选择最好的残差作为分裂点就可以。也就是说,虽然森林的建立是串行的没有变,但是每一颗树枝的建立就变成是并行的了,带来的好处:
1.分裂点的计算可并行了,不需要等到一个特征的算完再下一个了
2.每层可以并行:
当分裂点的计算可以并行,对每一层,比如分裂了左儿子和右儿子,那么这两个儿子上分裂哪个特征及其增益也计算好了
③Shrinkage(缩减)【相当于学习速率】
XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率)
④列抽样
XGBoost借鉴了随机森林的做法,支持列抽样,不仅防止过拟合,还能减少计算。
GBDT和xgboost的区别:
1)、gbdt在函数空间通过梯度下降法进行优化,xgboost在函数空间通过牛顿法进行优化;
2)、相比原始的GBDT,XGBoost的目标函数多了正则项,使得学习出来的模型更加不容易过拟合;
3)、传统gbdt以CART作为基分类器,xgboost还支持线性分类器;
4)、xgboost支持自定义损失函数,只要损失函数一阶、二阶可导;
5)、xgboost支持列抽样,降低过拟合,减少计算;
6)、xgboost支持并行,xgboost的并行是在特征粒度上的。
lightGBM 与 XGBoost的区别
1、切分算法(切分点的选取)
XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;但这种做法有以下缺点:
1)空间消耗大,需要保存数据的特征值以及特征排序的结果(比如排序后的索引,为了后续快速计算分割点),需要消耗两倍于训练数据的内存
2)时间上也有较大开销,遍历每个分割点时都需要进行分裂增益的计算,消耗代价大
3)对cache( 快速缓冲贮存区)优化不友好,在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。
LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点:
1)占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。
2)降低了计算的代价:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。(相当于LightGBM牺牲了一部分切分的精确性来提高切分的效率,实际应用中效果还不错)
2、决策树生长策略上:
XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)
LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此 LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。
3、histogram 做差加速:
一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。