随机森林RF、XGBoost、GBDT和LightGBM的原理和区别
1、基本知识点介绍
-
RandomForest、XGBoost、GBDT和LightGBM都属于集成学习。
-
集成学习通过构建并结合多个分类器来完成学习任务,也称为多分类系统,集成学习的目的是通过结合多个机器学习分类器的预测结果来改善基本学习器的泛化能力和鲁棒性。
-
集成学习方法大致分为两类:
-
基本学习器之间存在强依赖关系、必须串行生成的序列化方法,即Boosting提升方法。
-
基本学习器之间不存在强依赖关系、可同时生成的并行化方法,即Bagging方法。
-
2、各个算法原理
2.1 随机森林 -- RandomForest
-
RF原理:RF是Bagging的扩展变体,它在以决策树为基础学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机特征选择,其流程大概分为四个步骤:
-
随机选择样本(放回抽样)。
-
随机选择特征属性。
-
构建决策树。
-
随机森林投票(平均)。
-
因此防止过拟合能力更强,降低方差。
-
Bagging,即套袋法,算法过程如下:
-
从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本,共进行k轮抽取,得到k个训练集。
-
每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(模型可以根据具体问题具体选取,如决策树,SVM,感知机。)
-
对于分类问题:将上面得到的k个模型采用投票的方式得到分类结果;
对于回归问题:计算上述模型的均值作为最后的结果。(因为所有模型的重要性是相同的)
-
-
RF和Bagging对比: RF的起始性能较差,特别当只有一个基学习器时,随着学习器数目增多,随机森林通常会收敛到更低的泛化误差。随机森林的训练效率也会高于Bagging,因为在单个决策树的构建中,Bagging使用的是‘确定性’特征数,在选择特征划分结点时,要对所有的特征进行考虑,而随机森林使用的是‘随机性’特征数,只需考虑特征的子集。
2.2 XGBoost算法
- XGBoost原理:XGBoost属于集成学习Boosting,是在GBDT的基础上对Boosting算法进行的改进,并加入了模型复杂度的正则项。GBDT是用模型在数据上的负梯度作为残差的近似值,从而拟合残差。XGBoost也是拟合数据残差,并用泰勒展开式对模型损失残差的近似,同时在损失函数上添加了正则化项。
其中\(\sum_{i=1}^{n} L(y_{i}, \hat{y}_{i}^{(t-1)})\)为损失函数,红色方框为正则项,包括L1、L2;红色圆圈为常数项。
-
L1正则化项:$$L(\omega) = \frac{1}{N} \sum_{i=1}^{N} (f(x_{i}) - y_{i})^{2} + \frac{\lambda}{2} ||\omega||^{1}$$
-
L2正则化项:$$L(\omega) = \frac{1}{N} \sum_{i=1}^{N} (f(x_{i}) - y_{i})^{2} + \frac{\lambda}{2} ||\omega||^{2}$$
-
XGBoost与GBDT算法的区别:
-
传统的GBDT在优化的时候只用到了一阶导数信息,而XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数,并且XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。
-
另外XGBoost还支持线性分类器,通过在代价函数中加入正则项,降低了模型的方差,使学习出来的模型更加简单,避免过拟合。
-
-
GBDT的基本原理是Boosting里面的boosting tree(提升树),并使用gradient boost。其关键是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一颗CART回归树(classification and regression tree)。
2.3 GBDT算法(Gradient Boosting Decision Tree)
- GBDT算法原理:指通过在残差减小的梯度方向建立boosting tree(提升树),即gradient boosting tree(梯度提升树)。每次建立新模型都是为了使之前模型的残差往梯度方向下降。
- GBDT缺点:GBDT会累加所有树的结果,此过程无法通过分类完成,因为GBDT需要按照损失函数的梯度近似地拟合残差,这样拟合的是连续数据,因此只能是CART回归树,而不能是分类树。
2.4 LightGBM提升学习模型
-
lightGBM,它是微软出的新的boosting框架,基本原理与XGBoost一样,使用基于学习算法的决策树,只是在框架上做了一优化(重点在模型的训练速度的优化)。
-
直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
-
lightGBM与XGBoost的区别:
- xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略。
- level-wise:指对每一层所有节点做无差别分裂,可能有些节点的增益非常小,带来了没必要的开销。
- leaf-wise:指在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,容易出现过拟合,因此需要做最大深度限制,从而避免过拟合。
- lightGBM使用了基于histogram(直方图)的决策树算法,而XGBoost使用了exact算法(需要提前预排序)。
- 能减少内存消耗(#data* #features * 1Bytes),降低计算代价,因为其只需要保存特征离散化之后的值。
- 而XGBoost使用exact算法,内存消耗为(2 * #data * #features* 4Bytes),因为XGBoost既要保存原始feature的值,也要保存这个值的顺序索引。
- XGBoost的预排序算法在选择好分裂特征计算分裂受益时,需要遍历所有样本的特征值,时间复杂度为(#data),与数据量成正比。而lightGBM的直方图只需要遍历分区的直方桶即可,时间复杂度为(#bin)。
- lightGBM的直方图还能做减差加速作用。
- 一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图即可得到,从而实现加速。
- lightGBM支持直接输入类别categorical的特征feature。
- 在对离散特征分裂时,每个取值都当作一个桶,分裂时的增益为“是否属于某个类别category”的gain。类似与one-hot编码。
- lightGBM实现可多线程优化。(即能够在同一时间执行多个线程,提升整体性能)
- lightGBM做了并行处理。
- feature parallel(特征并行处理):一般的feature parallel就是对数据做垂直分割(partiion data vertically,就是对属性分割),然后将分割后的数据分散到各个worker上,各个workers计算其拥有的数据的best splits point, 之后再汇总得到全局最优分割点。lightgbm的做法是每个worker都拥有所有数据,再分割。——我也没懂
- data parallel(数据并行处理):传统的data parallel是将对数据集进行划分,也叫 平行分割(partion data horizontally), 分散到各个workers上之后,workers对得到的数据做直方图,汇总各个workers的直方图得到全局的直方图。 lightgbm的做法是使用”Reduce Scatter“机制,不汇总所有直方图,只汇总不同worker的不同feature的直方图(原理?),在这个汇总的直方图上做split,最后同步。
- xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略。
参考:
1、牛人:https://blog.csdn.net/zwqjoy/article/details/82150528
2、周志华《机器学习》
3、刘建平GBDT:https://www.cnblogs.com/pinard/p/6140514.html
4、大牛XGBoost:https://www.cnblogs.com/zhouxiaohui888/p/6008368.html