以下内容均转自:https://juejin.im/entry/5b5f0b78f265da0f900e2906,存下来以便日后查阅。
XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用在一些比赛中,其效果显著。它是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包。下面我们将XGBoost的学习分为3步:①集成思想 ②损失函数分析 ③求解。我们知道机器学习三要素:模型、策略、算法。对于集成思想的介绍,XGBoost算法本身就是以集成思想为基础的。所以理解清楚集成学习方法对XGBoost是必要的,它能让我们更好的理解其预测函数模型。在第二部分,我们将详细分析损失函数,这就是我们将要介绍策略。第三部分,对于目标损失函数求解,也就是算法了。
一、集成思想
在学习XGBoost之前,我们得需要先明白集成思想。集成学习方法是指将多个学习模型组合,以获得更好的效果,使组合后的模型具有更强的泛化能力。另外XGBoost是以分类回归树(CART树)进行组合。故在此之前,我们先看下CART树(CART树具体原理请自行复习,或者可以留言)。如下,通过输入用户年龄、性别进行判断用户是否喜欢玩游戏的得分值。由此得到一颗CART树模型。
我们知道对于单个的决策树模型容易出现过拟合,并且不能在实际中有效应用。所以出现了集成学习方法。如下图,通过两棵树组合进行玩游戏得分值预测。其中tree1中对小男生的预测分值为2,tree2对小男生的预测分值为0.9。则该小男生的最后得分值为2.9。
将上面集成学习方法推广到一般情况,可知其预测模型为:
其中为树的总个数,
表示第
颗树,
表示样本
的预测结果。
损失函数为:
其中为样本
的训练误差,
表示第
颗树的正则项。
二、损失函数
上面一部分我们知道了集成学习方法的预测模型,因为XGBoost也是集成学习方法的一种。对于XGBoost的预测模型同样可以表示为:
其中为树的总个数,
表示第
颗树,
表示样本
的预测结果。
其中损失函数也同样表示为:
其中为样本
的训练误差,
表示第
棵树的正则项。
看到了这里,我们可能会想到,现在知道了模型预测函数和损失函数,那我们是不是直接就能求出其预测模型了呢?答案肯定不是,我们首先需要明确知道优化和求解的参数是什么呢?由上面的预测模型中,我们可以看到对于每棵树的预测值 是如何计算的?想到这里,你就已经知道了需要做的事了,我需要求解和优化的就是每个叶子节点的得分值,也就是
的值。另外 我们知道XGBoost是以CART树中的回归树作为基分类器,在给定训练数据后,其单个树的结构(叶子节点个数、树深度等等)基本可以确定了。但XGBoost并不是简单重复的将几个CART树进行组合。它是一种加法模型,将模型上次预测(由t-1棵树组合而成的模型)产生的误差作为参考进行下一棵树(第t棵树)的建立。以此,每加入一棵树,将其损失函数不断降低。如下图就为加法模型案例,它将模型预测值与实际值残差作为下一颗树的输入数据。
对于加法策略可以表示如下:
初始化(模型中没有树时,其预测结果为0):
往模型中加入第一棵树:
往模型中加入第二棵树:
…
往模型中加入第t棵树:
其中表示第
棵树,
表示组合
棵树模型对样本
的预测结果。
我们知道,每次往模型中加入一棵树,其损失函数便会发生变化。另外在加入第t棵树时,则前面第t-1棵树已经训练完成,此时前面t-1棵树的正则项和训练误差都成已知常数项。对于每棵树的正则项部分,我们将在后面再细说。
如果损失函数采用均方误差时,其目标损失函数变为:
另外对于目标损失函数中的正则项(复杂度)部分,我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成:
其中为叶子节点的得分值,
表示样本
对应的叶子节点。
为该树的叶子节点个数。
因此,在这里。我们将该树的复杂度写成:
复杂度计算例子如下:
此时,对于XGBoost的目标函数我们可以写为:
三、求解
在推导之前,我们先介绍下泰勒展开式:
这里我们用泰勒展开式来近似原来的目标函数,将看作
。则原目标函数可以写成:
令,
,同时对于第t棵树时,
为常数。同时去除所有常数项。故目标损失函数可以写成:
由上面介绍书的复杂度时,我们知道:,同时我们将目标函数全部转换成在第t棵树叶子节点的形式。因为目前对于
可以看做是每个样本在第t棵树的叶子节点得分值相关函数的结果之和,所以我们也能从第t棵树的叶子节点上来表示。
其中为第t棵树中总叶子节点的个数,
表示在第
个叶子节点上的样本,
为第
个叶子节点的得分值。
在这里,令,
。
则:
对求偏导,并使其导函数等于0,则有:
求解得:
其目标函数可以为:
到此,推导完成。