Boosted Trees 简介
# Boosted Trees 介绍
官方地址原文介绍:https://github.com/dmlc/xgboost.git
Boosted Trees 是一种机器学习算法,它使用多棵决策树来提高模型的预测准确性。Boosted Trees 的主要思想是将多棵树组合起来,以提高模型的泛化能力和鲁棒性。Boosted Trees 是一种通用的机器学习算法,可以使用不同的损失函数和优化算法来实现。随机森林通过构建多个相互独立的决策树来形成一个强学习器。提升树通过逐步构建多个决策树,每棵新树尝试修正前一棵树的错误预测。
XGBoost 是一种具体的 Boosted Trees 算法实现,它是由 Tianqi Chen 等人在 2014 年开发的。XGBoost 是一个开源的机器学习库,提供了一个高效、可扩展的 Boosted Trees 实现。XGBoost 使用了许多技术来提高模型的性能,例如二阶梯度优化、列抽样、并行计算等。
XGBoost 代表“Extreme Gradient Boosting”,其中“Gradient Boosting”一词源自 Friedman 的论文 Greedy Function Approximation: A Gradient Boosting Machine。XGBoost 是一个优化的分布式梯度提升库,旨在高效、灵活和便携。 它在 Gradient Boosting 框架下实现机器学习算法。 XGBoost 提供了并行树提升(也称为 GBDT、GBM),可以快速准确地解决许多数据科学问题。 相同的代码在主要分布式环境(Kubernetes、Hadoop、SGE、Dask、Spark、PySpark)上运行,可以解决超过数十亿个示例的问题。
梯度提升树已经存在了一段时间,有很多相关的材料。本教程将使用监督学习的元素,以自包含和原则的方式解释提升树。我们认为这种解释更加清晰、正式,并激发了 XGBoost 中使用的模型公式。
# 监督学习要素
XGBoost 用于监督学习问题,其中我们使用训练数据(具有多个特征)
# 模型和参数
监督学习中的模型通常指的是通过输入
参数是我们需要从数据中学习的未确定部分。在线性回归问题中,参数是系数
# 目标函数:训练损失 + 正则化
通过对
目标函数的一个显著特征是它由两部分组成:训练损失和正则化项:
其中
另一个常用的损失函数是用于逻辑回归的逻辑损失:
正则化项是人们通常忘记添加的部分。正则化项控制模型的复杂度,帮助我们避免过拟合。这个听起来有点抽象,所以让我们考虑以下图中的问题。你被要求根据图中左上角的数据点拟合一个阶跃函数。你认为哪种解决方案是最好的拟合?
正确答案用红色标记。请考虑这在视觉上是否是一个合理的拟合。一般原则是我们既想要一个简单又具有预测性的模型。两者之间的权衡在机器学习中也被称为偏差-方差权衡。
# 为什么介绍一般原则?
上面介绍的要素构成了监督学习的基本要素,它们是机器学习工具包的自然构件。例如,你应该能够描述梯度提升树和随机森林之间的差异和共同点。以正式化的方式理解这个过程也有助于我们理解我们在学习的目标以及诸如剪枝和平滑等启发式方法背后的原因。
# 决策树集成
现在我们已经介绍了监督学习的要素,让我们开始了解真实的树模型。首先,让我们了解 XGBoost 的模型选择:决策树集成。树集成模型由一组分类和回归树(CART)组成。以下是一个 CART 的简单示例,用于分类某人是否会喜欢假想的计算机游戏 X。
我们将一个家庭的成员分类到不同的叶子上,并在相应的叶子上赋予他们分数。CART 与决策树有点不同,决策树的叶子仅包含决策值。在 CART 中,每个叶子都关联一个实际分数,这为我们提供了超越分类的更丰富的解释。这也允许我们在优化时使用一种有原则的、统一的方法,如我们将在本教程后面部分看到的。
通常,单棵树不够强大,无法在实际中使用。实际使用的是集成模型,它将多棵树的预测结果相加。
这是一个由两棵树组成的树集成的示例。每棵树的预测分数相加得到最终分数。如果你看看这个示例,一个重要的事实是这两棵树试图互补。数学上,我们可以将模型写成以下形式
其中
其中
现在来个有趣的问题:随机森林使用的模型是什么?树集成!所以随机森林和提升树实际上是相同的模型;区别在于我们如何训练它们。这意味着,如果你为树集成写了一个预测服务,你只需写一个,它应该同时适用于随机森林和梯度提升树。(请参见 Treelite (opens new window) 了解实际示例。)这就是监督学习要素如此重要的一个例子。
树提升
# Tree Boosting
现在我们介绍了模型,让我们来讨论训练:我们应该如何学习这些树?答案是,和所有监督学习模型一样:定义目标函数并优化它!
以下是目标函数(记住它总是包含训练损失和正则化):
# Additive Training
我们首先要问的问题是:树的参数是什么?你会发现我们需要学习的是那些函数
我们还需要问:每一步我们需要哪棵树?每一步添加的树
如果我们考虑使用均方误差(MSE)作为损失函数,则目标变为
MSE 的形式很友好,有一个一阶项(通常称为残差)和一个二阶项。对于其他感兴趣的损失(例如逻辑损失),不容易得到如此好的形式。因此在一般情况下,我们对损失函数进行二阶泰勒展开:
泰勒公式:
损失函数进行二阶泰勒展开
其中
在我们移除所有常数后,步骤
这成为我们新树的优化目标。这个定义的一个重要优点是目标函数的值仅依赖于
# Model Complexity
我们已经介绍了训练步骤,但等等,还有一个重要的事情,正则化项!我们需要定义树
这里
当然,有不止一种定义复杂度的方法,但这种方法在实践中效果很好。正则化是大多数树包处理得不太仔细的部分,或简单忽略。这是因为传统的树学习处理仅强调提高纯度,而复杂度控制留给了启发式方法。通过正式定义,我们可以更好地了解我们在学习什么,并获得在实际中表现良好的模型。
# The Structure Score
这里是推导的神奇部分。在重新定义树模型后,我们可以用
其中
在这个方程中,
最后一个等式衡量树结构
如果所有这些听起来有点复杂,让我们看看图片,看看如何计算分数。基本上,对于给定的树结构,我们将统计
# Learn the tree structure
现在我们有了一种方法来衡量一棵树的好坏,在实际中,由于枚举所有可能的树结构是不可能的,我们采用的是逐步添加的方法:每次仅添加一个分裂。具体来说,我们试图将一个叶子节点分成两个叶子节点,并计算其增益(Gain)。公式如下:
此公式可以分解为以下部分:
新左叶子的得分。
新右叶子的得分。
原叶子的得分。
新增叶子的正则化项。
我们可以得出一个重要结论:如果增益小于
对于连续值数据,我们通常希望寻找最佳分裂点。为了有效地实现这一点,我们将所有实例按某一特征值排序,如下图所示。
从左到右扫描就足以计算所有可能分裂方案的结构得分,从而高效地找到最佳分裂点。
[!NOTE]
注意:加法树学习的局限性
由于枚举所有可能的树结构是不可能的,我们采用逐步添加的方法,即每次仅添加一个分裂。这种方法在大多数情况下效果良好,但在某些极端情况下可能会失败,因为我们每次只考虑一个特征维度。有关示例,请参见 Can Gradient Boosting Learn Simple Arithmetic? (opens new window)。
# 关于 XGBoost 的最后话语
现在你已经了解了什么是提升树,你可能会问,XGBoost 的介绍在哪里?XGBoost 是一个受本教程中介绍的正式原理所激发的工具!更重要的是,它是在系统优化和机器学习原理方面经过深思熟虑开发的。这个库的目标是将机器的计算极限推向极致,提供一个可扩展、可移植和准确的库。确保你尝试一下,最重要的是,为社区贡献你的智慧(代码、示例、教程)!