Boosting算法是一种集成学习算法,由一系列基本分类器按照不同的权重组合成为一个强分类器,这些基本分类器之间有依赖关系。包括Adaboost算法、提升树、GBDT算法。
当Adaboost算法中的基本分类器是cart回归树时,就是提升树,同时,损失函数变为平方误差损失函数。在Adaboost算法中通过改变样本的权重来进行每一轮的基本分类器的学习,在提升树算法中,是通过上一轮学习的残差进行本轮的学习。
1.需要解决的问题
对于Boosting算法,需要解决两个问题:
· 如何调整训练集,使得在训练集上训练的弱分类器得以进行。
· 如何将训练得到的各个弱分类器联合起来形成强分类器。
2.算法的三个要素
函数模型(Boosting的函数模型是叠加型的),即:
目标函数(选定某种损失函数作为优化目标):
优化算法(贪婪地逐步优化),即:
3.Gradient Boosting算法(梯度提升算法)
Gradient Boosting算法的实现:
· 函数模型为CART回归树模型。
· 损失函数一般为“对数损失函数”或“指数损失函数”。
· 优化算法采用梯度下降。
· 针对Boosting需要解决的两个问题,Gradient Boosting算法采用了以下策略:
将残差作为下一个弱分类器的训练数据,每个新的弱分类器的建立都是为了使得之前弱分类器的残差往梯度方向减少。
将弱分类器联合起来,使用累加机制代替平均投票机制。
与Adaboost算法不同,Gradient Boosting算法在迭代的时候选择梯度下降的方向来保证最后的结果最好。损失函数用来描述模型的“靠谱”程度,假设模型没有过拟合,损失函数越大,模型的错误率就越高。如果模型能够让损失函数持续下降,就说明模型在不停地改进,而最好的方式就是让损失函数在其梯度方向上下降。
【例1】GradientBoostingRegressor的实现。
Python中的Scikit-Learn包提供了GradientBoostingRegressor和GBDT的函数接口,可以很方便地调用函数完成模型的训练和预测。
Gradient Boosting算法模型图如图1所示。
图1 Gradient Boosting算法
可以发现,如果要用Gradient Boosting算法,那么在sklearn包里调用还是非常方便的,几行代码即可完成,大部分的工作应该是在特征提取上。