文章目录
前言
目前风控算法较为流行的是传统机器学习,如:逻辑回归, 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)={x∣xj≤s}andR1(j,s)={x∣xj>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
xi∈Rm∑(yi−f(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[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)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,5 | 4 |
第一棵决策树用这个样本训练得预测为3.3,
那么做为第二棵决策树训练时的输入,这个样本就变成了
f e a t u r e feature feature | l a b e l label label |
---|---|
2,4,5 | 0.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=1∑Kfk(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^it−1+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=1∑nl{yi,y^i}+k=1∑KΩ(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=1∑Twj2
直观上看,目标要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端(这个怎么看,如果某个样本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(w−yi)误差表示用的是平方误差,那么上述函数就是一个关于
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=1∑Kfk(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=1∑nl{yi,y^i}+k=1∑KΩ(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^it−1+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=1∑nl{yi,y^it}+k=1∑KΩ(fk)=i=1∑nl{yi,y^it−1+ft(xi)}+k=1∑KΩ(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=1∑nl{yi,y^it}+k=1∑KΩ(fk)=i=1∑n(yi−(y^it−1+ft(xi)))2+Ω(fk)+C=i=1∑n[(yi−y^it−1)2+2(yi−y^it−1)ft(xi))+ft(xi))2]+Ω(fk)+C=i=1∑n[2(yi−y^it−1)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:Rm→T,w∈RT)
因此,在这里。我们将该树的复杂度写成:
Ω
(
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=1∑Twj2
复杂度计算例子如下:
此时,对于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=1∑nl{yi,y^it}+k=1∑KΩ(fk)=i=1∑nl{yi,y^it−1+ft(xi)}+Ω(fk)+C=i=1∑nl{yi,y^it−1+ft(xi)}+Ω(fk)+γT+21λj=1∑Twj2+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=1∑nl{yi,y^it}+k=1∑KΩ(fk)=i=1∑nl{yi,y^it−1+ft(xi)}+Ω(fk)+C=i=1∑nl{yi,y^it−1+ft(xi)}+Ω(fk)+γT+21λj=1∑Twj2+C≈i=1∑n[l(yi,y^it−1)+∂yit−1l(yi,y^it−1)ft(xi)+21∂yit−12l(yi,y^it−1)ft(xi)2]+γT+21λj=1∑Twj2+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=∂yit−1l(yi,y^it−1),
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=∂yit−12l(yi,y^it−1),同时对于第
t
t
t棵树时,
l
(
y
i
,
y
^
i
t
−
1
)
l(y_i,\hat y_i^{t-1})
l(yi,y^it−1)为常数。同时去除所有常数项。故目标损失函数可以写成:
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}
Obj≈i=1∑n[l(yi,y^it−1)+gift(xi)+21hift(xi)2]+γT+21λj=1∑Twj2+C≈i=1∑n[gift(xi)+21hift(xi)2]+γT+21λj=1∑Twj2
由上面介绍树的复杂度时,我们知道
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:Rm→T,w∈RT)同时我们将目标函数全部转换成在第
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}
Obj≈i=1∑n[gift(xi)+21hift(xi)2]+γT+21λj=1∑Twj2=i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1∑Twj2=j=1∑T[(i∈I∑gi)wj+(21i∈I∑hi)wj2]+γT+21λj=1∑Twj2=j=1∑T[(i∈I∑gi)wj+21(i∈I∑hi+λ)wj2]+γT
上式中,前两行
i
=
1
∼
n
i=1 \sim n
i=1∼n求和为在样本中遍历,后两行
j
=
1
∼
T
j = 1\sim T
j=1∼T求和为在叶子节点上遍历,其中
T
T
T为第
t
t
t棵树中总叶子节点的个数,
I
j
=
{
i
∣
q
(
x
i
)
=
j
}
I_j=\{i|q(x_i)=j\}
Ij={i∣q(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=i∈I∑gi,Hj=i∈I∑hi
则:
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=1∑T[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=1∑THj+λ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 5k∼50k都有,总不可能每个分割点都来试一下计算分裂增益吧?(比如月收入 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
5k、5.2k、5.3k、…、52k,分割线为“收入
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入门与实战