gdbt,xgboost,lightgbm区别与联系

gbdt

  •  gbdt是一个机器学习算法框架,xgboost,lightgm都是对这个算法思想的工程化实现
  • gbdt 随着迭代次数(树个数的增加)效果刚开始比较好,后面就会过拟合变差;但是随机森林就不会存着这个问题,基本树个数越多越好; gbdt 回归和分类的实现是一样的,只不过损失函数不同,回归用的是MSE,分类用的交叉熵,都是回归树,因为拟合的负梯度,所以必须是CART回归树,寻找最优变量的最佳分割点(每一个值作为分裂点,计算左子树和右子树收益,择优录取)
  • boosting的思想,建树过程串行
  • Bagging是一个简单的ensemble的技术,我们构建许多独立的预测器/模型/学习器,通过模型平均的方式来组合使用。(如权值的平均,投票或者归一化平均)。我们为每个模型使用随机抽样,所以每个模型都不太一样。每个模型的输入使用有放回的抽样,所以模型的训练样本各不相同。因为这个技术使用了许多个不相关的学习器来进行最终的预测,它通过减少方差来减小误差。bagging的一个例子是随机森林模型。

  • Boosting 在对模型进行ensemble的时候,不是独立的,而是串行的。这个技术使用了这样的逻辑,后面的预测器学习的是前面的预测器的误差。因此,观测数据出现在后面模型中的概率是不一样的,误差越大,出现的概率越高。(所以观测数据不是基于随机又放回抽样bootstrap的方式,而是基于误差)。预测器可以从决策树,回归器,分类器中选取。因为新的预测器是从前面的预测器的误差中学习的,接近实际的预测只需要更少的时间和迭代次数。但是我们不得不选择严格的停止策略,否则可能会出现过拟合。梯度提升算法就是提升算法的一个例子。

  • 梯度提升背后的直觉就是重复的利用残差中的模式利用弱预测器来加强模型,让模型变得更好。一旦我们到了一个阶段,残差不具有任何的模式,无法进行建模,我们就可以停止了(否则会导致过拟合)。从算法的角度讲,我们在最小化损失函数,直到测试损失达到最小。

  • GBDT使用的决策树是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树通通都是CART回归树。为什么不用CART分类树呢?因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树。

gbdt 与xgboost 

区别: 

1.xgboost和GBDT的一个区别在于目标函数上。 
在xgboost中,损失函数+正则项。 
GBDT中,只有损失函数。 
2.xgboost中利用二阶导数的信息,而GBDT只利用了一阶导数。 
3.xgboost在建树的时候利用的准则来源于目标函数推导,而GBDT建树利用的是启发式准则。(这一点,我个人认为是xgboost牛B的所在,也是为啥要费劲二阶泰勒展开) 
4.xgboost中可以自动处理空缺值,自动学习空缺值的分裂方向,GBDT(sklearn版本)不允许包含空缺值。 

在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。
5.其他若干工程实现上的不同(这个由于本文没有涉及就不说了)

联系: 
1.xgboost和GBDT的学习过程都是一样的,都是基于Boosting的思想,先学习前n-1个学习器,然后基于前n-1个学习器学习第n个学习器。(Boosting) 
2.建树过程都利用了损失函数的导数信息(Gradient),只是大家利用的方式不一样而已。 
3.都使用了学习率来进行Shrinkage,从前面我们能看到不管是GBDT还是xgboost,我们都会利用学习率对拟合结果做缩减以减少过拟合的风险。

xgboost 与lightgbm 

1)XGBoost的缺点

类别特征必须one-hot

在LightGBM提出之前,最有名的GBDT工具就是XGBoost了,它是基于预排序方法的决策树算法。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用的代价找到一个特征上的最好分割点。最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。

这样的预排序算法的优点是能精确地找到分割点。但是缺点也很明显:首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如,为了后续快速的计算分割点,保存了排序后的索引),这就需要消耗训练数据两倍的内存。其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。最后,对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

(2)LightGBM的优化

为了避免上述XGBoost的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上进行了如下优化:

 

  • 基于Histogram的决策树算法。(直方图)

  • 单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。

  • 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。

  • 带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。

  • 直接支持类别特征(Categorical Feature):类别特征是label_encoder,编码序号从0开始

  • 支持高效并行:建树过程中,特征并行,数据并行,投票并行(类似于map-reduce那一套)

  • Cache命中率优化

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值