【XGBoost Tutorials】
Introduction to Boosted Trees
(译文)
原文链接:http://xgboost.readthedocs.io/en/latest/model.html
参考链接:http://blog.sina.com.cn/s/blog_7103b28a0102w6qa.html
中国科大自动化系 2014 级硕士 李睿琪
提升树简介
XGBoost 是“极限梯度提升(Extreme Gradient Boosting)”的缩写,其中术语
“梯度提升”在 Friedman 的论文“Greedy Function Approximate : A Gradient
Boosting Machine”中提出。XGBoost 是基于这个原始模型的。这是一个关于梯度
提升树的教程,大部分内容基于 XGBoost 作者的幻灯片讲义。
GBM(提升树)已经存在了一段时间,并且有很多关于这个主题的材料。本
教程尝试使用监督学习的元素,以自包含和基于规则的方式解释提升树的概念。
我们认为这种方式更清晰、更正式,并且是产生 XGBoost 这一变种的原因。
监督学习的元素
XGBoost 用于有监督学习,即使用训练数据(具有多个特征) 预测目标变
量 。开始研究树之前,我们需要回顾一下监督学习的基本要素。
模型和参数
有监督学习的模型通常指如何基于给定的 构造能够预测 的数学表达式,
例如,一种最常见的模型是线性模型,其中预测值由
给出,是输入
特征的加权线性组合。根据任务的不同,预测值可以具有不同的解释,如回归或
分类。例如,可以对预测值做逻辑变换以获得逻辑回归问题中正类的概率,在需
要对输出结果做排序时,也可以将预测值作为排序评分。
有监督学习的参数是需要从数据中学习的未确定的部分。在线性回归问题
中,参数即为系数 。一般地,我们使用符号 表示参数(在一个模型中往往有
许多参数,此处为简略的定义)。
目标函数:训练损失+正则化项
基于对 的不同理解,我们可以有不同的问题,例如回归、分类、排序等。
我们需要找到一种方法,寻找基于给定训练数据的最佳参数。为了做到这一点,
首先需要定义一个所谓的目标函数,以度量给定一组参数的模型的性能。
关于目标函数的一个非常重要的事实是,目标函数总是包含两个部分:训练
损失和正则化项。
ixiyixiyˆijijjyxiy()()()ObjL
其中 是训练损失函数, 是正则化项。训练损失函数衡量模型对训练数据
的预测型。例如,一种常用的训练损失函数是均方误差。
另一种常用的训练损失函数是逻辑回归的对数损失。
引入正则化项的作用在于控制模型复杂度,有助于避免过拟合。这听起来有
点抽象,所以让我们考虑下列图片中出现的问题。现在要求你从视觉上为左上角
图像中的输入数据点拟合阶跃函数,你认为三个解决方案中哪个最合适?
正确答案标记为红色。请考虑该答案是否看起来更为合理。一般原则是我们
需要一个简单且可预测的模型。两者之间的权衡也称为机器学习中偏差-方差权
衡。
为什么要介绍一般性原则?
上文介绍的元素构成了有监督学习的基本要素,也是机器学习工具包的基本
组件。例如,你应该能够描述提升树和随机森林之间的差异与共性。以规范化的
方式理解处理过程更有助于理解所学习的目标函数,以及剪枝、平滑等启发式方
法产生的内在原因。
树的集成
L2ˆ()()iiiLyyˆˆ()[ln(1)(1)ln(1)]iiyyiiiLyeye
我们已经介绍了有监督学习的基本元素,现在让我们开始使用真实的树模
型。首先,我们需要了解 XGBoost:树的集成模型。树的集成模型是一组分类和
回归树(classification and regression trees, CART)。这里有一个简单的 CART 示例,
分类判断一个人是否喜欢电脑游戏。
我们将一个家庭的成员分为不同的叶子节点,并在相应的叶子节点上分配分
数。CART 与决策树存在一定的不同之处,决策树的叶子节点只包含决策值,而
CART 的每一个叶子节点都与实际得分相关联,这给我们提供了超越分类结果的
更为丰富的解释。这一优点也使定义统一的优化步骤更为容易,我们将在本教程
的后半部分中看到。
通常情况下,单一的树模型不可能强到足够在实践中使用。实际使用的一般
是所谓的树的集成模型,将多个树模型的预测结果累加到一起。
这里是两棵树的集合模型的例子。将每棵树的预测分数相加以获得最终分
数。仔细研究该示例可以发现一个重要的事实,两棵树试图互补。在数学上,我
们可以将该模型写成如下的形式:
其中 是树的数目, 是函数空间 中的函数, 是所有可能的 CART 的
1ˆ(),KikikkyfxfKf
集合。因此,优化目标函数可以写为:
那么问题来了,随机森林模型是什么?随机森林模型正是树的集成!因此,
随机森林和提升树在模型方面并没有什么不同,其不同之处在于我们如何训练它
们。这就意味着在写树的集成模型的预测服务时,你只需要写某一棵子树,整个
集成模型就应该可以直接用到随机森林和提升树中。这也是我们强调有监督学习
基本元素的一个重要原因。
树的提升
介绍完模型之后,我们开始研究真实的训练过程。如何学习树模型?答案是
定义一个目标函数并且优化该函数,与所有的有监督学习过程一致。
假设我们有以下的目标函数(包含训练损失和正则化项)
累积训练
首先我们要问的是树模型的参数是什么?你可以发现我们需要学习的是函
数 ,每个函数都包含树的结构和叶子节点的分数。这比基于梯度的传统优化问
题困难得多。一次性训练所有子树并不容易。相反的,我们采用一种累积性策略:
修正已经学习到的模型,一次添加一棵新的子树。我们将第 步的预测值记为
,可以得到以下推导结果:
此时仍然需要问一个问题,我们如何选择每一次迭代时添加的子树?最自然
的解决方式是追加一个待优化的目标。
如果我们将均方误差(mean squared error, MSE)作为损失函数,以上优化
目标则可以变换为如下形式:
MSE 的形式十分友好,具有一阶残差项和二次方项。但是对于其他一些我们
感兴趣的损失函数(例如,逻辑回归损失),得到这样的理想形式并不容易。因
1ˆ()(,)()nKiikikobjlyyf()11ˆ(,)()nttiiiiiobjlyyfift()ˆtiy(0)(1)(0)11(2)(1)122()(1)1ˆ0ˆˆ()()ˆˆ()()()ˆˆ()()iiiiiiiiiitttikiitikyyfxyfxyfxfxyfxyfxyfx()()11(1)1ˆ(,)()ˆ (,())()constantntttiiiiintiititiobjlyyflyyfxf()(1)211(1)21ˆ((()))()ˆ [2()()()]()constantntttiitiiiintiitititiobjyyfxfyyfxfxf
此在一般情况下,我们直接将损失函数泰勒展开,得到其二阶形式。
其中 和 分别定义为:
移除所有常数项之后,第 步迭代的特定目标函数为
即为针对新的子树的优化目标。该定义的一个重要优点是,目标函数只取决
于 和 。这也是 XGBoost 支持自定义损失函数的原因。只要将 和 作为求解
器的输入,就可以使用完全相同的求解器优化任意一个损失函数,包括逻辑回归
和加权逻辑回归。
模型复杂度
上文我们介绍了训练步骤,但是还有一件重要的事情,正则化项!我们需要
定义树模型的复杂度
。为了完成该任务,首先需要细化树模型
的定义,
将其表达为
其中, 是表示叶子节点分数的向量, 是将每个数据点分配给相应叶子节
点的函数, 是叶子节点的总数。在 XGBoost 中,我们将复杂度定义为
当然,定义复杂度的方式有很多种,这种特定的表达式在实际应用中效果较
好。正则化是大多数树模型工具包没有认真处理或者简单忽略的一个部分,这是
因为传统的树模型学习过程只强调提高纯度,而将复杂度控制留给启发式方法。
通过正式的定义,我们可以更好地理解模型学习的是什么,而且实践证明其应用
效果很好。
结构评分
这是一个衍生出来的神奇的结论。在重构树模型后,我们可以将第 棵树的
目标值记为:
其中,
是第 个叶子节点上所有数据点的索引集合。请注意
在上述公式的第二行我们调整了求和的索引,因为同一叶子节点上的所有数据点
()(1)211ˆ[(,)()()]()constant2nttiiitiititiobjlyygfxhfxfigih(1)(1)(1)ˆ2(1)ˆˆ(,)ˆ(,)tititiiiytiiiyglyyhlyyt211[()()]()2nitiititigfxhfxfigihigih()f()fx()(),,:{1,2,,}.TdtqxfxRqRTqT211()2TjjfTt()22()()112111[]221 =[()()]2iijjnTtiqxiqxjijTijijjiIiIObjghTghT{|()}jiIiqxjj
都被赋予了同样的分数。因此我们可以通过相关定义进一步压缩该表达式:
在该方程中, 彼此间相互独立,
为二次方形式,因此
对于给定的结构
,可以分别求出最佳的 值以及最佳的目标函数解如下:
最后一个方程用于衡量树结构
的好坏。
如果理论推导听起来有些复杂,那么让我们来基于图例分析如何计算树结构
的得分。基本上,对于给定的树结构,我们自上而下的统计 和 直至叶子节点,
并将统计数据汇总在一起,使用公式计算树结构的优劣。所得分数与决策树的纯
度计算相类似,同时也将模型复杂度纳入考虑范围。
学习树的结构
基于以上推导我们得到一种衡量树结构好坏的方法,理想情况下我们需要枚
举所有可能的树并选择最优解。这种方法在实际操作中较为困难,因此我们将尝
试每次优化树的一个级别。具体来说,我们尝试将一个叶子节点分成两个叶子节
点,它获得的分数是:
()211[()]2jjjiiIjiiITtjjjjjGgHhobjGHTj21()2jjjjGH()qxj*2*112jjjTjjjGHGobjTH()qxigih222()1[]2LRLRLRLRGGGGGainHHHH
该公式可以理解为:
1)新的左叶子节点上的分数;
2)新的右叶子节点上的分数;
3)原始的叶子节点上的分数;
4)附加叶子节点上的正则化。
我们可以发现一个重要的事实:如果增益小于 ,那么最好不要添加该分支,
这也就是基于树模型的剪枝技术!通过有监督学习的一般原则,我们可以自然得
出以上技术工作的原因。
对于实值数据,我们通常希望搜索最佳分割。为了提高计算效率,一般按照
排序方式排列所有实例,如下图所示。
从左到右的扫描足以计算出所有可能的分割方式所对应的结构分数,因而可
以有效地找到最佳分割。
关于 XGBoost 的最后一点说明
现在你应该明白了什么是提升树模型,你可能要问什么,关于 XBGoost 的介
绍在哪里?XGBoost 是基于本教程所介绍的规范化原则开发出来的一套工具!更
重要的是,该工具综合考虑了系统优化和机器学习原理。XGBoost 库的设计目标
是推动机器计算的极限,提供一个可扩展、可移植且准确的算法库。确保你尝试
使用该库,更重要的是,欢迎贡献你的智慧(代码、示例、教程)到我们的社区!