Boosting算法进化史

背景算法

当前的热门算法中,除了神经网络在图像和文字、音频等领域大放异彩以外,集成学习中的xgboost,lightGBM,CatBoost也在kaggle等机器学习平台上成为了煊赫一时的工具。网络

 

明确概念:机器学习

一、Boosting(提高)ide

二、Adaptive Boosting(自适应加强)函数

三、Gradient Boosting(梯度提高)工具

四、Decision Tree(决策树)性能

 

1、Boosting学习

关于boosting(提高算法)的概念,上文有简单介绍过,提高算法(这是一类算法族的称呼,不是指某种具体算法)是经过改变训练样本的权重(若是基分类器不支持则经过调整采样的方式改变基分类器的训练样本分布),学习多个分类器,并将这些分类器进行线性组合,提升分类的性能。下面要讲的集成算法都属于提高算法优化

 

2、Adaboost(Adaptive Boosting自适应加强算法)spa

 针对分类任务,李航的《统计学习方法》中有详细介绍

 

 

 

总结一下流程以下图所示

 

 

 

 

 

通过上述学习,咱们已经能够明确adaboost的核心是

1)计算基分类器的偏差

2)计算基分类器的权重

3)更新样本的权重

4)最后的结合策略

针对回归任务,adaboost有如下步骤

 

 

 

 

 

 

3、GBDTGBDT泛指全部梯度提高树算法,包括XGBoost,它也是GBDT的一种变种,为了区分它们,GBDT通常特指“Greedy Function Approximation:A Gradient Boosting Machine”里提出的算法,只用了一阶导数信息。)

参考自:https://zhuanlan.zhihu.com/p/46445201

GBDT是以CART树(回归树)做为基分类器的boosting算法。与Adaboost经过每次调整样本的权值来训练不一样的基分类器不一样,GBDT是经过将残差做为拟合目标训练心得基分类器。

先看一下GBDT应用于回归任务的原理

 

 

 

其实,我一直对GBDT中的“梯度提高”很不理解,由于最优化理论中,梯度降低优化算法已经很熟悉了,拿二者进行比较,我老是以为GBDT依然是“梯度降低”而非“梯度提高”,以下图是某个博客上的对比

 

 ,这分明都是使用的“梯度降低”。

在参考了不少资料以后,我终于明白了GBDT为何使用“梯度提高”的叫法了。这里的“梯度提高”并非和“梯度降低”对立的概念,相反,应该把它拆解开来

 “梯度提高”=“梯度”+“提高”

“梯度”是指GBDT算法中使用梯度近似拟合残差的作法

“提高”是指boosting方法中将弱学习器提高为强学习器的作法

再附一个GBDT实际应用于回归任务的例子

 

 

 

GBDT应用于分类任务

 针对二分类任务,

 

 

 

 

 

 

 

 以上,最重要的一点就是,针对分类任务每一个基分类器拟合的是真实标签与和对应类别预测几率的残差。

 

 

4、XGBoost(eXtreme Gradient Boosting)

从名字就能够看出,xgboost是GBDT的加强版本。

若是把xgboost对gbdt的全部改进细节列出来,那牵扯的point有点多,因此选择几个点进行阐述。

为了用最容易理解的思路,咱们就假设不知道xgboost算法,先去思考GBDT的过程当中有哪些点能够改进:

一、基学习器的选择。

GBDT使用CART(回归树)做为基学习器,咱们还能够考虑支持其余的基学习器,因此xgboost也支持线性学习器

二、损失函数的选择。

GBDT大多数状况下采用平方偏差和做为损失函数,咱们还能够考虑更优秀的损失函数,因此xgboost实现了本身的损失函数。

三、特征分裂点及特征选择。

GBDT采用CART树的特征分裂点及特征选择方式,具体为串行遍历全部的特征分裂点和特征,选择平方偏差和最小的特征及特征分裂点;

这个过程当中,咱们注意到各特征及分割点的损失函数的计算能够并行执行,并且若是对样本按照特征排序的结果在全局能够复用,可大大提升计算效率,而xgboost也是这样作的。

另外,GBDT的每棵树的特征选择策略都是相同的,方差较小,多样性不足,咱们能够借鉴随机森林中列抽样(随机变量选择)的思想,xgboost也实现了这一点。

四、不一样的树对于残差的拟合策略

GBDT采用残差的一阶导数代替残差进行拟合(这里须要说明,许多资料说用一阶导代替残差的缘由是残差难以得到,这好扯淡啊,拟合一阶导的优势明明是为了更快地进行拟合,并且当损失函数为平方偏差和时,一阶导就等于残差),发散一下咱们就想到了梯度降低和牛顿法,那咱们能不能使用二阶导来拟合残差呢,答案是确定的,且xgboost也是这样作的,并且经过二阶导拟合策略计算出了xgboost的损失函数(见步骤2)。损失函数不只考虑到了经验风险,也考虑到告终构风险,经过结构风险正则化,使得xgboost泛化性能更佳,更不容易过拟合。

 

5、LightGBM

该算法在精度,运行效率和内存消耗等方面在绝大多数数据集上的表现都优于xgboost。

咱们沿用上面的思路,继续思考在xgboost的优化基础上,怎样进一步优化GB类的算法。

一、boosting过程当中,最耗时的就是特征选择及连续特征分裂点选取的问题,xgboost已经经过pre-sorted预排序的方法进行了优化,可是若是样本对应的特征枚举值过多,仍是会致使耗时过长的问题。因此咱们能够考虑HistoGram(直方图)算法,经过预先对样本的特征进行分桶(bin)的方式,在选择分裂点的时候遍历各个桶,就能够有效地提升运行效率,虽然会稍微损失一点精度,可是能够经过其它的优化进行弥补。

二、结点的分裂策略。GBDT和xgboost在树的分裂过程当中,都采用level-wise(相似层序遍历)的分裂方式,这种方式平等地对待了分裂贡献可能相差很大的同一层的不一样子结点。lightGBM采用leaf-wise(相似深度优先遍历)分裂策略,每一步都选择最深的贡献最大的子结点进行分裂。

三、采样方法。不管是GBDT仍是xgboost,咱们都是在不停地训练基学习器去拟合残差,当残差小于某个阈值时中止训练,可能存在这样一种状况,对于大多数样原本讲,其梯度已经较小,而小部分样本的梯度仍较大,因此咱们想到能够在每次训练新的基学习器时,保留梯度较大的样本,减小梯度较小的样本数量(随机采样),这即是GOSS方法(Gradient-based One-Side Sampling)。

 

ok,,,写得本身很不满意,先出初版,后面迭代优化吧。。。还想补一下catboost。。。

相关文章
相关标签/搜索