机器学习 -- XGBoost算法学习笔记

前言

目前风控算法较为流行的是传统机器学习,如:逻辑回归, x g b o o s t xgboost xgboost,加业务理解挖掘高效特征,结合策略建立评分卡,反欺诈模型。之前没有系统学习过,现在开始捡起来,好记性不如烂笔头,若有勘误,请指出。

1. 基本概念

x g b o o s t xgboost xgboost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用在一些比赛中,其效果显著。 x g b o o s t xgboost xgboost所应用的算法就是 G B D T GBDT GBDT(gradient boosting decision tree)的改进,既可以用于分类也可以用于回归问题中。

1.1 回归树与决策树

事实上,分类与回归是一个型号的东西,只不过分类的结果是离散值,回归是连续值,本质是一样的,都是特征( f e a t u r e feature feature)到结果/标签( l a b e l label label)之间的映射。

分类树的样本输出(即响应值)是类的形式,如判断蘑菇是有毒还是无毒,周末去看电影还是不去。而回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,可以是0到100万元之间的任意值。

那么,这时候你就没法用上述的信息增益、信息增益率、基尼系数来判定树的节点分裂了。你就会采用新的方式:预测误差,常用的有均方误差、对数误差等。而且节点不再是类别(离散值),而是数值(预测值),那么怎么确定呢?有的是节点内样本均值,有的是通过最优化算出来的比如 x g b o o s t xgboost xgboost

x g b o o s t xgboost xgboost所用到的树模型则是 C A R T CART CART回归树模型。讲解其原理前,先讲解一下 C A R T CART CART回归树。

1.2 CART回归树

C A R T CART CART回归树是假设树为二叉树,通过不断将特征进行分裂。比如当前树结点是基于第 j j j 个特征值进行分裂的,设该特征值小于 s s s 的样本划分为左子树,大于 s s s 的样本划分为右子树。
R 1 ( j , s ) = { x ∣ x j ≤ s } a n d R 1 ( j , s ) = { x ∣ x j > s } \textstyle R_1(j,s)=\{ x | x^{j} \le s \} \quad and \quad R_1(j,s)=\{ x | x^{j} > s \} R1(j,s)={xxjs}andR1(j,s)={xxj>s}

C A R T CART CART回归树实质上就是在该特征维度对样本空间进行划分,而这种空间划分的优化是一种NP问题,因此,在决策树模型中是使用启发式方法解决。典型 C A R T CART CART回归树产生的目标函数为:
∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_i\in R_m}(y_i-f(x_i))^2 xiRm(yif(xi))2

