xgboost是机器学习目前使用最广、效率最高的工具。之前大概了解过xgboost的原理,说实话并没有真正的理解,甚至连它和Lightgbm的优势劣势在哪里都不知道。因此这次我打算来仔细研读陈天奇大神的Xgboost PPT,逐页翻译并加备注,这样也能帮助自己更好的理解这个算法。
原PPT链接:https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
一、监督学习的几点关键概念
- xi属于实数空间,表示第i个训练集
- 模型:常见的即为线性模型,包括了线性回归和逻辑回归。线性回归是用来预测连续型y值的,如房价;逻辑回归是用来判断类别的,如是否离职。
- 参数w,即为我们需要通过数据来计算得到的值,学习的结果即为找到合适参数w,使得计算结果 y ^ \hat{y} y^接近最接近yi。
-
目标函数也是机器学习中最重要的函数,学习的目的是让目标函数打到最小值。常见的目标函数由两部分构成:损失函数,一般为预测值和实际值的差距,衡量的是模型有多适配训练集。另一部分为正则项,通常利用正则项来调节模式,避免过拟合。
-
对于损失函数,常见的有:
- 平方差,用于一般回归
- 逻辑差,也叫交叉熵损失(Cross Entropy Loss),常用于逻辑回归
-
对于正则项,常见的也有两种:
- L2 模,即参数w的平方和再乘以系数λ
- L1模,即参数w乘以系数λ
将以上几种分类合并起来,我们就能得到以下几种模型:
- 岭回归:线性回归模型+L2正则项,利用的是平方差损失函数
- Lasso回归:线性回归模型+L1正则项,同样用平方差损失函数
- 逻辑回归:线性模型,交叉熵损失函数,L2正则项
将模型,参数,目标函数的概念分开讨论,在工程上也有益处,因为我们可以修改部分代码,就能部署不同的回归函数了。
- 这页继续强调了一下损失函数和正则项对于模型学习的不同作用。前者倾向于生成更具预测性的模型,避免欠拟合;而后者倾向于生成更简易的模型,避免过拟合。二者相辅相成。
二、 回归树集成
- 回归树模型是区别于线性模型的另一种模型,也叫CART(Classification And Regression Tree),特点是利用将特征分隔成不同的特征空间,每一个特征空间为一个叶子,每一片叶子有一个大粪。如图中所示,按照年龄分成了两组,两个叶子的得分分别为+2和-1分
案例继续,现在有另一棵决策树,以是否用电脑为分界线,分割成两组,那么新的叶子又有两个得分0.9和-0.9。那么将两棵树合在一起看,就能得到具体某个元素(即xi)的得分,即为不同决策树所在叶子的得分之和。
- 树模型目前广泛适用于数据挖掘竞赛中,常见的有GBM(gradient boosting machine,一般叫做梯度提升树算法),和Random Forest(随机森林)
- 对输入不需要进行特征正则化
- 可以在不同变量中学习到高阶关系(如两个参数的乘积这类关系)
- 可规模化,并能使用于工业中。
现在开始详解树模型。
上文提到,可以将第i个数据,在不同的树中的得分累加起来,得到一个总得分,就是这页公式的含义。
y ^ \hat{y} y^:样本在不同树模型中的总得分,也为模型预测值。
f k f_{k} fk: 第k棵树的得分表,如在上文中,小于20岁得2分,大于20岁得0.9分,就是一种f函数。k棵树共有k种函数。
这里我们可以将 f k f_{k} fk视为一个参数来训练,好比线性模型中的w
那我们应该如何学习这个参数(函数)呢?其实跟线性模型也是一样的,设置目标函数并通过训练优化它。
这里举了一个例子,如何预测我对浪漫音乐的喜爱程度(回归模型)。从散点图我们可以清晰的看到,可以将数据点分成三个阶段,即三个样本空间,可以最大程度拟合这个喜爱程度。
但是如果用到机器学习的手段,就需要一些优化过程了。
首先,需要确定的有两点,一个是需要多少个分裂点,这里可以理解为可以有多少棵树;其次,需要确定的是每一层的高度是多少,这里相当于是每一片叶子的得分。
右上的图,分裂过多,虽然每一层的得分基本可以反应实际的结果,但是会造成过拟合。
左下的图,只有一棵分裂树,模型简易,但是由于分裂点位置错误,也导致了模型错误。
只有右下的图既保证了模型的准确性,又保证了简易型,防止过拟合。
根据以上案例,我们再回到模型建立的一般步骤中。
模型函数已知,现在来考虑目标函数。前文提到,目标函数分为了损失函数和正则项,这两项都与模型函数fk有关。
但是对于树模型,对正则项的定义也能简单一点,例如使用树的节点数、深度作为正则项,或者用叶深度的L2模作为正则项。
-
当我们在讨论决策树时,它通常是启发式的(heuristics):
根据信息增益分裂树。关于信息增益,简单来说是代表了在一个条件下,信息复杂度(不确定性)减少的程度。具体展开可以百度。
修剪树枝
设置最大深度
顺滑叶得分 -
启发式的学习方法其实和目标函数也是息息相关的,例如:
信息增益对应的是训练损失
剪枝对应了根据节点的正则化修正
最大深度对应了函数空间的最大限制
顺滑叶得分则对应了对叶权重的L2正则化。
既然是CART,顾名思义,它技能用于预测回归,也能用以预测分类,这与你的目标函数的选择相关。
例如,如果用平方差作为损失函数,那就能获得一个回归树,也就是常见的GBM(Gradient Boosting Machine)。
而如果选用交叉熵作为损失函数,就能得到LogitBoost。
三、梯度提升(Gradient Boosting)算法详解
再次强调了机器学习的几点特性:
- 偏差-方差平衡
- 损失函数+正则项所构成的目标函数应用于回归树训练
- 我们想要的是具有预测性和建议的函数
-
第一行为目标函数,其中 l ( y i , y i ^ ) l(y_{i},\hat{y_{i}}) l(yi,yi^)表示损失函数,第一项需要将对所有样本求和。 Ω ( f k ) \Omega (f_{k}) Ω(fk)表示正则项,需要对k个特征的正则项进行求和。
-
为了降低目标函数,既需要让损失函数降低,即拉近预测值与实际值之间的距离,又需要让正则项降低,即降低各个特征函数的权重。
-
在这里,我们没办法使用SGD(Stochastic Gradient Decent,随机梯度下降法)。因为SGD常用来寻找的是数值解,需要有已定的目标函数;但是在这里,我们需要在确定是一个函数,而非数值解,因此无法使用。
-
解决方案是使用加法模型提升。具体来说,是将每一次的预测值,转换为前一次的预测值加上一个函数 f t ( x i ) f_{t}(x_{i}) ft(xi)。注意这里的 f t ( x i ) f_{t}(x_{i}) ft(xi)和上文的 Ω ( f k ) \Omega (f_{k}) Ω(fk)中的 f k f_{k} fk不是同一个函数。
这里对GBDT在做多一些解释,方便下文的理解。
- GBDT的思想是累加多个弱学习器,以达到强学习器的效果。
- 每一棵树,就是一个弱分类器。例如大于10岁和小于10岁是一个弱分类器,性别是另一个弱分类器,把二者的得分相加起来,就能得到一个预测值y。
- 加法模型是GBDT的常见模型,他的思路是先训练一棵树,即弱分类器,计算弱分类器与实际值的差值。接着,将该差值传到下一个弱分类器中,再计算差值与下一个分类器的差值,以此迭代。如果换个方向讲,就是每一次迭代,预测值都等于了前一次的预测值,加上了这次的树。
- 对于加法模型,正则项也与SGD算法中的L1范式L2范式有区别。在GBDT中,常见的正则项处理方式有三种(摘自百度):
1. 第一种,是对步长的调节,即每一轮迭代中对新增的树乘上一个系数v,v属于[0,1]。对于同样的训练集学习效果,较小的步长意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
2. 第二种正则化的方式是通过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
3. 第三种利用了决策树的剪枝,即正则项为α*T,T为叶子树,显然T无法过大,否则目标函数会过高。
那么我们要如何确定这个加法项ft呢,其实也是利用训练优化它。
这里先明确几个概念:
- y ^ i ( t ) \hat{y}_{i}^{(t)} y^i(t)表示,第t次迭代的第i个变量所对应的预测值。
- 将所有变量的预测值求和,才是目标函数的第一项。
将加法公式 y ^ i ( t ) = y ^ i ( t − 1 ) + f t ( x i ) \hat{y}_{i}^{(t)}=\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}) y^i(t)=y^i(t−1)+ft(xi)代入到目标函数中,可以将目标函数的第一项——损失函数变为:
∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) \sum_{i=1}^{n}l(y_{i},\hat{y}_{i}^{(t-1)}+f_{t}(x_{i})) ∑i=1nl(yi,y^i(t−1)+ft(xi))
其次,对于正则项,在原公式中,是对每一次迭代的残差函数 f i f_{i} fi求和。但是假如我们使用了上一页中提到的步长控制法,这一项其实仅与本次迭代有关。因此作者这里就将求和符号去掉了,仅留下了本次迭代所增加的决策树 f t f_{t} ft。
接着,作者举了一个例子,当损失函数为平方差时,即: