翻译自:Introduction to Boosted Trees
XGBoost 表示“极端梯度提升”,“梯度提升”源自于论文“Greedy Function Approximation: A Gradient Boosting Machine”这是一篇梯度提升书的教程。大部分内容基于 Tianqi Chen(xgboost的作者)的文章these slides
梯度提升树存在有一段时间了, 有很多参考资料. 本篇将使用监督学习的要素,以自完备和原理的方式来解释提升树. 我们觉得这种解释更清晰,更正式,也更有利于推导xgboost用到的公式
目录
监督学习的要素
XGBoost用于监督学习问题, 使用训练集(多特征) 来预测目标变量
。在我们专门学习树之前,先来复习监督学习的基本概念
模型与参数
有监督学习的模型通常指从输入 预测输出
的数学结构。一个普遍的例子是线性模型,预测方式为:
,是输入特征的线性加权。所预测的值在不同任务中有不同解释(回归和分类)。做一个逻辑斯地变换可以用于正负类别概率预测,也可作为输出的分值用于排序。
参数是未知部分,需要从数据中学习。在线性回归中,参数是系数。通常用
表示参数(模型中有很多参数,这里简略)。
目标函数:训练误差+正则化
对 的不同选择,表示了不同的任务,例如回归、分类、排序。训练任务的目标是找到能够拟合输入x和标签y的最佳参数
。为此,需要定义目标函数,以衡量模型拟合的好坏
目前函数的一个明显特征是它由两部分组成:训练误差和正则化项
是训练误差,
是正则化项。训练误差衡量了模型对训练集的估计。
的普遍选择是均方误差:
另一个选择是对数损失,用于逻辑回归:
正则化项是人们常忘记加的,它控制着模型复杂度,避免过拟合。听起来有点抽象,考虑以下问题:要拟合一个阶跃函数,输入如下左上角图. 哪个图是最好的拟合?
正确答案用红色标注了。想想这个是否一个 合理的拟合。一般原则是,我们想要一个简单且可预测的模型,两者间的权衡也成为机器学习中的偏差-方差权衡(篇末参考)
为何引入一般原则?
以上所提到的形成了监督学习的基本要素。一般是机器学习工具的组成部分。例如,你必须做到能描述梯度提升树和随机森林的区别和共性(前者boosting后者bagging)。用正规方式理解此过程有助于我们理解学习的目标,还有修剪与平滑等启发式方法的原理。
决策树融合(集成)
现在我们介绍监督学习的要素。我们从树开始. 我们先学习XGBoost 的模型选择: 决策树集成. 树集成模型由多个分类回归树(CART树)组成。以下是 CART 的简单例子,判读某人是否会喜欢一个电脑游戏X
我们将一个家庭的成员分到两片叶子中,并为其赋上叶子的值。CART树与决策树有点不同,后者叶子节点只包含了决策值。而CART树的叶子包含了实际分值,可以提供除分类信息外更多的解释。这也便于从原理上统一优化,在后面部分即将看到。
通常一棵树在实际中不够鲁棒,在实际的集成模型中,会对多棵树的预测求和.
这是一个集成两棵树的例子。每棵树预测的分值求和以获得最终分值。仔细观察会发现一个重要事实,两棵树互相补充。模型在数学上的表示为:
是树的数量,
是函数空间
中的一个函数,
是所有可能的CART 树模型。目标函数的优化:
这有一个关键问题,随机森林使用的模型是什么?树的集成! 那么随机森林和提升树是相同的模型,两者区别在训练的方式. 这意味着,如果你写为树集成写了一个可预测的服务,只需要写一个即可,它在随机森林和提升树上都能运行(详见Treelite )
树的提升
现在我们介绍模型,先看训练:如何学习一棵树? 答案正如所有监督学习模型:定义一个目标函数然后优化
目标函数如下(记住要包含训练误差和正则项):
叠加性训练
首先问个问题: 树的参数是什么? 你会发现我们需要学习那些函数 ,每个都包含了树的结构还有叶子的分值。学习树结构比传统的优化问题更难,后者只需要用到梯度。一次性学习所有树会比较难,我们使用加性策略:对我们已学到的模型进行校正,然后一次只添加一棵树。将第
步预测到的值记为
,则有:
剩余的问题: 每一步要学习什么样的树? 一个自然的想法是,能优化我们的目标的.
若考虑使用均方误差 (MSE) 作为损失函数,目标函数变为:
MSE 的形式比较友好, 一个一阶项(通常称为残差)与一个二次项。 对于其他损失函数(例如对数损失)想获得如此友好的表达式并不容易. 所以一般情况下,我们使用损失函数的二阶泰勒展开:
和
定义如下:
(泰勒展开: ,这里的x是loss function的自变量,也就是上面的y,所以x-a就是y - y(t-1),也就是f;这里的f是上面的loss function)
我们移走所有的常量,在时间步 t 的目标函数变为:
这就是训练新树的优化目标。这个定义的一个重要好处是目标函数的值只依赖于 和
. 这也是XGBoost 对普通损失函数的支持。 我们可以优化每个损失函数包括对数回归和成对排序损失,使用以
和
作为输入的求解器。
模型复杂度
我们介绍了训练步骤,但还有一件重要的事,正则化项! 我们需要定义树的复杂度 。 我们先提炼树
的定义:
是叶子节点的权值向量。
是将不同样本点分配到对应叶子节点的函数。
是叶子的个数. 在XGBoost中,我们定义复杂度为:
当然定义复杂度的方法不止一种,但这个定义在实际中效果很好。正则化项在大多数树算法包里处理的并不细致,或者直接忽略了。这是因为传统的树学习只强调改进不纯度,复杂度控制交给启发式方法。通过正规的定义,我们可以更好地了解我们学习的内容,获得一个泛化性能更好的模型。
结构分数
这是推导过程中奇妙的部分. 在重写树模型公式后,我们将第t棵树的目标函数写成:
是分配到第j片树叶的下标集合. 注意第二行的求和下标修改了,因为同一片树叶中的样本具有相同的分值。我们可以对其进一步压缩,通过定义:
和
:
等式中 互相独立。
是二次的,对给定的
而言,最优的
和最优的目标函数是:
最后一个等式衡量了一棵树结构是否够好.
如果这些听起来有点复杂,让我们看下这张图,看看分值是如何计算的. 对于给定的树结构,将统计量 和
分配到各自的叶子。对统计量求和, 然后使用公式衡量这棵树的好坏。衡量标准类似决策树的纯度度量, 除此之外还考虑了模型复杂度 .
学习树结构
现在我们有了衡量树好坏的方法,理想情况下我们要穷举所有可能的树然后选最好的,实际过程中很难,所以我们尝试一次优化树的一个方面. 我们尝试将一片叶子分为两片,然后计算树得分的增加:
这个公式可以分为:
1) 新左叶子的分值
2) 新右叶子的分值
3) 原叶子的分值
4) 新加叶子的正则化项.
我们看到一个重要的事实: 如果增益比 小,我们宁可不添加该分支,这也是树模型中的剪枝技巧 。通过使用监督学习的原理,我们可以自然得出这些技巧凑效的原因。
对于实际数据,我们通常会搜寻最优的分割。为了更有效率,我们将所有示例排好序,如下图:
一次从左到右的扫描足以计算出所有分割的分值,然后有效找出最好的
注意
加性树模型训练的限制
因为几乎不可能穷举所有情况,所以一次只加一个分割。这种方法在大多数情况下有效,但也有个别情况。对于哪些情况,训练会得到一个退化模型,因为一次只考虑一个特征维度。详见:Can Gradient Boosting Learn Simple Arithmetic?
XGBoost总结
现在你理解了什么是提升树,你可能会问,XGBOOST 的介绍呢?XGBOOST 是实现本文原理的一个工具。更重要的是,它在开发中仔细考虑了系统优化还有机器学习原理。这个库的目的在于激发机器计算的上限,提供一个可扩展、可移植、准确的库。确保你尝试过,更重要的是将你的智慧(代码、案例、教程)到社区中
本文是一篇自己的翻译,网上还有apachecn的翻译见:https://xgboost.apachecn.org/#/docs/3
XGBoost超详细推导,终于有人讲明白了 这也是篇对原文的翻译+理解