平方损失函数,希望预测值与真实值之间足够接近。因此,当我们为了求解最优的切分特征 j j j 和最优的切分点 s s s,就转化为求解这么一个目标函数:
min ⁡ j , s [ min ⁡ c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min ⁡ c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min \limits _{j,s}[\min \limits_{c_1} \sum_{x_i\in R_1(j,s)} (y_i-c_1)^2+ \min \limits_{c_2} \sum_{x_i\in R_2(j,s)} (y_i-c_2)^2] j,smin[c1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2]

所以我们只要遍历所有特征的的所有切分点,就能找到最优的切分特征和切分点。最终得到一棵回归树。

1.3 boosting集成学习

b o o s t i n g boosting boosting集成学习,由多个相关联的决策树联合决策,什么叫相关联?

举个例子:有一个样本

f e a t u r e feature feature l a b e l label label
2,4,54

第一棵决策树用这个样本训练得预测为3.3
那么做为第二棵决策树训练时的输入,这个样本就变成了

f e a t u r e feature feature l a b e l label label
2,4,50.7

也就是说,下一棵决策树输入样本会与前面决策树的训练和预测相关。

与之对比的是 r a n d o m f o r e a s t random foreast randomforeast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有任何关系。

1.4 回归树形成的关键点

1、分裂点依据什么来划分(如前面说的均方误差最小, l o s s loss loss);
2、分类后的节点预测值是多少(如前面说,有一种是将叶子节点下各样本实际值得均值作为叶子节点预测误差,或者计算所得)

2. 集成思想

集成学习方法是指将多个学习模型组合,以获得更好的效果,使组合后的模型具有更强的泛化能力。

Boosting法是结合多个弱学习器给出最终的学习结果,不管任务是分类或回归,我们都用回归任务的思想来构建最优Boosting模型 。
回归思想:把每个弱学习器的输出结果当成连续值,这样做的目的是可以对每个弱学习器的结果进行累加处理,且能更好的利用损失函数来优化模型。

x g b o o s t xgboost xgboost通过不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。

经典例子:通过输入用户年龄、性别进行判断用户是否喜欢玩游戏的得分值。由此得到一颗CART树模型。
在这里插入图片描述
我们知道对于单个的决策树模型容易出现过拟合,并且不能在实际中有效应用。所以出现了集成学习方法。如下图,通过两棵树组合进行玩游戏得分值预测。其中 t r e e 1 tree1 tree1中对小男生的预测分值为 2 2 2 t r e e 2 tree2 tree2对小男生的预测分值为 0.9 0.9 0.9。则该小男生的最后得分值为 2.9 2.9 2.9
在这里插入图片描述
集成学习方法推广到一般情况,可知其预测模型为:
y ^ i = ∑ k = 1 K f k ( x i ) \hat y_i= \sum_{k=1}^Kf_k(x_i) y^i=k=1Kfk(xi)
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^it=y^it1+ft(xi)

其中 K K K为树的总个数, f k f_k fk表示第 k k k棵树。, y ^ i t \hat y_i^t y^it 是模型的预测结果, f k ( x i ) f_k(x_i) fk(xi) 是第 k k k轮弱学习器的输出结果, y i y_i yi 是真实结果。
上面两式就是加法模型,都默认弱学习器的输出结果是连续值。

3. 分析思路

首先明确下我们的目标,希望建立K个回归树,使得树群的预测值尽量接近真实值(准确率)而且有尽量大的泛化能力(更为本质的东西),从数学角度看这是一个泛函最优化,多目标,看下目标函数:
O b j = ∑ i = 1 n l { y i , y ^ i } + ∑ k = 1 K Ω ( f k ) Obj=\sum_{i=1}^{n} l\{y_i,\hat y_i\} + \sum_{k=1}^K \Omega(f_k) Obj=i=1nl{yi,y^i}+k=1KΩ(fk)
其中 i i i表示第 i i i个样本,目标函数由两部分构成, l { y i , y ^ i } l\{y_i,\hat y_i\} l{yi,y^i}表示第 i i i个样本的预测分数和真实分数的差距,另一部分 Ω ( f k ) \Omega(f_k) Ω(fk)则是正则化项(树的复杂度函数),越小复杂度越低,泛化能力越强。
正则化项同样包含两部分, T T T表示叶子结点的个数, w w w表示叶子节点的分数。 γ \gamma γ可以控制叶子结点的个数, λ \lambda λ可以控制叶子节点的分数不会过大,防止过拟合。
Ω ( f k ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_k)=\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2 Ω(fk)=γT+21λj=1Twj2
直观上看,目标要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端(这个怎么看,如果某个样本label数值为4,那么第一个回归树预测3,第二个预测为1;另外一组回归树,一个预测2,一个预测2,那么倾向后一种,为什么呢?前一种情况,第一棵树学的太多,太接近4,也就意味着有较大的过拟合的风险)

ok,听起来很美好,可是怎么实现呢,上面这个目标函数跟实际的参数怎么联系起来,回归树的参数:
  (1)选取哪个feature分裂节点呢;
  (2)节点的预测值(总不能靠取平均值这么粗暴不讲道理的方式吧,好歹高级一点)。上述形而上的公式并没有“直接”解决这两个,那么是如何间接解决的呢?
先说答案:贪心算法+最优化(二次最优化)

3.1 贪心算法

通俗解释贪心策略:就是决策时刻按照当前目标最优化决定,说白了就是眼前利益最大化决定,“目光短浅”策略,他的优缺点细节大家可以自己去了解,经典背包问题等等。

这里是怎么用贪心策略的呢,刚开始你有一群样本,放在第一个节点,这时候 T = 1 T=1 T=1 y ^ i = w \hat y_i=w y^i=w

如果这里的 l ( w − y i ) l(w−y_i) l(wyi)误差表示用的是平方误差,那么上述函数就是一个关于 w w w的二次函数求最小值,取最小值的点就是这个节点的预测值,最小的函数值为最小损失函数。
  这里处理的就是二次函数最优化!
  要是损失函数不是二次函数怎么办,泰勒展开式可以吗?不是二次的想办法近似为二次。

接着来,接下来要选个 f e a t u r e feature feature分裂成两个节点,变成一棵弱小的树苗,那么需要:
  (1)确定最优的切分特征, f e a t u r e feature feature,怎么确定呢?最简单的是粗暴的枚举,选择 l o s s f u n c t i o n loss function lossfunction效果最好的那个(关于暴力枚举,Xgboost的改良并行方式咱们后面看);
  (2)如何确立最优的切分点,节点的分数 w w w

3.1.1暴力枚举

选择一个 f e a t u r e feature feature分裂,计算 l o s s f u n c t i o n loss function lossfunction,选择最小值的 f e a t u r e feature feature,然后再选下一个 f e a t u r e feature feature分裂,又得到一个 l o s s f u n c t i o n loss function lossfunction最小值…枚举完,找一个效果最好的,把树给分裂,就得到了小树苗。在分裂的时候,你可以注意到,每次节点分裂,loss function被影响的只有这个节点的样本 f e a t u r e feature feature,因而每次分裂,计算 G a i n Gain Gain分裂的增益( l o s s f u n c t i o n loss function lossfunction的降低量)只需要关注打算分裂的那个节点的样本 f e a t u r e feature feature

接下来,继续分裂,按照上述的方式,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优的条件下(增益最大)进一步分裂/建树,是不是贪心策略?!

凡是这种循环迭代的方式必定有停止条件,什么时候停止呢:
  (1)当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,所以并不是每一次分裂 l o s s f u n c t i o n loss function lossfunction整体都会增加的,有点预剪枝的意思,阈值参数为 γ \gamma γ 正则项里叶子节点数 T T T 的系数;
  (2)当树达到最大深度时则停止建立决策树,设置一个超参数max_depth,这个好理解吧,树太深很容易出现的情况学习局部样本,过拟合;
  (3)当样本权重和小于设定阈值时则停止建树,这个解释一下,涉及到一个超参数-最小的样本权重和min_child_weight,和GBM的 min_child_leaf 参数类似,但不完全一样,大意就是一个叶子节点样本太少了,也终止同样是过拟合;
  (4)貌似看到过有树的最大数量的…这个不确定
  那节点分裂的时候是按照哪个顺序来的,比如第一次分裂后有两个叶子节点,先裂哪一个?
  答:同一层级的(多机)并行,确立如何分裂或者不分裂成为叶子节点 。

4. 原理推导

集成学习方法推广到一般情况,可知其预测模型为:
y ^ i = ∑ k = 1 K f k ( x i ) \hat y_i= \sum_{k=1}^Kf_k(x_i) y^i=k=1Kfk(xi)
其中 K K K为树的总个数, f k f_k fk表示第 k k k棵树。, y ^ i t \hat y_i^t y^it 是模型的预测结果。
损失函数也同样表示为:
O b j = ∑ i = 1 n l { y i , y ^ i } + ∑ k = 1 K Ω ( f k ) Obj=\sum_{i=1}^{n} l\{y_i,\hat y_i\} + \sum_{k=1}^K \Omega(f_k) Obj=i=1nl{yi,y^i}+k=1KΩ(fk)
l { y i , y ^ i } l\{y_i,\hat y_i\} l{yi,y^i}表示样本 x i x_i xi的训练误差, Ω ( f k ) \Omega(f_k) Ω(fk)表示第 k k k棵树的正则项。
看到了这里,我们可能会想到,现在知道了模型预测函数和损失函数,那我们是不是直接就能求出其预测模型了呢?答案肯定不是,我们首先需要明确知道优化和求解的参数是什么呢?由上面的预测模型中,我们可以看到对于每棵树的预测值 f ( x ) f(x) f(x)是如何计算的?想到这里,你就已经知道了需要做的事了,我需要求解和优化的就是每个叶子节点的得分值,也就是 f ( x ) f(x) f(x)的值。另外我们知道XGBoost是以CART树中的回归树作为基分类器,在给定训练数据后,其单个树的结构(叶子节点个数、树深度等等)基本可以确定了。但XGBoost并不是简单重复的将几个CART树进行组合。它是一种加法模型,将模型上次预测(由t-1棵树组合而成的模型)产生的误差作为参考进行下一棵树(第t棵树)的建立。以此,每加入一棵树,将其损失函数不断降低。如下图就为加法模型案例,它将模型预测值与实际值残差作为下一颗树的输入数据。
在这里插入图片描述
对于加法模型可以表示如下:
初始化(模型中没有树时,其预测结果为 0 0 0 y ^ i ( 0 ) = 0 \hat y_{i}^{(0)}=0 y^i(0)=0
往模型中加入第一棵树: y ^ i ( 1 ) = f 1 ( x i ) = y ^ i ( 0 ) + f 1 ( x i ) \hat y_{i}^{(1)}=f_1(x_i)=\hat y_{i}^{(0)} + f_1(x_i) y^i(1)=f1(xi)=y^i(0)+f1(xi)
往模型中加入第二棵树: y ^ i ( 2 ) = f 2 ( x i ) + f 1 ( x i ) = y ^ i ( 1 ) + f 2 ( x i ) \hat y_{i}^{(2)}=f_2(x_i)+f_1(x_i)=\hat y_{i}^{(1)} + f_2(x_i) y^i(2)=f2(xi)+f1(xi)=y^i(1)+f2(xi)
. . . ... ...
往模型中加入第t棵树: y ^ i t = ∑ k = 1 t f k ( x i ) = y ^ i t − 1 + f t ( x i ) \hat y_i^t= \sum_{k=1}^tf_k(x_i)=\hat y_i^{t-1} + f_t(x_i) y^it=k=1tfk(xi)=y^it1+ft(xi)
其中 f k f_k fk表示第 k k k棵树, y ^ i t \hat y_i^t y^it表示组合 t t t棵树对样本 x i x_i xi的预测结果。

我们知道,每次往模型中加入一棵树,其损失函数便会发生变化。另外在加入第t棵树时,则前面第t-1棵树已经训练完成,此时前面t-1棵树的正则项和训练误差都成已知常数项。
O b j = ∑ i = 1 n l { y i , y ^ i t } + ∑ k = 1 K Ω ( f k ) = ∑ i = 1 n l { y i , y ^ i t − 1 + f t ( x i ) } + ∑ k = 1 K Ω ( f k ) + C \begin{aligned} Obj &= \sum_{i=1}^{n} l\{y_i,\hat y_i^t\} + \sum_{k=1}^K \Omega(f_k) \\ &=\sum_{i=1}^{n} l\{y_i,\hat y_i^{t-1} + f_t(x_i)\} + \sum_{k=1}^K \Omega(f_k)+C \end{aligned} Obj=i=1nl{yi,y^it}+k=1KΩ(fk)=i=1nl{yi,y^it1+ft(xi)}+k=1KΩ(fk)+C
如果损失函数采用均方误差时,其目标损失函数变为:

O b j = ∑ i = 1 n l { y i , y ^ i t } + ∑ k = 1 K Ω ( f k ) = ∑ i = 1 n ( y i − ( y ^ i t − 1 + f t ( x i ) ) ) 2 + Ω ( f k ) + C = ∑ i = 1 n [ ( y i − y ^ i t − 1 ) 2 + 2 ( y i − y ^ i t − 1 ) f t ( x i ) ) + f t ( x i ) ) 2 ] + Ω ( f k ) + C = ∑ i = 1 n [ 2 ( y i − y ^ i t − 1 ) f t ( x i ) ) + f t ( x i ) ) 2 ] + Ω ( f k ) + C 1 \begin{aligned} Obj &= \sum_{i=1}^{n} l\{y_i,\hat y_i^t\} + \sum_{k=1}^K \Omega(f_k) \\ &=\sum_{i=1}^{n} (y_i-(\hat y_i^{t-1} + f_t(x_i)))^2 + \Omega(f_k)+C \\ &= \sum_{i=1}^{n} [(y_i-\hat y_i^{t-1})^2+2(y_i-\hat y_i^{t-1})f_t(x_i))+f_t(x_i))^2]+\Omega(f_k)+C \\ &= \sum_{i=1}^{n} [2(y_i-\hat y_i^{t-1})f_t(x_i))+f_t(x_i))^2]+\Omega(f_k)+C_1 \end{aligned} Obj=i=1nl{yi,y^it}+k=1KΩ(fk)=i=1n(yi(y^it1+ft(xi)))2+Ω(fk)+C=i=1n[(yiy^it1)2+2(yiy^it1)ft(xi))+ft(xi))2]+Ω(fk)+C=i=1n[2(yiy^it1)ft(xi))+ft(xi))2]+Ω(fk)+C1

