最近忙着秋招,所以很少有时间再续写新的内容,虽然一直想把自己的机器学习心得更多的写下来,但是奈何作者还要每天疯狂刷leetcode准备面试。 另外希望大家给以评论和点赞,让我感觉有一些互动和一些探讨。
说到以上三种boost算法,我们就必须要说一个叫做提升算法的东西,它是以上三种算法的基础中的基础也是重点中的重点。
提升算法
所以什么是提升算法呢? 直观的理解便是梯度下降(不知道梯度下降的请去参观我的梯度下降文章),
假设我们有一样本,
当
然后我们再看看下面的图片理解一下
每一次更新以后的值将会再进入一个dt模型进行预测,所以,我们根据这种特性,建立了一种使用真残差的方法,这就是gradient boost。基本的思路就是,先用一个决策树dt,用x值预测出
对于gradientboost的预测最后只需要
以上就是gradientboost的基本思路,下面我们要说的就是强大的xgboost,其实xgboost的思路有了gradientboost做为蓝本就很好理解了。
xgboost
说到xgboost,这里就先吹一下作者陈天齐,不得不说,天齐大神这一方法,居然在老外遍地走的机器学习领域开创了先河,且一直维持到了现在还屹立不倒,真的可谓是,华人之光。
二阶导的应用
我们可以看出,以上的gradientboost其实是对
根据泰勒展开
我们假设
这里要解释一下,在以上公式中
然后根据
当
至此,xgboost讲解完毕,总结一下就是,xgboost一般来说是要两颗树以上,第一棵树,先生成一个
今天先讲到这里,明天将为大家补上lightgbm!!!
Lightbgm
lightgbm主要是对于一些回归问题(不懂回归的请补一下回归树的课程)的加速处理其速度可以达到xgboost的5倍左右,且相同精度。
GOSS(Gradient-based One Side Sampling )
lightgbm的第一个加速算法叫GOSS, 其原理是adboost的原理,对于梯度少的样本就抛弃它(证明学的很好),梯度大的样本就进行前向。其具体步骤为,
- 根据梯度的绝对值将样本进行降序排序
- 选择前 ×100%的样本,这些样本称为A
- 剩下的数据(1− )×100% 的数据中,随机抽取 ×100%的数据,这些样本称为B
- 在计算增益的时候,放大样本B中的梯度(1− )/ 倍
使用GOSS进行采样,使得训练算法更加的关注没有充分训练(under-trained)的样本,并且只会稍微的改变原有的数据分布。
详情见下图
具体的信息增益计算过程如下图
这样,我们就不用对全部的训练集进行前向而只是对于某一梯度大的部分进行前向。
直方图算法
对于xgboost来说,对于回归问题,其是先对数据排序,然后找出一个最佳切分点使得左右结点的loss达到最少,(此处不再举例,不懂得看回归树)。 但是其有以下几个缺点:
- 空间消耗大。需要保存数据的特征值。XGBoost采用Block结构,存储指向样本的索引,需要消耗两倍的内存。
- 时间开销大。在寻找最优切分点时,要对每个特征都进行排序,还要对每个特征的每个值都进行了遍历,并计算增益。
- 对Cache不友好。使用Block块预排序后,特征对梯度的访问是按照索引来获取的,是一种随机访问,而不同特征访问顺序也不一样,容易照成命中率低的问题。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的Cachemiss。
使用直方图就可以避免以上的问题
那直方图到底什么意思呢?
很简单,就是将排完序的数据进行离散化,说白了,就是有一组数据(1,1.5,2,2.5,3,3.5),那现在我们用几个bin将其区间化(1,2),(3,4),(5,6), 然后我们根据其数据特征进行离散化比如(1,1.5)-> 1, (1.5,2)->2。 然后再根据离散化后的1和2寻找最佳切分点。 同时,将特征根据其所在的bin进行梯度累加。这样,遍历一次数据后,直方图累积了需要的梯度信息,然后可以直接根据直方图,寻找最优的切分点。此外,直方图算法还可以进一步加速:一个叶子节点的直方图可以由它的父亲节点的直方图与其兄弟的直方图做差得到。
具体算法如下:
这里可能有人会提问,那到底分几个bin合适呢? 我只能说,让loss最小的数量的bin就是最好的,具体情况具体分析。
直方图总结:
可以看出,直方图算法的优点有:
- 可以减少内存占用,比如离散为256个Bin时,只需要用8位整形就可以保存一个样本被映射为哪个Bin(这个bin可以说就是转换后的特征),对比预排序的Exact greedy算法来说(用int_32来存储索引+ 用float_32保存特征值),可以节省7/8的空间。
- 计算效率也得到提高,预排序的Exact greedy对每个特征都需要遍历一遍数据,并计算增益,复杂度为 (# ×# )。而直方图算法在建立完直方图后,只需要对每个特征遍历直方图即可,复杂度为 (# ×# )。
- 提高缓存命中率,因为它访问梯度是连续的(直方图)。
- 此外,在数据并行的时候,直方图算法可以大幅降低通信代价。(数据并行、特征并行在本文后面讲解)
当然也有不够精确的缺点:
当然,Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点 也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。
Exclusive Feature Bundling(EFB)
这个算法就比较有意思了,是一种降维算法,因为在特征矩阵中很多值是0,即矩阵为稀疏矩阵,那么我们就尝试将两个特征合并为一个特征,或者几个特征合并为一个特征,怎么办呢?举个例子,假设特征
具体算法如下
对于特征融合来说,其是在bins上的融合,一个经典的例子是,如果
树的生长
在xgboost中,树是按层生长的,但是,lightbgm中,其使用按照节点生长,这样就可以减少内存。
下面就是一点xgboost和lightbgm的对比:
此外,其实lightbgm中,还有数据并行的操作,其大概意思就是让每个特征并行计算最佳划分点,然后再找出最佳划分特征,有兴趣的可以去官方文档看看,这里不再赘述。
2307

被折叠的 条评论
为什么被折叠?



