BalaBala
在上海实践的时候一个师兄说XGBoost在工业界的应用很广,之前曾经用到过但是没有仔细了解,想简单了解一下。看了一些教程感觉还是官方文档的讲解是最好的,于是趁着假期翻译了一下。水平有限,欢迎批评指正。
XGBoost 指的是极致梯度提升树(Extreme Gradient Boosting)。梯度提升树(Gradient Boosting) 是由Friedman在论文 《贪心函数逼近:一种梯度提升机》(Greedy Function Approximation: A Gradient Boosting Machine )中提出的。本文是一篇梯度提升树的指南,大部分内容取自XGBoost的提出者:陈天奇大佬的幻灯片。
梯度提升树被提出和应用已经有一段时间了,也有很多关于它的材料。这篇指南会使用监督学习的基本原理来完整地、有条理地介绍提升树。我们觉得这篇介绍和之前的相比更加清晰和正式,希望它可以推动XGBoosted 的使用和模型表述。
1.监督学习的基本原理模型和参数目标函数:损失项+正则项为什么介绍一般性原则?2. 决策树集成(Decision Tree Ensembles)3. 提升树(Tree Boosting)递增训练(Additive Training)模型复杂度结构分(The Structure Score)树结构的学习4. XGBoost后记
1.监督学习的基本原理
XGBoosted用于解决监督学习(supervised learning)问题,简单来说就是利用训练数据x来预测目标变量y。在使用提升树之前,让我们首先来复习一下监督学习的基本原理。
模型和参数
监督学习的模型结构一般是用输入的数据x来预测y。一个常见的例子是线性模型,预测模型是这样的:。可以看出,这是输入特征的加权线性组合。预测值根据任务的不同,可以有不同的解释,也就是回归或分类。比如,在logistic 回归中,可以把预测值通过logistic 变换来得到被认为是正样本的概率;当我们想根据输出来排名的时候,也可以把预测值转化成排名的名次。
监督学习中的参数是未知的,也就是我们需要从模型中学习的。在线性回归中的参数是系数θ。通常我们会也使用θ来表示参数。(当然了,一个模型会有许许多多的参数,这里的定义有些草率,但是能用。)
目标函数:损失项+正则项
通过对y的合理选择,我们可以用它来表示多种任务,比如回归、分类、排名问题等。训练模型的任务就是找到能够符合训练数据x和标签y的最佳参数。为了训练模型,我们需要定义目标函数来衡量模型与训练数据的匹配程度。
目标函数的一个显著特征是由训练损失项和正则化项两部分组成:
其中,L是训练的损失项,Ω是正则化项。损失项衡量了我们的模型相对于训练数据的预测效果。L常见的一个选择是最小均方误差(mean squared error),即:
另一个常见的损失项是logistic 损失项,用于logistic 回归:
很多人经常会忘记添加正则化项。正则化项控制了模型的复杂度,避免了过拟合。这听起来有点抽象,所以让我们考虑下面的问题。给定图像左上角的输入数据点,要求你拟合一个阶梯函数。另外三幅图中你觉得哪个拟合的最好?
为什么介绍一般性原则?
以上介绍的原理构成了监督学习的基本要素,它们是在机器学习领域是必备的内容。例如,你应该能够描述梯度提升树和随机森林之间的差异和共性。以一种形式化的方式理解这个过程,还有助于我们理解我们的学习目标,以及理解一些启发式的方法(比如剪枝和平滑)背后的道理。
2. 决策树集成(Decision Tree Ensembles)
好了,现在我们已经介绍了监督学习的组成要素,接下来让我们开始了解真正的树模型。首先,我们需要学习一下XGBoost使用的模型:决策树集成模型(decision tree ensembles)。树集成模型包含了一系列分类和回归的树模型(CART)。这里是使用CART来判断一个人是否喜欢电脑游戏的例子:
通常情况下一棵树的预测效果并不理想,我们会使用集成(Ensembles)模型,把许多树的预测结果加和起来。
K是树的数量,f是函数空间F的一个函数,F是所有可能的CART构成的集合。需要优化的目标函数是:
这里还有一个有趣的巧合:想想在随机森林中我们使用的模型是什么?没错也是树集成!所以事实上随机森林(random forests)和提升树(boosted trees)是一样的模型;区别仅仅在于我们如何训练他们罢了。也就是说,如果你写了一个使用树集成模型的预测程序,那么你不需要再写一个模型就可以让他直接用于随机森林模型。
3. 提升树(Tree Boosting)
现在我们已经介绍完了模型,接下来开始我们的训练。问题来了:如何训练这些树呢?和许多监督学习模型一样,答案是:定义一个目标函数然后优化它!
下面是目标函数(记得它应该始终包括训练误差项和正则化项):
递增训练(Additive Training)
首先我们要问:这些树模型的参数是什么?可以发现我们需要学习的是这些函数f,每一个包含了一个树的结构和一组叶子节点的分数。树结构的学习比传统的使用梯度下降就可以解决的优化模型要难很多,一次学到所有的树的参数是很困难的。因此,我们选择递增的策略:把我们已经学习到的固定,一次只增加一棵树。我们第t步的预测值写作。那么就可以得到:
那么我们还需要问:每一步要增加哪一棵树呢?一个很自然的想法是增加一棵使目标函数最优的树:
如果我们考虑使用最小均方误差(MSE)作为我们的损失函数,目标函数变为:
MSE最后结果的格式很友好,只包含一个一次项(常被称作残差)和一个二次项。在一般情况下不会这么友好,那么我们会利用泰勒展开把损失函数展开到二阶。
其中:
常量无关紧要,把他们去除之后,在第t步的目标函数就变为:
这就是我们新的树结构要优化的目标函数,它的一个很重要的好处是目标函数的值只依赖于gi和hi。这也说明了XGBoost是如何支持自定义的损失函数的。使用gi和hi作为输入,我们可以使用同一个求解器解决各种使用不同损失函数的问题,包括logistic 回归和配对排名(pairwise ranking)。
模型复杂度
我们已经介绍了训练的步骤,但是稍等,还有一个很重要的东西不要忘记:正则化项。我们需要定义模型的复杂度。定义之前,让我们先精练一下树的定义
:
这里w是表示叶子分数的向量;q是一个函数,它把每一个数据点对应到一个对应的叶子上;T是叶子的数量。在XGBoost中,我们把复杂度定义为:
当然,定义复杂度的方法不止一种,但是这种方法在实践中很有效。正则化项是大多数树模型的包中不仔细对待、甚至直接忽略掉的一部分,这是因为传统的树学习只强调改善杂质,控制复杂度的任务则交给了启发性。通过正式定义复杂度,我们可以更好地了解我们正在学习的内容,并获得在实际应用中表现良好的模型。
结构分(The Structure Score)
这里就是推导中神奇的地方了。重新构造树模型后,我们可以将第t棵树的目标函数写成: 是分配到第j 个叶节点的数据的索引的集合。注意到我们在第二行改变了求和的指标,因为分到同一个叶节点上的所有数据的得分是一样的。令:
,
,我们可以进一步简化表达式:
在这个方程里w 彼此独立,式子 是二次的,对于给定的树结构
可以得出最优的参数w 和最优的目标函数是:
最后一个方程测量了一个树结构的优劣程度。
树结构的学习
现在我们已经可以衡量一棵树的好坏。理想情况下,我们可以枚举出所有可能的树结构然后选出一个最好的;但是在实际应用中这是很难做到的,因此我们一次只优化一棵树的一层。具体来说就是,我们试着把原有的某个叶节点分成两个新的叶节点,这个操作获得的增益就是:
这个公式可以分解为以下4个部分:1. 新的左节点的分数;2. 新的右节点的分数;3. 原始叶节点的分数;4. 新增加叶节点的正则项。我们可以发现一个重要的事实:如果增益小于γ,我们最好的选择是不增加这个分支。这正式基于树模型的剪枝技术!通过使用监督学习的原理,我们可以很自然地得出这些技术起作用的原因:)
对于实数值的数据,我们经常希望找到最优的分割点。为了高效的完成这个工作,我们将所有是实数的实例值按顺序排列,如下图所示:
从左到右逐个扫描,找到所有可能的分割情况并计算出他们的值,这样我们就能有效的找到最优的分割点。
4. XGBoost后记
到现在为止,你已经理解了什么是提升树(boosted trees)了。也许你会问,关于XGBoost的介绍在哪里呢?准确的说,XGBoost是一个受本文介绍的原理启发而产生的一个工具!更重要的是,它是在系统优化和机器学习原理的基础上发展起来的。这个库的目标是将计算机的计算能力开发到极致,以提供一个可伸缩的(scalable)、可移植的(portable )、精确的(accurate)工具库。希望您能使用它,更重要的是,希望您能向社区贡献您的智慧(比如代码、例子、指南)。
![392978d406e58a04fb379cb915bb7ea8.png](https://i-blog.csdnimg.cn/blog_migrate/454a65a96a77b5f698a76af3b0ea987c.png)
![3b2f01c3bd4055e2cd50343ed471d628.png](https://i-blog.csdnimg.cn/blog_migrate/dbe17b2240b7384085ec612559c8545e.jpeg)
![c8af5abc5321e6030949c2c506e6ee0b.gif](https://i-blog.csdnimg.cn/blog_migrate/121dce1fe8844d0c47b97102d3381acd.gif)
扫码找对象