这篇为机器学习笔记,参考资料为《统计学习方法》,邹博的机器学习课程PPT,西瓜书以及一些博客最后加上自己的一些理解进行了总结。会按照容易理解的顺序讲到如下内容
- 前向分步算法
- 梯度提升算法
- 决策树
- 梯度提升决策树(GBDT)
- XGboost介绍与推导
一、前向分步算法
考虑以下线性组合的模型
f ( x ) = ∑ m = 1 M β m b ( x ; θ m ) f(x)=\sum\limits_{m=1}^{M}\beta_mb(x;\theta_m) f(x)=m=1∑Mβmb(x;θm)
其中 β m \beta_m βm为系数, θ m \theta_m θm为模型参数,上面的模型显然就是加法模型。
当给定训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} T={(x1,y1),(x2,y2),...,(xn,yn)},以及损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x)), y = { − 1 , + 1 } y=\{-1,+1\} y={−1,+1},学习算法通常就是求经验风险极小化(或者说损失函数极小化):
min β m , θ m ∑ i = 1 n L ( y i , f ( x i ) ) = min ∑ i = 1 n L [ y i , ∑ m = 1 M β m b ( x i ; θ m ) ] \min\limits_{\beta_m,\theta_m} \sum\limits_{i=1}^{n}L(y_i,f(x_i))=\min \sum\limits_{i=1}^{n}L[y_i,\sum\limits_{m=1}^{M}\beta_mb(x_i;\theta_m)] βm,θmmini=1∑nL(yi,f(xi))=mini=1∑nL[yi,m=1∑Mβmb(xi;θm)]
该优化问题存在两个求和,求解比较困难,由于是加法模型,所以可以使用前向分步算法:每次只学习一个基函数及其系数( b ( x ; θ m ) , β m b(x;\theta_m),\beta_m b(x;θm),βm),逐步逼近优化目标函数。具体地,每步只需优化如下损失函数
min β , θ ∑ i = 1 n L [ y i , β b ( x i ; θ ) ] \min\limits_{\beta,\theta}\sum\limits_{i=1}^{n}L[y_i,\beta b(x_i;\theta)] β,θmini=1∑nL[yi,βb(xi;θ)]
具体的前向分步算法如下
前向分步算法
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
}
T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}
T={(x1,y1),(x2,y2),...,(xn,yn)},损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x)),基函数集
{
b
(
x
;
θ
)
}
\{b(x;\theta)\}
{b(x;θ)}
输出:加法模型
f
(
x
)
f(x)
f(x)
(1)、初始化
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0;
(2)、对
m
=
1
,
2
,
…
,
M
m=1,2,\dots,M
m=1,2,…,M
(a)、极小化损失函数,获得参数 β m , θ m \beta_m,\theta_m βm,θm
( β m , θ m ) = a r g min β , θ ∑ i = 1 n L [ y i , f m − 1 ( x ) + β b ( x i ; θ ) ] (\beta_m,\theta_m)=arg\min\limits_{\beta,\theta}\sum\limits_{i=1}^{n}L[y_i,f_{m-1}(x)+\beta b(x_i;\theta)] (βm,θm)=argβ,θmini=1∑nL[yi,fm−1(x)+βb(xi;θ)]
(b)、更新加法模型
f m ( x ) = f m − 1 ( x ) + β m b ( x i ; θ m ) f_m(x)=f_{m-1}(x)+\beta_m b(x_i;\theta_m) fm(x)=fm−1(x)+βmb(xi;θm)
(3)、得到加法模型
f ( x ) = ∑ m = 1 M β m b ( x i ; θ m ) f(x)=\sum\limits_{m=1}^{M}\beta_m b(x_i;\theta_m) f(x)=m=1∑Mβmb(xi;θm)
二、梯度提升(GB)
关于梯度提升看了各种博客子类,说法不一,但是基本都出于几个人之手,就说说自己的看法吧,所以才在前面先介绍了前向分步算法,因为它和梯度提升的步骤基本一致(梯度提升主要是当模型不好进行优化的时候使用)。
注意到前向分步算法的步骤(a)中,关于 ( β m , θ m ) (\beta_m,\theta_m) (βm,θm)的求解仍然很难,Freidman提出了梯度提升算法,这是使用梯度下降的近似算法,利用的是损失函数在负梯度方向的值。
将(a)步骤,改成下面的形式
(a)、对每个 i = 1 , 2 , … , n i=1,2,\dots,n i=1,2,…,n,计算近似残差
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(1)、对
r
m
i
,
i
=
1
,
2
,
.
.
.
,
n
r_{mi},i=1,2,...,n
rmi,i=1,2,...,n(注意是n个
r
r
r值)进行拟合(应该是
(
x
i
,
r
m
i
)
(x_i,r_{mi})
(xi,rmi)),得到基函数
b
(
x
;
θ
m
)
b(x;\theta_m)
b(x;θm)
(2)、计算步长(系数)
β
m
\beta_m
βm,
β
m
=
arg
max
β
∑
i
=
1
n
L
(
y
i
,
f
m
−
1
(
x
i
)
+
β
b
(
x
i
;
θ
m
)
)
\beta_m=\arg\max\limits_{\beta}\sum\limits_{i=1}^{n}L(y_i,f_{m-1}(x_i)+\beta b(x_i;\theta_m))
βm=argβmaxi=1∑nL(yi,fm−1(xi)+βb(xi;θm))
所以对于 ( β m , θ m ) = a r g min β , θ ∑ i = 1 n L [ y i , f m − 1 ( x ) + β b ( x i ; θ ) ] (\beta_m,\theta_m)=arg\min\limits_{\beta,\theta}\sum\limits_{i=1}^{n}L[y_i,f_{m-1}(x)+\beta b(x_i;\theta)] (βm,θm)=argβ,θmini=1∑nL[yi,fm−1(x)+βb(xi;θ)]的求解,实际是分成了两步,先求 θ m \theta_m θm,具体的做法是先使用损失函数对上一轮的 f ( x ) f(x) f(x)求偏导,带入 x i x_i xi 求得 r m i r_{mi} rmi,再对 r m i r_{mi} rmi进行拟合,比如基函数是回归树,那么进行拟合就是将 ( x i , r m i ) (x_i,r_{mi}) (xi,rmi)代替原来的 ( x i , y i ) (x_i,y_i) (xi,yi),然后使用CART求得回归树。
求出了 θ m \theta_m θm 后再去求步长 β m \beta_m βm,步长的求法可以使用线性搜索来求最优步长。
那么具体的梯度下降算法给出如下
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
}
T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}
T={(x1,y1),(x2,y2),...,(xn,yn)},损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x)),基函数集
{
b
(
x
;
θ
)
}
\{b(x;\theta)\}
{b(x;θ)}
输出:加法模型
f
(
x
)
f(x)
f(x)
(1)、初始化
f
0
(
x
)
=
0
f_0(x)=0
f0(x)=0;
(2)、对
m
=
1
,
2
,
…
,
M
m=1,2,\dots,M
m=1,2,…,M
(a)、极小化损失函数,获得参数 β m , θ m \beta_m,\theta_m βm,θm
对每个 i = 1 , 2 , … , n i=1,2,\dots,n i=1,2,…,n,计算近似残差
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(a1)、对
r
m
i
,
i
=
1
,
2
,
.
.
.
,
n
r_{mi},i=1,2,...,n
rmi,i=1,2,...,n(注意是n个
r
r
r值)进行拟合(应该是
(
x
i
,
r
m
i
)
(x_i,r_{mi})
(xi,rmi)),得到基函数
b
(
x
;
θ
m
)
b(x;\theta_m)
b(x;θm)
(a2)、计算步长(系数)
β
m
\beta_m
βm,
β
m
=
arg
max
β
∑
i
=
1
n
L
(
y
i
,
f
m
−
1
(
x
i
)
+
β
b
(
x
i
;
θ
m
)
)
\beta_m=\arg\max\limits_{\beta}\sum\limits_{i=1}^{n}L(y_i,f_{m-1}(x_i)+\beta b(x_i;\theta_m))
βm=argβmaxi=1∑nL(yi,fm−1(xi)+βb(xi;θm))
(b)、更新加法模型
f m ( x ) = f m − 1 ( x ) + β m b ( x i ; θ m ) f_m(x)=f_{m-1}(x)+\beta_m b(x_i;\theta_m) fm(x)=fm−1(x)+βmb(xi;θm)
(3)、得到加法模型
f ( x ) = ∑ m = 1 M β m b ( x i ; θ m ) f(x)=\sum\limits_{m=1}^{M}\beta_m b(x_i;\theta_m) f(x)=m=1∑Mβmb(xi;θm)
如果基函数是决策树(下面以回归树为例),采用加法模型,学习算法梯度下降算法,那么整个算法就称为梯度下降决策树(GBDT),先复习下回归树。
三、CART算法生成回归树
回归指的是数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\} D={(x1,y1),(x2,y2),...,(xn,yn)} 中的 Y Y Y是连续变量,我们考虑生成回归树模型。假设已经输入空间划分成了 R 1 , R 2 , . . . , R M R_1,R_2,...,R_M R1,R2,...,RM,每块区域对应一个值 c m c_m cm,那么回归树模型表示为:
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum\limits_{m=1}^{M}c_mI(x \in R_m) f(x)=m=1∑McmI(x∈Rm)
空间划分确定了,学习目标就是最小化数据的预测误差 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum\limits_{x_i \in R_m}(y_i-f(x_i))^2 xi∈Rm∑(yi−f(xi))2,从而得到每块区域上的最优值 c m c_m cm,对应的是该区域的均值
c
m
=
a
v
e
(
y
i
∣
x
i
∈
R
m
)
c_m=ave(y_i|x_i \in R_m)
cm=ave(yi∣xi∈Rm)
现在
c
m
c_m
cm也得知了,最后我们需要知道如果进行空间划分,具体点就是,选择哪个特征
J
J
J,选择这个特征的切分的
s
s
s(一次切分就分成了两块区域
R
1
(
j
,
s
)
,
R
2
(
j
,
s
)
R_1(j,s),R_2(j,s)
R1(j,s),R2(j,s)),很自然的想到,每次划分(根节点开始)应该选择的特征和切分点应满足
min [ ∑ x i ∈ R 1 ( J , s ) ( y i − c 1 ) 2 + ∑ x i ∈ R 1 ( J , s ) ( y i − c 2 ) 2 ] \min [\sum\limits_{x_i \in R_1(J,s)}(y_i-c_1)^2+\sum\limits_{x_i \in R_1(J,s)}(y_i-c_2)^2] min[xi∈R1(J,s)∑(yi−c1)2+xi∈R1(J,s)∑(yi−c2)2]
R 1 ( j , s ) = { x ∣ x j < = s } , R 2 ( j , s ) = { x ∣ x j > s } R_1(j,s)=\{x|x^j<=s\},R_2(j,s)=\{x|x^j>s\} R1(j,s)={x∣xj<=s},R2(j,s)={x∣xj>s}
以及 c 1 = a v e ( y i ∣ x i ∈ R 1 ( j , s ) ) , c 2 = a v e ( y i ∣ x i ∈ R 2 ( j , s ) ) c_1=ave(y_i|x_i \in R_1(j,s)),c_2=ave(y_i|x_i \in R_2(j,s)) c1=ave(yi∣xi∈R1(j,s)),c2=ave(yi∣xi∈R2(j,s))
具体的,假设拿根节点开始,遍历所有的j,然后找到切分的s,从而构成一个堆 ( j , s ) (j,s) (j,s),这样就形成了两块区域,后面在这两块区域进行同样的操作。具体的算法描述如下(最小二乘回归树生成算法)
最小二乘回归树生成算法
输入:训练集
D
D
D
输出:回归树
f
(
x
)
f(x)
f(x)
1.选择最优切分变量
j
j
j和切分点
s
s
s,
求解
min
[
∑
x
i
∈
R
1
(
J
,
s
)
(
y
i
−
c
1
)
2
+
∑
x
i
∈
R
1
(
J
,
s
)
(
y
i
−
c
2
)
2
]
\min [\sum\limits_{x_i \in R_1(J,s)}(y_i-c_1)^2+\sum\limits_{x_i \in R_1(J,s)}(y_i-c_2)^2]
min[xi∈R1(J,s)∑(yi−c1)2+xi∈R1(J,s)∑(yi−c2)2]
具体地,遍历
j
j
j,对固定的切分变量
j
j
j扫描切分点
s
s
s,选择使得上述式子达到最小的对
(
j
,
s
)
(j,s)
(j,s)
2. 用
1
1
1产生的
(
j
,
s
)
(j,s)
(j,s)划分区域并决定相应的输出值:
R
1
(
j
,
s
)
=
{
x
∣
x
j
<
=
s
}
,
R
2
(
j
,
s
)
=
{
x
∣
x
j
>
s
}
R_1(j,s)=\{x|x^j<=s\},R_2(j,s)=\{x|x^j>s\}
R1(j,s)={x∣xj<=s},R2(j,s)={x∣xj>s}
c
1
=
a
v
e
(
y
i
∣
x
i
∈
R
1
(
j
,
s
)
)
,
c
2
=
a
v
e
(
y
i
∣
x
i
∈
R
2
(
j
,
s
)
)
c_1=ave(y_i|x_i \in R_1(j,s)),c_2=ave(y_i|x_i \in R_2(j,s))
c1=ave(yi∣xi∈R1(j,s)),c2=ave(yi∣xi∈R2(j,s))
3.重复步骤1,2直至满足条件为止
4.经过以上步骤将空间划分成M个区域
R
1
,
.
.
.
,
R
M
R_1,...,R_M
R1,...,RM,从而得到回归树模型
f
(
x
)
=
∑
m
=
1
M
c
m
I
(
x
∈
R
m
)
f(x)=\sum\limits_{m=1}^{M}c_mI(x \in R_m)
f(x)=m=1∑McmI(x∈Rm)
四、GBDT
提升树采用加法模型(基函数的线性组合)与前向分步算法,基函数为决策树。当模型难以优化((a)步骤难以求解)的时候,使用梯度下降算法,将这个算法用到决策树就成为GBDT了。下面以基函数为回归树来接收GBDT算法。
梯度提升算法:
输入:训练数据集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
}
T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}
T={(x1,y1),(x2,y2),...,(xn,yn)},损失函数
L
(
y
,
f
(
x
)
)
L(y,f(x))
L(y,f(x))
输出:提升树模型
f
(
x
)
f(x)
f(x)
(1)、初始化,用来估计使得损失函数极小化的常数值
f
0
(
x
)
=
arg
min
c
∑
i
=
1
n
L
(
y
i
,
c
)
f_0(x)=\arg\min\limits_{c}\sum\limits_{i=1}^{n}L(y_i,c)
f0(x)=argcmini=1∑nL(yi,c);
(2)、对
m
=
1
,
2
,
…
,
M
m=1,2,\dots,M
m=1,2,…,M
(a)、对每个
i
=
1
,
2
,
…
,
n
i=1,2,\dots,n
i=1,2,…,n,计算近似残差
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(b)、对 r m i , i = 1 , 2 , . . . , n r_{mi},i=1,2,...,n rmi,i=1,2,...,n(注意是n个 r r r值)进行拟合,得到回归树,得到第 m m m棵树的叶节点区域 R m j , j = 1 , 2 , . . . , J R_{mj},j=1,2,...,J Rmj,j=1,2,...,J,即 J J J个叶节点(这一步跟前面的提升树算法是一样的,只是前面省略掉了)
(c)、对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算每个区域的常数值
c m j = arg min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=\arg\min\limits_{c}\sum\limits_{x_i\in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
(d)、更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x i ∈ R m j ) f_m(x)=f_{m-1}(x)+\sum\limits_{j=1}^{J}c_{mj}I(x_i\in R_{mj}) fm(x)=fm−1(x)+j=1∑JcmjI(xi∈Rmj)
(3)、得到回归树
f ( x ) = ∑ m = 1 M c m j I ( x i ∈ R m j ) f(x)=\sum\limits_{m=1}^{M}c_{mj}I(x_i\in R_{mj}) f(x)=m=1∑McmjI(xi∈Rmj)
在步骤(1)计算使得损失函数最小的常数值,此时是只有一个节点的树,可以证明,如果损失函数是平方损失函数的时候,那么c为
y
i
y_i
yi均值,损失函数是绝对损失函数的时候c为
y
i
y_i
yi的中位数,如何证明?
提示:平方损失函数的时候,求导,令导师为0;绝对损失函数的时候将大于c的和小于c的进行拆分,那么就可以去掉绝对值了。
参数设置与正则化问题
对训练数据拟合程度过高就可能会出现过拟合现象,比如M的值很大,那么就可能出现过拟合了,所以同样要加入正则化项,比如关于叶子节点的数目成正比,即 γ T \gamma T γT,T表示叶子节点的数目。 当然也可以剪枝来降低过拟合。
叶子节点的数目控制了树的深度,显然,如果一层叶子节点巨多,那么树的树的深度是不是就很浅了呢,比如B树叶子节点巨多而很浅。一般选择深度为4到8之间。
前面说了,迭代次数M过大虽然可以降低样本损失值,但是可能会出现正则化,可以通过交叉验证来得到合适的M。
五、XGBoost
XGBoost可以认为是GBDT的改进版吧,使用了二阶信息。使用C++实现,并行/多核计算,所以实践速度是很快的。
将损失函数记做 J ( f t ) = ∑ i = 1 n L ( y i , y i t − 1 + f t ( x i ) ) + Φ ( f t ) + C J(f_t)=\sum\limits_{i=1}^{n}L(y_i,y_i^{t-1}+f_t(x_i))+\Phi(f_t)+C J(ft)=i=1∑nL(yi,yit−1+ft(xi))+Φ(ft)+C
如果觉得上面的式子很怪异,那么可以回想线性回归的损失函数 J ( θ ) = 1 2 ∑ i = 1 n L ( y i , h θ ( x i ) ) + Φ ( h θ ) J(\theta) = \frac{1}{2} \sum\limits_{i=1}^{n}L(y_i,h_\theta(x_i))+\Phi(h_\theta) J(θ)=21i=1∑nL(yi,hθ(xi))+Φ(hθ),只是前者要求的是 f t f_t ft。
其中 y i t − 1 y_i^{t-1} yit−1是上一轮求得的决策树模型(线性组合而成),而 f t ( x i ) f_t(x_i) ft(xi)是本轮要求的决策树模型,最后是需要累加到上一轮模型。 Φ ( f t ) \Phi(f_t) Φ(ft)是正则化项目, C C C为常数项(比如开始可以认为是0)。
f
(
x
)
f(x)
f(x)在点
x
0
x_0
x0处的泰勒展开式:
f
(
x
)
=
f
(
x
0
)
0
!
+
f
′
(
x
0
)
1
!
(
x
−
x
0
)
+
,
.
.
.
,
+
f
n
(
x
0
)
n
!
(
x
−
x
0
)
n
+
o
[
(
x
−
x
0
)
n
]
f(x)=\frac{f(x_0)}{0!}+\frac{f^{'}(x_0)}{1!}(x-x_0)+,...,+\frac{f^{n}(x_0)}{n!}(x-x_0)^n+o[(x-x_0)^n]
f(x)=0!f(x0)+1!f′(x0)(x−x0)+,...,+n!fn(x0)(x−x0)n+o[(x−x0)n]
余项写成了佩亚诺余项,如果令 x = x + Δ x x=x+\Delta x x=x+Δx在 x x x处展开,带入上式,省略掉 Δ x \Delta x Δx的高阶无穷小,得到
f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x + f ′ ′ ( x ) 2 Δ x 2 f(x+\Delta x)\approx f(x)+f^{'}(x)\Delta x+\frac{f^{''}(x)}{2}\Delta x^2 f(x+Δx)≈f(x)+f′(x)Δx+2f′′(x)Δx2
对于 J ( f t ) J(f_t) J(ft),将 y , y t − 1 y,y^{t-1} y,yt−1看做 x x x,将 f t ( x ) f_t(x) ft(x)看做 Δ x \Delta x Δx,同时做如下标记
g
i
=
∂
L
(
y
i
,
y
i
t
−
1
)
∂
y
i
t
−
1
g_i=\frac{\partial L(y_i,y_i^{t-1})}{\partial y_i^{t-1}}
gi=∂yit−1∂L(yi,yit−1)
h
i
=
∂
2
L
(
y
i
,
y
i
t
−
1
)
∂
y
i
t
−
1
h_i=\frac{\partial^2 L(y_i,y_i^{t-1})}{\partial y_i^{t-1}}
hi=∂yit−1∂2L(yi,yit−1)
注意到, g i g_i gi与上面介绍的GBDT中的近似残差的求法是一样的。对于 g i , h i g_i,h_i gi,hi 要求是能得知的,所以要么给定了损失函数,要么就是直接给了 g i , h i g_i,h_i gi,hi 。
那么就能得到
L
(
y
i
,
y
i
t
−
1
+
f
t
(
x
i
)
)
=
L
(
y
i
,
y
i
t
−
1
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
L(y_i,y_i^{t-1}+f_t(x_i))=L(y_i,y_i^{t-1})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)
L(yi,yit−1+ft(xi))=L(yi,yit−1)+gift(xi)+21hift2(xi),最终得到损失函数
J
(
f
t
)
≈
∑
i
=
1
n
[
L
(
y
i
,
y
i
t
−
1
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Φ
(
f
t
)
+
C
J(f_t)\approx\sum\limits_{i=1}^{n}[L(y_i,y_i^{t-1})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Phi(f_t)+C
J(ft)≈i=1∑n[L(yi,yit−1)+gift(xi)+21hift2(xi)]+Φ(ft)+C
关于决策树的描述
使用决策树做回归或者分类,是从根节点开始到叶节点的细化过程,落在相同叶节点的预测值是相同的。假定决策树的叶节点数目为 T T T ,每个叶节点的权值 w = ( w 1 , w 2 , . . . , w T ) w=(w_1,w_2,...,w_T) w=(w1,w2,...,wT),决策树的学习过程就是构造如何使用特征进行划分得到这些权值的过程。假定样本 x x x 落在叶 节点 q q q中,定义 f f f为 f t ( x ) = w q ( x ) f_t(x)=w_{q(x)} ft(x)=wq(x)。
假设样本 x i x_i xi落在了第3个节点(节点假设从1编号到 T T T)那么就有 q ( x i ) = 3 q(x_i)=3 q(xi)=3,对应的权值就是 w q ( x i ) = w 3 w_{q(x_i)}=w_3 wq(xi)=w3即第三个叶节点的权值。公式化为 f t ( x i ) = w q ( x i ) = w 3 f_t(x_i)=w_{q(x_i)}=w_3 ft(xi)=wq(xi)=w3, f t ( x ) f_t(x) ft(x)定义的就是决策树模型,给定了样本就会返回对应的叶节点的权值,所以这样做是合理的。
担心自己没说清楚,还是给出邹博老师机器学习PPT中举例的这部分吧。
关于正则化项 的定义
正则化项与模型复杂度成正相关,对于决策树来说,正则化项可以是叶子节点数目与权值平方和加权。即:
Φ ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Phi(f_t)=\gamma T+\frac{1}{2}\lambda\sum\limits_{j=1}^{T}w_j^2 Φ(ft)=γT+21λj=1∑Twj2,对于上图中的例子可以直接计算该值
Φ ( f t ) = 3 γ + 1 2 λ ( 4 + 0.01 + 1 ) \Phi(f_t)=3\gamma+\frac{1}{2}\lambda(4+0.01+1) Φ(ft)=3γ+21λ(4+0.01+1)
有了 f t ( x ) = w q ( x ) f_t(x)=w_{q(x)} ft(x)=wq(x),和 Φ ( f t ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Phi(f_t)=\gamma T+\frac{1}{2}\lambda\sum\limits_{j=1}^{T}w_j^2 Φ(ft)=γT+21λj=1∑Twj2两个式子,带入到损失函数 J ( f t ) J(f_t) J(ft)
J ( f t ) ≈ ∑ i = 1 n [ L ( y i , y i t − 1 ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Φ ( f t ) + C = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Φ ( f t ) + C = ∑ 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 + C = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i ) w j 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 + C = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T + C J(f_t)\approx\sum\limits_{i=1}^{n}[L(y_i,y_i^{t-1})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Phi(f_t)+C\\=\sum\limits_{i=1}^{n}[g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Phi(f_t)+C\\=\sum\limits_{i=1}^{n}[g_iw_{q(x_i)}+\frac{1}{2}h_iw_{q(x_i)}^2]+\gamma T+\frac{1}{2}\lambda\sum\limits_{j=1}^{T}w_j^2+C\\=\sum\limits_{j=1}^{T}[(\sum\limits_{i\in I_j}g_i)w_j+\frac{1}{2}(\sum\limits_{i\in I_j}h_i)w_j^2]+\gamma T+\frac{1}{2}\lambda\sum\limits_{j=1}^{T}w_j^2+C\\=\sum\limits_{j=1}^{T}[(\sum\limits_{i\in I_j}g_i)w_j+\frac{1}{2}(\sum\limits_{i\in I_j}h_i+\lambda)w_j^2]+\gamma T+C J(ft)≈i=1∑n[L(yi,yit−1)+gift(xi)+21hift2(xi)]+Φ(ft)+C=i=1∑n[gift(xi)+21hift2(xi)]+Φ(ft)+C=i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1∑Twj2+C=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi)wj2]+γT+21λj=1∑Twj2+C=j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT+C
对于第一个等式成立的原因,将 L ( y i , y i t − 1 ) L(y_i,y_i^{t-1}) L(yi,yit−1) 提取出来,加到常数 C C C上去,相加后的常数仍然记为 C C C;
第二个等式只是进行了带入;
第三个等式则是最难理解的,假设 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3落在第k个叶子节点,那么就有 w q ( x 1 ) = w q ( x 2 ) = w q ( x 3 ) = w k w_{q(x_1)}=w_{q(x_2)}=w_{q(x_3)}=w_k wq(x1)=wq(x2)=wq(x3)=wk第二个等式展开,对三者的 g i w q ( x i ) g_iw_{q(x_i)} giwq(xi)求和则是 ( g 1 + g 2 + g 3 ) w k (g_1+g_2+g_3)w_k (g1+g2+g3)wk,所以对于所有的 x i x_i xi展开求和得到的都是这样的形式,即落在了相同叶子节点的 g i g_i gi求和乘该叶子节点权值。如果我们遍历每个叶子节点,将落在当前叶子节点的样本对于的 g i g_i gi求和再乘权值,最后累加的结果是不是也一样呢,答案显然是一样;其中 I j I_j Ij表示第 j j j个叶子节点。
第四个等式则是简单的合并同类项。
令: G j = ∑ i ∈ I j g i G_j=\sum\limits_{i\in I_j}g_i Gj=i∈Ij∑gi, H j = ∑ i ∈ I j h i H_j=\sum\limits_{i\in I_j}h_i Hj=i∈Ij∑hi
从而
J
(
f
t
)
≈
∑
j
=
1
T
[
G
j
w
j
+
1
2
(
H
j
+
λ
)
w
j
2
]
+
γ
T
+
C
J(f_t)\approx \sum\limits_{j=1}^{T}[G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma T+C
J(ft)≈j=1∑T[Gjwj+21(Hj+λ)wj2]+γT+C
求极小值,对 w j w_j wj 求偏导,令导数为0
∂
J
(
f
t
)
∂
w
j
=
G
j
+
(
H
j
+
λ
)
w
j
=
0
\frac{\partial J(f_t)}{\partial w_j}=G_j+(H_j+\lambda)w_j=0
∂wj∂J(ft)=Gj+(Hj+λ)wj=0
−
>
w
j
=
−
G
j
H
j
+
λ
->w_j=-\frac{G_j}{H_j+\lambda}
−>wj=−Hj+λGj
这样叶节点权值就求出来了,带回到 J ( f t ) J(f_t) J(ft)得到 J ( f t ) = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T J(f_t)=-\frac{1}{2}\sum\limits_{j=1}^{T}\frac{G_j^2}{H_j+\lambda}+\gamma T J(ft)=−21j=1∑THj+λGj2+γT 常数项给省掉了
显然对于损失函数肯定是越小越好。下面给个简单的例子
对于上面的例子,如果不是上面那种划分,而是另一种划分的决策树,那么计算出来的损失函数值也会不同,与上面的损失函数值比较,选择较小的损失函数值对应的决策树。
推导到这,那么怎么构造树的结构呢?借鉴ID3/C4.5/CART的做法(比如ID3每次进行子树的划分的时候是根据信息增益最大的特征来进行划分)。具体做法认为是两步
- 对于每个可行划分,计算划分后的损失函数 J ( f ) J(f) J(f)
- 对于所有的可行划分,选择 J ( f ) J(f) J(f)降低最小的分割点。
具体的做法是,枚举所有的分割点,选择信息增益最大的划分,继续同样的操作直到满足条件(比如满足阈值或者无法划分)
G a i n ( ϕ ) = { − 1 2 ∑ j = 1 T ( G L + G R ) 2 H L + H R + λ + γ } − { − 1 2 ∑ j = 1 T G L 2 H L + λ + γ − 1 2 ∑ j = 1 T G R 2 H R + λ + γ } = − 1 2 ∑ j = 1 T { G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ } − γ Gain(\phi)=\{-\frac{1}{2}\sum\limits_{j=1}^{T}\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}+\gamma \}-\{-\frac{1}{2}\sum\limits_{j=1}^{T}\frac{G_L^2}{H_L+\lambda}+\gamma -\frac{1}{2}\sum\limits_{j=1}^{T}\frac{G_R^2}{H_R+\lambda}+\gamma\}\\=-\frac{1}{2}\sum\limits_{j=1}^{T}\{\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}\}-\gamma Gain(ϕ)={−21j=1∑THL+HR+λ(GL+GR)2+γ}−{−21j=1∑THL+λGL2+γ−21j=1∑THR+λGR2+γ}=−21j=1∑T{HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2}−γ
G L , G R G_L,G_R GL,GR分别表示左叶子和右叶子节点的 G j G_j Gj值,比如下面的例子
对于可划分点这里是四个(假设没终止那是4个,没错吧?)分别计算 G a i n ( ϕ ) Gain(\phi) Gain(ϕ),最大值对应的是我们需要的划分,而权值上面也给出了公式 w j = − G j H j + λ w_j=-\frac{G_j}{H_j+\lambda} wj=−Hj+λGj,划分好了那么当前的决策树 f t ( x ) f_t(x) ft(x)确定了,继续重复以上步骤。
以上即是XGBoost的核心推导过程。