XGBoost 与 Boosted Tree 原理
来源:互联网 发布:c语言中的temp 编辑:程序博客网 时间:2024/05/16 18:12
这篇文章是XGBoost的作者——陈天奇大神对XGBoost原理的解析,文章脉络十分清晰,环环相扣,每个部分都列举了对应的例子,帮助我们更好的理解原文,看完收获良多。
1、有监督学习算法的逻辑组成
要讲boosted tree,要先从有监督学习讲起。在有监督学习里面有几个逻辑上的重要组成部件,初略地分可以分为:模型,参数 和 目标函数。
i. 模型和参数
模型指给定输入xi如何去预测 输出 yi。我们比较常见的模型如线性模型(包括线性回归和logistic regression)采用了线性叠加的方式进行预测
ii. 目标函数:损失 + 正则
模型和参数本身指定了给定输入我们如何做预测,但是没有告诉我们如何去寻找一个比较好的参数,这个时候就需要目标函数登场了。一般的目标函数包含下面两项
常见的误差函数有
iii. 优化算法
讲了这么多有监督学习的基本概念,为什么要讲这些呢? 是因为这几部分包含了机器学习的主要成分,也是机器学习工具设计中划分模块比较有效的办法。其实这几部分之外,还有一个优化算法,就是给定目标函数之后怎么学的问题。之所以我没有讲优化算法,是因为这是大家往往比较熟悉的“机器学习的部分”。而有时候我们往往只知道“优化算法”,而没有仔细考虑目标函数的设计的问题,比较常见的例子如决策树的学习,大家知道的算法是每一步去优化gini entropy,然后剪枝,但是没有考虑到后面的目标是什么。
2、Boosted Tree
i. 基学习器:分类和回归树(CART)
话题回到boosted tree,我们也是从这几个方面开始讲,首先讲模型。Boosted tree 最基本的组成部分叫做回归树(regression tree),也叫做CART。
上面就是一个CART的例子。CART会把输入根据输入的属性分配到各个叶子节点,而每个叶子节点上面都会对应一个实数分数。上面的例子是一个预测一个人是否会喜欢电脑游戏的 CART,你可以把叶子的分数理解为有多可能这个人喜欢电脑游戏。有人可能会问它和decision tree的关系,其实我们可以简单地把它理解为decision tree的一个扩展。从简单的类标到分数之后,我们可以做很多事情,如概率预测,排序。
ii. Tree Ensemble
一个CART往往过于简单无法有效地预测,因此一个更加强力的模型叫做tree ensemble。
在上面的例子中,我们用两棵树来进行预测。我们对于每个样本的预测结果就是每棵树预测分数的和。到这里,我们的模型就介绍完毕了。现在问题来了,我们常见的随机森林和boosted tree和tree ensemble有什么关系呢?如果你仔细的思考,你会发现RF和boosted tree的模型都是tree ensemble,只是构造(学习)模型参数的方法不同。第二个问题:在这个模型中的“参数”是什么。在tree ensemble中,参数对应了树的结构,以及每个叶子节点上面的预测分数。
最后一个问题当然是如何学习这些参数。在这一部分,答案可能千奇百怪,但是最标准的答案始终是一个:定义合理的目标函数,然后去尝试优化这个目标函数。在这里我要多说一句,因为决策树学习往往充满了heuristic。 如先优化吉尼系数,然后再剪枝啦,限制最大深度,等等。其实这些heuristic的背后往往隐含了一个目标函数,而理解目标函数本身也有利于我们设计学习算法,这个会在后面具体展开。
对于tree ensemble,我们可以比较严格的把我们的模型写成是:
其中每个f是一个在函数空间(F)里面的函数,而F对应了所有regression tree的集合。我们设计的目标函数也需要遵循前面的主要原则,包含两部分
iii. 模型学习:additive training
其中第一部分是训练误差,也就是大家相对比较熟悉的如平方误差, logistic loss等。而第二部分是每棵树的复杂度的和。这个在后面会继续讲到。因为现在我们的参数可以认为是在一个函数空间里面,我们不能采用传统的如SGD之类的算法来学习我们的模型,因此我们会采用一种叫做additive training的方式(另外,在我个人的理解里面,boosting就是指additive training的意思)。每一次保留原来的模型不变,加入一个新的函数
现在还剩下一个问题,我们如何选择每一轮加入什么f呢?答案是非常直接的,选取一个f来使得我们的目标函数尽量最大地降低。
这个公式可能有些过于抽象,我们可以考虑当ll是平方误差的情况。这个时候我们的目标可以被写成下面这样的二次函数:
更加一般的,对于不是平方误差的情况,我们会采用如下的泰勒展开近似来定义一个近似的目标函数,方便我们进行这一步的计算。
当我们把常数项移除之后,我们会发现如下一个比较统一的目标函数。这一个目标函数有一个非常明显的特点,它只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。有人可能会问,这个材料似乎比我们之前学过的决策树学习难懂。为什么要花这么多力气来做推导呢?
因为这样做使得我们可以很清楚地理解整个目标是什么,并且一步一步推导出如何进行树的学习。这一个抽象的形式对于实现机器学习工具也是非常有帮助的。传统的GBDT可能大家可以理解如优化平法aa残差,但是这样一个形式包含可所有可以求导的目标函数。也就是说有了这个形式,我们写出来的代码可以用来求解包括回归,分类和排序的各种问题,正式的推导可以使得机器学习的工具更加一般。
iv. 树的复杂度
到目前为止我们讨论了目标函数中训练误差的部分。接下来我们讨论如何定义树的复杂度。我们先对于f的定义做一下细化,把树拆分成结构部分q和叶子权重部分w。下图是一个具体的例子。结构函数q把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么。
当我们给定了如上定义之后,我们可以定义一棵树的复杂度如下。这个复杂度包含了一棵树里面节点的个数,以及每个树叶子节点上面输出分数的
v. 关键步骤
接下来是最关键的一步,在这种新的定义下,我们可以把目标函数进行如下改写,其中I被定义为每个叶子上面样本集合
这一个目标包含了T个相互独立的单变量二次函数。我们可以定义
那么这个目标函数可以进一步改写成如下的形式,假设我们已经知道树的结构q,我们可以通过这个目标函数来求解出最好的w,以及最好的w对应的目标函数最大的增益
vi. 打分函数计算举例
Obj代表了当我们指定一个树的结构的时候,我们在目标上面最多减少多少。我们可以把它叫做结构分数(structure score)。你可以认为这个就是类似吉尼系数一样更加一般的对于树结构进行打分的函数。下面是一个具体的打分函数计算的例子
vii. 枚举所有不同树结构的贪心法
所以我们的算法也很简单,我们不断地枚举不同树的结构,利用这个打分函数来寻找出一个最优结构的树,加入到我们的模型中,再重复这样的操作。不过枚举所有树结构这个操作不太可行,所以常用的方法是贪心法,每一次尝试去对已有的叶子加入一个分割。对于一个具体的分割方案,我们可以获得的增益可以由如下公式计算
对于每次扩展,我们还是要枚举所有可能的分割方案,如何高效地枚举所有的分割呢?我假设我们要枚举所有
- XGBoost 与 Boosted Tree 原理
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree
- XGBoost 与 Boosted Tree(GBDT)(转)
- The theory of XGBoost and Boosted Tree
- Boosted Tree
- Boosted Tree
- XGBoost Boosted Trees的介绍
- XGBoost原理与应用
- gradient boosted regression tree
- 别人说的Boosted Tree
- xgboost算法原理与实战
- xgboost入门与实战(原理篇)
- 关于telnet登录
- BZOJ1001狼抓兔子
- AlertDialog图片文本列表
- 前台系统首页面的广告问题
- 香港云主机CentOS系统上安装strongSwan搭建IPsec VPN服务器
- XGBoost 与 Boosted Tree 原理
- Android Studio 报错: Failed to complete Gradle execution 然后又报错Unknown command-line option '-X'.
- Linux下socket多路复用应用--select函数
- js数据类型 数据类型的种类 变量 算数运算符 逻辑运算符 位运算符
- 如何循序渐进的学习javascript
- Chapter02 网络(二) 获取Web数据
- 简单教程---MySQL从下载到配置
- Servlet中出现:Server Tomcat v7.0 Server at localhost failed to start.错误
- js是什么