Author : Jasper Yanghtml
School : Buptgit
这是一篇翻译文,翻译的内容是 XGBoost 官网的原理介绍 Introduction to Boosted Trees 这篇文章。github
如需转载请注明。我本身在作实验中感受遇到了瓶颈,我认为是我对这个模型的熟悉度太差,于是须要补一补知识,也但愿能帮到你们。app
在本文以前给你们推荐一个别人写的关于 XGBoost 参数调优的,仍是挺详细的,分享一下 XGBOOST参数调优 。好了,下面就是翻译内容了,可能会夹杂着我本身的理解。dom
XGBoost 是 极致梯度迭代(这个翻译不知道准不许确)的缩写。梯度迭代这个概念是在 Greedy Function Approximation: A Gradient Boosting Machine, by Friedman 这篇文章中提出来的。XGBoost正是基于这个原始模型。函数
GBM(boosted trees) 已经出现了有段时日了,在这个话题上有不少的资料。这篇导读但愿用监督学习的元素来独立有原则地解释提高树(boosted trees)。性能
XGBoost 用于解决监督学习的问题,咱们用 $ x_{i} $ 去预测 $y_{i}$。在进入树以前,咱们先回顾一下监督学习中的基本元素。学习
监督学习里的模型一般与如何经过$ x_{i} $ 去预测 $y_{i}$的算术结构有关。举例来讲,一个线性模型,预测函数是
$$ y^i=\sum_{j}θ_jx_{ij}y^i=\sum_{j}θ_jx_{ij} $$。
预测值能够有基于不一样任务的不一样的解释(好比,回归或是分类)。举例,当咱们须要对输出排序时,能够用逻辑斯蒂转换获得在逻辑回归中正类的几率,也能够把输出值当成排序得分。优化
参数是咱们须要从数据中获得的不肯定部分。在线性回归问题中,参数是系数 θ 。一般咱们用 θ 来指示参数(在模型中有不少参数,咱们的定义十分草率)spa
基于不一样的 $y_i$的理解咱们能够有不用的问题,好比回归,分类,排序等等。咱们须要找出训练数据最好的参数。为了找出,咱们须要定义所谓的损失函数来衡量模型的性能
损失韩式必定须要包括两个部分:训练偏差 + 正则。
$$Obj(Θ)=L(θ)+Ω(Θ)$$
L 是训练偏差函数,Ω 是正则项。训练偏差衡量咱们的模型对训练数据的预测的能力。通常来说是方差,以下(这个使用什么样的偏差衡量在参数中能够设置,如均方根-rsme),
$$L(θ)=\sum_{i}(y_i−\hat{y_i})2 $$
另外一个经常使用的损失函数,是逻辑回归函数的逻辑损失函数。
$$L(θ)=\sum_{i}[y_iln(1+e^{−y^i})+(1−y_i)ln(1+e^\hat{y^i})]$$
人们常常会忘记加上正则项。正则项控制了模型的复杂程度,可以帮助咱们去防止过拟合。这样听起来有点抽象。让咱们考虑下图这样一个问题。(我认为过拟合这类东西咱们已经倒背如流了,这里不必翻译了,这篇文章讲的是有点鸡婆了)
红色的是正确的作法。
上面介绍的东西组成了监督学习的基础元素。(因此说监督学习很简单 :)))咱们可使用上面的原理来衡量提高树和随机森林的不一样和公平性。在书面意义上理解原理能够帮助咱们学习例如剪枝和平滑这类发散式方法后面的缘由。
介绍完了监督学习的基本内容,如今让咱们开始接触真正的树。开始以前,咱们先学习XGBoost的模型:树的集合。一个树集合模型是一个分类回归树(CART)的集合。下面是CART的一个例子,对是否喜欢电脑游戏进行分类。
咱们将家庭成员分到不一样的叶子节点中,并在相应的叶子节点上赋予得分。一个CART和决策树有些许不一样,决策树的叶子结点只有决策值。在 CART 里,最终的得分和每个叶子结点有关,给予咱们一个更加丰富的分类以外的解释。这同时让统一优化的步骤更加容易,在后面咱们会见到。
通常来说,单棵树在现实中不够强大。这就是为何咱们须要可以把多棵树预测值想加的树集合的模型。
上面这是两棵树的树集合的例子。每一棵树的结果想加获得最后的结果。一个重要的因素,两棵树都尝试去补充对方。数学上来说,咱们能够将咱们的模型写出以下形式。
$$\hat{y^i}=\sum_{k=1}^{K}f_k(x_i),f_k∈\mathcal{F}$$
K表明树的个数,f是函数空间$mathcal{F}$里的一个函数,$mathcal{F}$是全部可能的 CART 的集合。因此咱们优化的目标函数(也就是加了正则后的损失函数)能够写成
$$obj(θ)=\sum_{i}^{n}l(y_i,\hat{y_i})+\sum_{k=1}^{K}Ω(f_k)$$
如今咱们有个问题,随机森林的模型是什么样的?就正是树集合!因此随机森林和提高树在模型的形式上没有不一样,不一样在与咱们怎么去训练他们。这意味着你若是写了一个树集合的预测服务,你仅仅须要去实现其中一种而且这个服务随机森林或者提高树下都能运行。
# 这一段我想把英文贴出来,由于我不肯定最后两句话我翻译的是否准确 Now here comes the question, what is the model for random forests? It is exactly tree ensembles! So random forests and boosted trees are not different in terms of model, the difference is how we train them. This means if you write a predictive service of tree ensembles, you only need to write one of them and they should directly work for both random forests and boosted trees. One example of why elements of supervised learning rock
模型介绍完了,让咱们开始真实的训练环节。咱们怎么去学习这些树呢?答案和全部的监督学习模型的方法是同样的:定义一个目标函数并优化它
假设咱们有以下目标函数。
$$obj=\sum_{i}^{n}l(y_i,\hat{y_i}^{(t)})+\sum_{i=1}^{t}Ω(f_i)$$
咱们要问树的参数是什么?你发现咱们须要学习的是 $f_i $ 函数(每一个都包含了树的结构和叶子得分)。这比起传统的能够用梯度降低解决的优化问题可贵多。一会儿训练全部的树不太现实。因此咱们采用了加和策略:拟合咱们已经学习的,而后每一次增长一个新的树。咱们把在step t 的预测值写成
$$\hat{y_i}^{(t)}$$
,因此咱们获得以下
$$\hat{y}_i^{(0)} = 0$$
$$\hat{y}_i^{(1)} = f_1(x_i) = \hat{y}_i^{(0)} + f_1(x_i) $$
$$\hat{y}_i^{(2)} = f_1(x_i) + f_2(x_i)= \hat{y}_i^{(1)} + f_2(x_i) $$
$$\dots $$
$$\hat{y}_i^{(t)} = \sum_{k=1}^t f_k(x_i)= \hat{y}_i^{(t-1)} + f_t(x_i)$$
咱们仍是须要提问:在每一步中,哪一棵树咱们须要?最天然的作法是加上一个咱们的优化目标。
$$\text{obj}^{(t)} = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t)}) + \sum_{i=1}^t\Omega(f_i) $$
$$\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t) + constant$$
若是咱们使用MSE当咱们的损失函数,上式就变成以下形式
$$\text{obj}^{(t)} = \sum_{i=1}^n (y_i - (\hat{y}_i^{(t-1)} + f_t(x_i)))^2 + \sum_{i=1}^t\Omega(f_i) $$
$$\quad\quad\quad\quad\quad\quad\quad\quad = \sum_{i=1}^n [2(\hat{y}_i^{(t-1)} - y_i)f_t(x_i) + f_t(x_i)^2] + \Omega(f_t) + constant$$
MSE的形式很友好(包含一个一次项,也叫冗余项,和一个二次项)。对于其余的损失函数来讲,获得一个好的形式很不容易。因此在大部分的状况下,咱们用展开到二级的泰勒展式
$$\text{obj}^{(t)} = \sum_{i=1}^n [l(y_i, \hat{y}_i^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t) + constant$$
$g_i$和$h_i$定义以下
$$g_i = \partial_{\hat{y}_i^{(t-1)}} l(y_i, \hat{y}_i^{(t-1)})$$
$$h_i = \partial_{\hat{y}_i^{(t-1)}}^2 l(y_i, \hat{y}_i^{(t-1)})$$
当咱们把全部的常熟都去除掉后,在step t的特殊的目标函数变成了
$$\sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t)$$
这变成了咱们对新树的目标函数。这样的定义的一个重要的优势是这个方程只依赖于$g_i$和$h_i$。这就是XGBoost怎么支持定制的损失函数。咱们用只需$g_i$和$h_i$做为输入的求解程序最优化包括逻辑回归和加权逻辑回归的每个损失函数。
咱们已经介绍了训练的步骤,可是还有一个重要的事情没提到!就是正则!咱们须要定义树的复杂度 Ω(f)。让咱们先定义树的方程 f(x)
$$f_t(x) = w_{q(x)}, w \in R^T, q:R^d\rightarrow \{1,2,\cdots,T\}$$
在这里 w 是叶子结点上得分的向量,q是一个给每一个相应叶子结点赋值的方程,以及 T 是叶子结点的数量。在XGBoost中咱们定义复杂度以下
$$\Omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2$$
固然,有许许多多的方式去定义复杂度,但这个是在实践中特别有效的一个。正则在不少 的树实现的包里不受重视。这是由于传统的树学习仅仅强调减小杂质。定义了正则后,咱们能够更好的知道咱们在学习什么。
这里有关于求导的一个神奇的地方。当咱们从新定义树模型后,咱们能够把第t棵树的目标函数写成以下
$$Obj^{(t)} \approx \sum_{i=1}^n [g_i w_{q(x_i)} + \frac{1}{2} h_i w_{q(x_i)}^2] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2$$
$$\quad= \sum^T_{j=1} [(\sum_{i\in I_j} g_i) w_j + \frac{1}{2} (\sum_{i\in I_j} h_i + \lambda) w_j^2 ] + \gamma T$$
$I_j = {i|q(x_i)=j}$是对于$q(x_i)=j$的一系列数据点的集合。注意到在第二行咱们修改了求和的索引,由于同一个叶子结点上的全部数据有一样的得分。咱们能够再次压缩这个方程,定义:
$$G_j = \sum_{i\in I_j} g_i $,$H_j = \sum_{i\in I_j} h_i$$。
$$\text{obj}^{(t)} = \sum^T_{j=1} [G_jw_j + \frac{1}{2} (H_j+\lambda) w_j^2] +\gamma T$$
在这个方程中,$w_j$是相互独立的,
$$G_jw_j+12(H_j+λ)w^2_jG_jw_j+12(H_j+λ)w_j^2 $$
是二次的,在给定q(x)状况下咱们能获得的最好的$w_j$和最好的目标函数的减小以下
$$w_j^\ast = -\frac{G_j}{H_j+\lambda}$$
$$\text{obj}^\ast = -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j+\lambda} + \gamma T$$
后一个方程衡量了树结构q(x)有多好
若是以上全部听起来有点复杂,让咱们看一看这幅图,看看得分是怎么倍计算的。基本上,咱们在每一个叶子节点上计算$g_i$和$h_i$,将统计累加起来,再使用公式计算得出树的好坏。若是不考虑计算得分中加入了模型复杂度,其实得分就像是在决策树里的不纯度。
如今咱们知道怎么去衡量一棵树的好坏了,理想状况下咱们会枚举全部可能的树而后选择最好的。但其实是不可能的,因此咱们会尝试去一次优化一个等级。特别是在咱们尝试去讲一个叶子结点分红两个叶子是,这个叶子的得分计算为
$$Gain = \frac{1}{2} \left[\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}\right] - \gamma$$
这个公式能够分解成
新的左叶子的得分
新的右叶子的得分
原始叶子的得分
新加的叶子的正则
咱们能够观察到一个重要的因素:若是 gain 小于 γ,咱们就决定不分叉。这就是基于树模型的剪枝技术。使用了监督学习的原则,咱们很天然地想到为何这个技术可以有效 :)
对于真实值得数据,咱们老是想找到最佳的切分。为了有效地达到目的,咱们将全部的实例排序,以下图
从左到右的扫描后咱们就能获得最可能的切分方式。
如今你明白了什么事提高树,你也许会问,哪里有XGBoost的文档。 Github 传送门在此,别的很少说了,去实践吧。
翻译的很辛苦,但愿可以帮到大家!~
paper done 2017/4/23