另外对于目标损失函数中的正则项(复杂度)部分,我们从单一的树来考虑。对于其中每一棵回归树,其模型可以写成:
k k k C A R T CART CART树,确定一棵 C A R T CART CART树需要确定两部分,第一部分就是树的结构,这个结构将输入样本映射到一个确定的叶子节点上,记为:
f k ( x ) f_k(x) fk(x)
第二部分就是各个叶子节点的值, w w w 为叶子节点的得分值, q ( x ) q(x) q(x)表示样本 x x x 对应的叶子节点, T T T为该树的叶子节点个数。
w q ( x ) w_{q(x)} wq(x)
表示对应叶子节点序号的值。由定义得:
f k ( x ) = w q ( x ) f_k(x)=w_{q(x)} fk(x)=wq(x)
w h e r e F = { f ( x ) = w q ( x ) } ( q : R m → T , w ∈ R T ) where F = \{f(x)=w_{q(x)}\} (q:R^m \rightarrow T,w\in R^T) whereF={f(x)=wq(x)}(q:RmT,wRT)
因此,在这里。我们将该树的复杂度写成:
Ω ( f k ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f_k)=\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2 Ω(fk)=γT+21λj=1Twj2
复杂度计算例子如下:
在这里插入图片描述
此时,对于XGBoost的目标函数我们可以写为:
O b j = ∑ i = 1 n l { y i , y ^ i t } + ∑ k = 1 K Ω ( f k ) = ∑ i = 1 n l { y i , y ^ i t − 1 + f t ( x i ) } + Ω ( f k ) + C = ∑ i = 1 n l { y i , y ^ i t − 1 + f t ( x i ) } + Ω ( f k ) + γ T + 1 2 λ ∑ j = 1 T w j 2 + C \begin{aligned} Obj &= \sum_{i=1}^{n} l\{y_i,\hat y_i^t\} + \sum_{k=1}^K \Omega(f_k) \\ &= \sum_{i=1}^{n} l\{y_i,\hat y_i^{t-1} + f_t(x_i)\} + \Omega(f_k)+C \\ &= \sum_{i=1}^{n} l\{y_i,\hat y_i^{t-1} + f_t(x_i)\} + \Omega(f_k)+\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2+C \end{aligned} Obj=i=1nl{yi,y^it}+k=1KΩ(fk)=i=1nl{yi,y^it1+ft(xi)}+Ω(fk)+C=i=1nl{yi,y^it1+ft(xi)}+Ω(fk)+γT+21λj=1Twj2+C
现在我们只需要找到 f ( t ) f(t) f(t)来优化上式目标。
在这里插入图片描述
在推导之前,我们先介绍下泰勒展开式:
f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x + 1 2 f ′ ′ ( x ) Δ x 2 f(x+\Delta x) \approx f(x)+f{'}(x)\Delta x+\frac 12 f{''}(x)\Delta x^2 f(x+Δx)f(x)+f(x)Δx+21f(x)Δx2
这里我们用泰勒展开式来近似原来的目标函数,将 f t ( x i ) f_t(x_i) ft(xi)看作 Δ x \Delta x Δx。则原目标函数可以写成:
O b j = ∑ i = 1 n l { y i , y ^ i t } + ∑ k = 1 K Ω ( f k ) = ∑ i = 1 n l { y i , y ^ i t − 1 + f t ( x i ) } + Ω ( f k ) + C = ∑ i = 1 n l { y i , y ^ i t − 1 + f t ( x i ) } + Ω ( f k ) + γ T + 1 2 λ ∑ j = 1 T w j 2 + C ≈ ∑ i = 1 n [ l ( y i , y ^ i t − 1 ) + ∂ y i t − 1 l ( y i , y ^ i t − 1 ) f t ( x i ) + 1 2 ∂ y i t − 1 2 l ( y i , y ^ i t − 1 ) f t ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 + C \begin{aligned} Obj &= \sum_{i=1}^{n} l\{y_i,\hat y_i^t\} + \sum_{k=1}^K \Omega(f_k) \\ &= \sum_{i=1}^{n} l\{y_i,\hat y_i^{t-1} + f_t(x_i)\} + \Omega(f_k)+C \\ &= \sum_{i=1}^{n} l\{y_i,\hat y_i^{t-1} + f_t(x_i)\} + \Omega(f_k)+\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2+C \\ &\approx \sum_{i=1}^{n} [l(y_i,\hat y_i^{t-1})+\partial _{y_i^{t-1}}l(y_i,\hat y_i^{t-1}) f_t(x_i)+\frac 12 \partial _{y_i^{t-1}}^2 l(y_i,\hat y_i^{t-1})f_t(x_i)^2] +\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2+C \end{aligned} Obj=i=1nl{yi,y^it}+k=1KΩ(fk)=i=1nl{yi,y^it1+ft(xi)}+Ω(fk)+C=i=1nl{yi,y^it1+ft(xi)}+Ω(fk)+γT+21λj=1Twj2+Ci=1n[l(yi,y^it1)+yit1l(yi,y^it1)ft(xi)+21yit12l(yi,y^it1)ft(xi)2]+γT+21λj=1Twj2+C
g i = ∂ y i t − 1 l ( y i , y ^ i t − 1 ) g_i = \partial _{y_i^{t-1}}l(y_i,\hat y_i^{t-1}) gi=yit1l(yi,y^it1) h i = ∂ y i t − 1 2 l ( y i , y ^ i t − 1 ) h_i=\partial _{y_i^{t-1}}^2l(y_i,\hat y_i^{t-1}) hi=yit12l(yi,y^it1),同时对于第 t t t棵树时, l ( y i , y ^ i t − 1 ) l(y_i,\hat y_i^{t-1}) l(yi,y^it1)为常数。同时去除所有常数项。故目标损失函数可以写成:
O b j ≈ ∑ i = 1 n [ l ( y i , y ^ i t − 1 ) + g i f t ( x i ) + 1 2 h i f t ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 + C ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 \begin{aligned} Obj &\approx \sum_{i=1}^{n} [l(y_i,\hat y_i^{t-1})+g_i f_t(x_i)+\frac 12 h_i f_t(x_i)^2] +\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2+C \\ & \approx \sum_{i=1}^{n} [g_i f_t(x_i)+\frac 12 h_i f_t(x_i)^2] +\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2 \\ \end{aligned} Obji=1n[l(yi,y^it1)+gift(xi)+21hift(xi)2]+γT+21λj=1Twj2+Ci=1n[gift(xi)+21hift(xi)2]+γT+21λj=1Twj2
由上面介绍树的复杂度时,我们知道
f ( x ) = w q ( x ) ( q : R m → T , w ∈ R T ) f(x)=w_{q(x)} (q:R^m \rightarrow T,w\in R^T) f(x)=wq(x)(q:RmT,wRT)同时我们将目标函数全部转换成在第 t t t棵树叶子节点的形式。因为目前对于 [ g i f t ( x i ) + 1 2 h i f t ( x i ) 2 ] [g_i f_t(x_i)+\frac 12 h_i f_t(x_i)^2] [gift(xi)+21hift(xi)2],可以看做是每个样本在第t棵树的叶子节点得分值相关函数的结果之和,所以我们也能从第 t t t棵树的叶子节点上来表示。
O b j ≈ ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I g i ) w j + ( 1 2 ∑ i ∈ I h i ) w j 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 = ∑ j = 1 T [ ( ∑ i ∈ I g i ) w j + 1 2 ( ∑ i ∈ I h i + λ ) w j 2 ] + γ T \begin{aligned} Obj & \approx \sum_{i=1}^{n} [g_i f_t(x_i)+\frac 12 h_i f_t(x_i)^2] +\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{i=1}^{n} [g_i w_{q(x_i)}+\frac 12 h_i w_{q(x_i)}^2] +\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{j=1}^{T} [(\sum_{i \in I} g_i )w_j+(\frac 12 \sum_{i \in I} h_i )w_{j}^2] +\gamma T + \frac12 \lambda \sum_{j=1}^T w_j^2 \\ &= \sum_{j=1}^{T} [(\sum_{i \in I} g_i )w_j+\frac 12 (\sum_{i \in I} h_i + \lambda)w_{j}^2] +\gamma T \end{aligned} Obji=1n[gift(xi)+21hift(xi)2]+γT+21λj=1Twj2=i=1n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2=j=1T[(iIgi)wj+(21iIhi)wj2]+γT+21λj=1Twj2=j=1T[(iIgi)wj+21(iIhi+λ)wj2]+γT
上式中,前两行 i = 1 ∼ n i=1 \sim n i=1n求和为在样本中遍历,后两行 j = 1 ∼ T j = 1\sim T j=1T求和为在叶子节点上遍历,其中 T T T为第 t t t棵树中总叶子节点的个数, I j = { i ∣ q ( x i ) = j } I_j=\{i|q(x_i)=j\} Ij={iq(xi)=j}表示在第 j j j个叶子节点上的样本, w j w_j wj为第 j j j个叶子节点的得分值。
在这里,令 G j = ∑ i ∈ I g i , H j = ∑ i ∈ I h i G_j= \sum_{i \in I} g_i,H_j= \sum_{i \in I} h_i Gj=iIgi,Hj=iIhi
则:
O b j = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T Obj=\sum_{j=1}^{T} [G_j w_j+\frac 12 (H_j + \lambda)w_{j}^2] +\gamma T Obj=j=1T[Gjwj+21(Hj+λ)wj2]+γT
w j w_j wj求偏导,并使其导函数等于0,则有:
G j + ( H j + λ ) w j = 0 G_j+(H_j+\lambda)w_j=0 Gj+(Hj+λ)wj=0
求解得:
w j ∗ = − G j H j + λ w_j^* =- \frac {G_j}{H_j+\lambda} wj=Hj+λGj
其目标函数可以为:
O b j = 1 2 ∑ j = 1 T G j 2 H j + λ + γ T Obj=\frac 12\sum_{j=1}^{T} \frac {G_j^2}{H_j+\lambda} +\gamma T Obj=21j=1THj+λGj2+γT
根据目标函数,如何分裂样本数据呢?
在这里插入图片描述
在这里插入图片描述

5. 总结

1.Xgboost的一些重点

  • w w w是最优化求出来的,不是平均值或规则指定的,这个算是一个思路上的新颖吧;
  • 正则化防止过拟合的技术,上述看到了,直接loss function里面就有;
  • 支持自定义loss function,只要能泰勒展开(能求一阶导和二阶导)就行;
  • 支持并行化,这个地方有必要说明下,因为这是xgboost的闪光点,直接的效果是训练速度快,boosting技术中下一棵树依赖上述树的训练和预测,所以树与树之间应该是只能串行!那么大家想想,哪里可以并行?! 没错,在选择最佳分裂点,进行枚举的时候并行!(据说恰好这个也是树形成最耗时的阶段)

Attention:同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。

较少的离散值作为分割点倒是很简单,比如“是否是单身”来分裂节点计算增益是很 e a s y easy easy,但是“月收入”这种 f e a t u r e feature feature,取值很多,从 5 k ∼ 50 k 5k \sim 50k 5k50k都有,总不可能每个分割点都来试一下计算分裂增益吧?(比如月收入 f e a t u r e feature feature 1000 1000 1000个取值,难道你把这 1000 1000 1000个用作分割候选?缺点1:计算量,缺点2:出现叶子节点样本过少,过拟合)我们常用的习惯就是划分区间,那么问题来了,这个区间分割点如何确定(难道平均分割),作者是这么做的:

方法名字: W e i g h t e d Q u a n t i l e S k e t c h Weighted Quantile Sketch WeightedQuantileSketch

大家还记得每个样本在节点(将要分裂的节点)处的 l o s s f u n c t i o n loss function lossfunction一阶导数 g i gi gi和二阶导数 h i hi hi,衡量预测值变化带来的 l o s s f u n c t i o n loss function lossfunction变化,举例来说,将样本“月收入”进行升序排列, 5 k 、 5.2 k 、 5.3 k 、 … 、 52 k 5k、5.2k、5.3k、…、52k 5k5.2k5.3k52k,分割线为“收入 1 1 1”、“收入 2 2 2”、…、“收入 j j j”,满足(每个间隔的样本的 h i hi hi之和/总样本的 h i hi hi之和)为某个百分比 ϵ \epsilon ϵ(我这个是近似的说法),那么可以一共分成大约 1 ϵ \frac 1 \epsilon ϵ1个分裂点。
    
XGBoost还特别设计了针对稀疏数据的算法
  假设样本的第i个特征缺失时,无法利用该特征对样本进行划分,这里的做法是将该样本默认地分到指定的子节点,至于具体地分到哪个节点还需要某算法来计算,

算法的主要思想是,分别假设特征缺失的样本属于右子树和左子树,而且只在不缺失的样本上迭代,分别计算缺失样本属于右子树和左子树的增益,选择增益最大的方向为缺失数据的默认方向(咋一看如果缺失情况为3个样本,那么划分的组合方式岂不是有8种?指数级可能性啊,仔细一看,应该是在不缺失样本情况下分裂后,把第一个缺失样本放左边计算下loss function和放右边进行比较,同样对付第二个、第三个…缺失样本,这么看来又是可以并行的??)(答:论文中“枚举”指的不是枚举每个缺失样本在左边还是在右边,而是枚举缺失样本整体在左边,还是在右边两种情况。 分裂点还是只评估特征不缺失的样本。);

  • 可实现后剪枝
  • 交叉验证,方便选择最好的参数,early stop,比如你发现30棵树预测已经很好了,不用进一步学习残差了,那么停止建树。
  • 行采样、列采样,随机森林的套路(防止过拟合)
  • Shrinkage,你可以是几个回归树的叶子节点之和为预测值,也可以是加权,比如第一棵树预测值为3.3,label为4.0,第二棵树才学0.7,….再后面的树还学个鬼,所以给他打个折扣,比如3折,那么第二棵树训练的残差为4.0-3.3*0.3=3.01,这就可以发挥了啦,以此类推,作用是啥,防止过拟合,如果对于“伪残差”学习,那更像梯度下降里面的学习率;
    xgboost还支持设置样本权重,这个权重体现在梯度g和二阶梯度h上,是不是有点adaboost的意思,重点关注某些样本

2、与GDBT、深度学习对比下

Xgboost第一感觉就是防止过拟合+各种支持分布式/并行,所以一般传言这种大杀器效果好(集成学习的高配)+训练效率高(分布式),与深度学习相比,对样本量和特征数据类型要求没那么苛刻,适用范围广。

说下GBDT:有两种描述版本,把GBDT说成一个迭代残差树,认为每一棵迭代树都在学习前N-1棵树的残差;把GBDT说成一个梯度迭代树,使用梯度迭代下降法求解,认为每一棵迭代树都在学习前N-1棵树的梯度下降值。有说法说前者是后者在loss function为平方误差下的特殊情况。

Xgboost和深度学习的关系,陈天奇在Quora上的解答如下:
  不同的机器学习模型适用于不同类型的任务。深度神经网络通过对时空位置建模,能够很好地捕获图像、语音、文本等高维数据。而基于树模型的XGBoost则能很好地处理表格数据,同时还拥有一些深度神经网络所没有的特性(如:模型的可解释性、输入数据的不变性、更易于调参等)。
这两类模型都很重要,并广泛用于数据科学竞赛和工业界。举例来说,几乎所有采用机器学习技术的公司都在使用tree boosting,同时XGBoost已经给业界带来了很大的影响。

6. XGBoost参数

三、xgboost参数详解
官方参数介绍看这里:
Parameters (official guide)

General Parameters(常规参数)
1.booster [default=gbtree]:选择基分类器,gbtree: tree-based models/gblinear: linear models
2.silent [default=0]:设置成1则没有运行信息输出,最好是设置为0.
3.nthread [default to maximum number of threads available if not set]:线程数

Booster Parameters(模型参数)
1.eta[default=0.3]:shrinkage参数,用于更新叶子节点权重时,乘以该系数,避免步长过大。参数值越大,越可能无法收敛。把学习率 eta 设置的小一些,小学习率可以使得后面的学习更加仔细。
2.min_child_weight [default=1]:这个参数默认是 1,是每个叶子里面 h 的和至少是多少,对正负样本不均衡时的 0-1 分类而言,假设 h 在 0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100 个样本。这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。
3.max_depth [default=6]: 每颗树的最大深度,树高越深,越容易过拟合。
4.max_leaf_nodes:最大叶结点数,与max_depth作用有点重合。
5.gamma [default=0]:后剪枝时,用于控制是否后剪枝的参数。
6.max_delta_step [default=0]:这个参数在更新步骤中起作用,如果取0表示没有约束,如果取正值则使得更新步骤更加保守。可以防止做太大的更新步子,使更新更加平缓。
7.subsample [default=1]:样本随机采样,较低的值使得算法更加保守,防止过拟合,但是太小的值也会造成欠拟合。
8.colsample_bytree [default=1]:列采样,对每棵树的生成用的特征进行列采样.一般设置为: 0.5-1
9.lambda [default=1]:控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
10.alpha [default=0]:控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。
11.scale_pos_weight [default=1]:如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。

Learning Task Parameters(学习任务参数)
1.objective [default=reg:linear]:定义最小化损失函数类型,常用参数:
binary:logistic –logistic regression for binary classification, returns predicted probability (not class)
multi:softmax –multiclass classification using the softmax objective, returns predicted class (not probabilities)
you also need to set an additional num_class (number of classes) parameter defining the number of unique classes
multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class.
2.eval_metric [ default according to objective ]
The metric to be used for validation data.
The default values are rmse for regression and error for classification.
Typical values are:
rmse – root mean square error
mae – mean absolute error
logloss – negative log-likelihood
error – Binary classification error rate (0.5 threshold)
merror – Multiclass classification error rate
mlogloss – Multiclass logloss
auc: Area under the curve
3.seed [default=0]
The random number seed. 随机种子,用于产生可复现的结果
Can be used for generating reproducible results and also for parameter tuning.

注意: python sklearn style参数名会有所变化
eta –> learning_rate
lambda –> reg_lambda
alpha –> reg_alpha

文章参考:
机器学习–boosting家族之XGBoost算法
XGBoost原理介绍------个人理解版
通俗、有逻辑的写一篇说下Xgboost的原理,供讨论参考
xgboost入门与实战

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值