集成学习ensemble learning 又叫集成模型、模型融合、多分类器系统、基于委员会的学习,是KDD CUP、Kaggle等竞赛的神器。简单说,通过构建并结合多个学习器来完成学习任务。
分类:
个体学习器强依赖关系,串行生成的序列化方法,Boosting
个体学习器非强依赖,同时生成的并行化方法,Bagging
本篇短文只介绍集成学习的Boosting方法。其中,GBM(Gradient Boosting Machine),或称为Boosted Tree、GBDT、GBRT或LambdaMART等,指利用梯度提升方法的树结构算法。XGBoost全称是 eXtreme Gradient Boosting(极限梯度提升)。它是 GBM的一个c++ 实现,作者为正在华盛顿大学研究机器学习的大牛陈天奇,毕业于上海交通大学ACM班,从事大规模机器学习研究。XGBoost的改进是一点一滴来的,是一篇篇论文的积累,很多方法并非XGBoost第一次提出,可以说XGBoost把算法和系统实现都做得淋漓尽致。
【目录】
集成学习之Boosting参考资料/推荐读物泰勒公式梯度下降法(Gradient Descend Method)牛顿法(Newton's Method)从参数空间到函数空间从梯度下降到梯度提升(GBM)从牛顿方法到牛顿提升(XGBoost)Boosting算法CART分类回归树GBDT算法原理XGBoost算法原理
泰勒公式,通俗来讲是"用多项式函数去逼近光滑函数"。在实际应用中,当我们对精度的要求并不太高的时候可以截断多项式函数,从而获得某点附近取值的估计。常用来求近似值、误差估计、建立数值计算格式等等。在本篇中,梯度下降法和牛顿法都利用了泰勒展开。
在机器学习任务中,需要最小化损失函数,其中是要求解的模型参数。梯度下降法常用来求解这种无约束最优化问题,它是一种迭代方法:选取初值,不断迭代,更新的值,进行损失函数的极小化。
牛顿法同梯度下降类似,也是一种最优化方法,并且,与梯度下降法相比,牛顿法利用了泰勒二阶展开。
在函数空间,某些函数是做不到梯度下降的,例如,树结构的算法在函数空间上实质是分段函数。因此,需要借用梯度下降的思想,产生了梯度提升算法。
梯度下降是参数空间
梯度提升是函数空间
借鉴梯度提升算法,XGBoost的核心是利用牛顿方法在参数空间转换到函数空间。
牛顿方法是参数空间
牛顿提升是函数空间
综上所述,Boosting 算法是一种加法模型(additive training),模型公式:,其基分类器常采用回归树[Friedman 1999]和逻辑回归[Friedman 2000]。
树模型有以下优缺点:
接下来,我们从CART最基本的回归树开始介绍,从而到GBDT和XGBoost
CART回归树,也叫分类回归树(Classification and regression tree),与决策树不同的是,在每个叶子节点包含一个分数。
监督学习的算法构成:模型,参数 和 目标函数
模型和参数
目标函数:损失和正则
优化算法
CART实例
首先是模型。Boosted tree 最基本的组成部分叫做回归树(regression tree),也叫做CART
CART会把输入根据输入的属性分配到各个叶子节点,而每个叶子节点上面都会对应一个实数分数。上面的例子是一个预测一个人是否会喜欢电脑游戏的 CART,你可以把叶子的分数理解为有多可能这个人喜欢电脑游戏。有人可能会问它和decision tree的关系,其实我们可以简单地把它理解为decision tree的一个扩展。从简单的类标到分数之后,我们可以做很多事情,如概率预测,排序。
然后是目标函数:CART设定目标函数之后,会通过优化算法进行优化。下图以单变量CART为例展示了目标函数的优化过程。
CART融合
一个CART往往过于简单无法有效地预测,因此一个更加强力的模型叫做tree ensemble。
我们用两棵树来进行预测。我们对于每个样本的预测结果就是每棵树预测分数的和。到这里,我们的模型就介绍完毕了。现在问题来了,我们常见的随机森林和boosted tree和tree ensemble有什么关系呢?如果你仔细的思考,你会发现RF和boosted tree的模型都是tree ensemble,只是构造(学习)模型参数的方法不同。第二个问题:在这个模型中的“参数”是什么。在tree ensemble中,参数对应了树的结构,以及每个叶子节点上面的预测分数。
树融合方法
Friedman J H. Greedy Function Approximation: A Gradient Boosting Machine[J]. Annals of Statistics, 2001, 29(5):1189-1232.
Friedman于论文” Greedy Function Approximation…”中最早提出GBDT,其模型F定义为加法模型:
其中,x是输入样本,h是分类回归树(CART),w是分类回归树参数,是每棵树的权重。
通过最小化损失函数求解最优模型:
具体算法 输入:,T,L
初始化
for t=1 to T do
输出:
Tianqi Chen and Carlos Guestrin. XGBoost: A Scalable Tree Boosting System. In 22nd SIGKDD Conference on Knowledge Discovery and Data Mining, 2016
XGBoost先是在Github上公开使用,后来由陈天奇写论文公开。
自适应的学习(Boosting):
设定目标函数:
模型函数:,其中,,
启发式复杂度定义:,由叶子节点数目和L2正则项组成
所以我们的算法也很简单,我们不断地枚举不同树的结构,利用这个打分函数来寻找出一个最优结构的树,加入到我们的模型中,再重复这样的操作。不过枚举所有树结构这个操作不太可行,所以常用的方法是贪心法,每一次尝试去对已有的叶子加入一个分割。对于一个具体的分割方案,我们可以获得的增益可以由如下公式计算
对于每次扩展,我们还是要枚举所有可能的分割方案,如何高效地枚举所有的分割呢?我假设我们要枚举所有 x<a 这样的条件,对于某个特定的分割a我们要计算a左边和右边的导数和。
我们可以发现对于所有的a,我们只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和GL和GR。然后用上面的公式计算每个分割方案的分数就可以了。