提升树算法 AdaBoost
同样也是集成算法的随机森林,实质上利用的是Bootstrap抽样生成多个数据集,使用这些数据集构成多可决策树,最终用投票/平均的思想实现分类和预测问题的解决。而提升树是基于残差的训练,最终预测结果=模型1的预测+模型2的预测+…+模型n的预测。
多棵基础决策树f(x)的加权运算
F
(
x
)
F(x)
F(x),由M棵
基础决策树构成的最终提升树,
F
m
−
1
(
x
)
F_{m-1}(x)
Fm−1(x),经过m-1轮迭代后的提升树,
α
m
α_m
αm,第m棵基础决策树所对应的权重,
f
m
(
x
)
f_m(x)
fm(x),第m棵基础决策树
注:每一棵基础决策树是基于前一棵树的分类结果对样本点设置不同的权重,如果在前一棵基础决策树中将某样本点预测错误,就会增大该样本点的权重。
基于以上,有三个问题要解决,
样本点的权重
w
m
i
w_{mi}
wmi的确定,
基础决策树
f
(
x
)
f(x)
f(x)的选择,
每一棵基础决策树对应的权重
α
m
α_m
αm的计算。
对于分类问题,提升树的损失函数会使用指数损失函数;
对应预测问题,通常会选择平方损失函数。
L
(
y
,
F
(
x
)
)
=
e
x
p
(
−
y
F
(
x
)
)
=
e
x
p
(
−
y
∑
m
=
1
M
α
m
f
m
(
x
)
)
=
e
x
p
(
−
y
(
F
m
−
1
(
x
)
−
α
m
f
m
(
x
)
)
\begin{aligned} L(y,F(x))&\left. =exp(-yF(x)) \right. \\ &\left. =exp(-y\sum_{m=1}^{M}α_mf_m(x)) \right.\\ &\left. =exp(-y(F_{m-1}(x)-α_mf_m(x)) \right. \end{aligned}
L(y,F(x))=exp(−yF(x))=exp(−ym=1∑Mαmfm(x))=exp(−y(Fm−1(x)−αmfm(x))
如果将所有训练样本点代入损失函数中,一定存在一个最佳的
α
m
α_m
αm和
f
m
(
x
)
f_m(x)
fm(x),使得损失函数尽量最大化降低。
(
α
m
,
f
m
(
x
)
)
=
a
r
g
m
i
n
α
,
f
(
x
)
∑
i
=
1
N
e
x
p
(
−
y
i
(
F
m
−
1
(
x
i
)
+
α
m
f
m
(
x
i
)
)
)
(α_m,f_m(x))=argmin_{α,f(x)}\sum_{i=1}^{N}exp(-y_i(F_{m-1}(x_i)+α_mf_m(x_i)))
(αm,fm(x))=argminα,f(x)i=1∑Nexp(−yi(Fm−1(xi)+αmfm(xi)))
可以改写为:
(
α
m
,
f
m
(
x
)
)
=
a
r
g
m
i
n
α
,
f
(
x
)
∑
i
=
1
N
p
m
i
e
x
p
(
−
y
i
α
m
f
m
(
x
i
)
)
(α_m,f_m(x))=argmin_{α,f(x)}\sum_{i=1}^{N}p_{mi}exp(-y_iα_mf_m(x_i))
(αm,fm(x))=argminα,f(x)i=1∑Npmiexp(−yiαmfm(xi))
想要求得损失函数的最小值,首先要找到最佳的
f
m
(
x
)
f_m(x)
fm(x),使得所有训练样本点xi带入
f
m
(
x
)
f_m(x)
fm(x)后误判结果越少越好,最佳的
f
m
(
x
)
f_m(x)
fm(x)可以表示为:
f
m
(
x
)
∗
=
a
r
g
m
i
n
f
∑
i
=
1
N
p
m
i
I
(
y
i
≠
f
m
(
x
)
)
f_m(x)^*=argmin_f\sum_{i=1}^{N}p_{mi}I(y_i≠f_m(x))
fm(x)∗=argminfi=1∑NpmiI(yi=fm(x))
下一步求解损失函数中的
α
m
α_m
αm,为了求解方便,先将损失函数改写,
L
(
y
,
F
(
x
)
=
e
x
p
(
−
y
(
F
m
−
1
(
x
)
+
α
m
f
m
(
x
)
)
=
∑
i
=
1
N
p
m
i
e
x
p
(
−
y
i
α
m
f
m
(
x
i
)
)
=
∑
y
i
=
f
m
(
x
i
)
p
m
i
e
x
p
(
−
α
m
)
+
∑
y
i
=
f
m
(
x
i
)
p
m
i
e
x
p
(
α
m
)
=
∑
y
i
=
f
m
(
x
i
)
p
m
i
e
x
p
(
−
α
m
)
+
∑
y
i
≠
f
m
(
x
i
)
p
m
i
e
x
p
(
−
α
m
)
−
∑
y
i
≠
f
m
(
x
i
)
p
m
i
e
x
p
(
−
α
m
)
+
∑
y
i
=
f
m
(
x
i
)
p
m
i
e
x
p
(
α
m
)
=
(
e
x
p
(
α
m
)
−
e
x
p
(
−
α
m
)
)
∑
i
=
1
N
p
m
i
I
(
y
i
≠
f
m
(
x
)
)
+
e
x
p
(
−
α
m
)
∑
i
=
1
N
p
m
i
\begin{aligned} L(y,F(x)&\left. =exp(-y(F_{m-1}(x)+α_mf_m(x)) \right. \\ &\left. = \sum_{i=1}^Np_{mi}exp(-y_iα_mf_m(x_i)) \right.\\ &\left. = \sum_{y_i=f_m(x_i)}p_{mi}exp(-α_m)+ \sum_{y_i=f_m(x_i)}p_{mi}exp(α_m) \right.\\ &\left. = \sum_{y_i=f_m(x_i)}p_{mi}exp(-α_m)+ \sum_{y_i≠f_m(x_i)}p_{mi}exp(-α_m)-\sum_{y_i≠f_m(x_i)}p_{mi}exp(-α_m)+\sum_{y_i=f_m(x_i)}p_{mi}exp(α_m)\right.\\ &\left. =(exp(α_m)-exp(-α_m)) \sum_{i=1}^Np_{mi}I(y_i≠f_m(x)) +exp(-α_m)\sum_{i=1}^Np_{mi}\right.\\ \end{aligned}
L(y,F(x)=exp(−y(Fm−1(x)+αmfm(x))=i=1∑Npmiexp(−yiαmfm(xi))=yi=fm(xi)∑pmiexp(−αm)+yi=fm(xi)∑pmiexp(αm)=yi=fm(xi)∑pmiexp(−αm)+yi=fm(xi)∑pmiexp(−αm)−yi=fm(xi)∑pmiexp(−αm)+yi=fm(xi)∑pmiexp(αm)=(exp(αm)−exp(−αm))i=1∑NpmiI(yi=fm(x))+exp(−αm)i=1∑Npmi
基于上述的损失函数求解最佳
α
m
α_m
αm,能够使损失函数取得最小值。
d
L
(
y
,
F
(
x
)
)
d
α
m
=
(
α
m
e
α
m
+
α
m
e
−
α
m
)
∑
i
=
1
N
p
m
i
I
(
y
i
≠
f
m
(
x
)
)
−
α
m
e
−
α
m
∑
i
=
1
N
p
m
i
\frac{dL(y,F(x))}{dα_m}=(α_me^{α_m}+α_me^{-α_m})\sum_{i=1}^Np_{mi}I(y_i≠f_m(x))-α_me^{-α_m}\sum_{i=1}^Np_{mi}
dαmdL(y,F(x))=(αmeαm+αme−αm)i=1∑NpmiI(yi=fm(x))−αme−αmi=1∑Npmi
令倒数函数为0,求得,其中
e
m
e_m
em是错误率,
α
m
∗
=
0.5
l
o
g
1
−
e
m
e
m
α_m^*=0.5log\frac{1-e_m}{e_m}
αm∗=0.5logem1−em
在求得第m轮基础决策树
f
m
(
x
)
f_m(x)
fm(x)以及对应的权重
α
m
α_m
αm后,便可得到经m次迭代后的提升树
F
m
(
x
)
=
F
m
−
1
(
x
)
+
α
m
∗
f
m
(
x
i
)
∗
F_m(x)=F_{m-1}(x)+α_m^*f_m(x_i)^*
Fm(x)=Fm−1(x)+αm∗fm(xi)∗,再根据
p
m
i
=
e
x
p
[
−
y
i
F
m
−
1
(
x
i
)
]
p_{mi}=exp[-y_iF_{m-1}(x_i)]
pmi=exp[−yiFm−1(xi)],进而可以计算得到第m+1轮基础决策树中样本点的权重
w
m
i
w_{mi}
wmi:
w
m
+
1
,
i
=
w
m
i
e
x
p
[
−
y
i
α
m
∗
f
m
(
x
i
)
∗
]
w_{m+1,i}=w_{mi}exp[-y_iα_m^*f_m(x_i)^*]
wm+1,i=wmiexp[−yiαm∗fm(xi)∗]
为了使样本权重单位化,需要将每一个
w
m
+
i
,
i
w_{m+i,i}
wm+i,i与所有样本点的权重和商做处理,即:
w
m
+
1
,
i
=
w
m
i
e
x
p
(
y
i
α
m
∗
f
m
(
x
i
)
∗
)
∑
i
=
1
N
w
m
i
e
x
p
(
y
i
α
m
∗
f
m
(
x
i
)
∗
)
w_{m+1,i}=\frac{w_{mi}exp(y_iα_m^*f_m(x_i)^*)}{\sum_{i=1}^Nw_{mi}exp(y_iα_m^*f_m(x_i)^*)}
wm+1,i=∑i=1Nwmiexp(yiαm∗fm(xi)∗)wmiexp(yiαm∗fm(xi)∗)
至此,我们得到了三个问题的解,样本点的权重
w
m
i
w_{mi}
wmi,基础决策树
f
(
x
)
f(x)
f(x),每一棵基础决策树对应的权重
α
m
α_m
αm。
在python中的调用
from sklearn.ensemble import AdaBoostClassifier
AdaBoostClassifier(base_estimator=None,n_estimator=50,learning_rate=1.0,algorithm='SAMME.R',random_state=None)
from sklearn.ensemble import AdaBoostRegressor
AdaBoostRegressor(base_estimator=None,n_estimator=50,learning_rate=1.0,algorithm='linear',random_state=None)
#best_estimator:指定提升算法应用的基础分类器,默认为分类决策树(CART)
#n_estimator:指定基础分类器的数量,默认为50个
#learning_rate:指定的学习步长,默认为1.0
#algorithm:指定分类器的算法
#loss:指定损失函数,linear,square,exponential,默认是linear
梯度提升树算法 GBDT
原始的提升算法中,如果损失函数为平方损失或指数损失,求解损失函数的最小值问题会非常简单,当损失函数为更一般的函数,如绝对值损失或Huber损失函数,目标值的求解就会复杂很多。Friedman提出了梯度提升算法,即在m轮基础模型中,利用损失函数的负梯度近似值作为该轮基础模型损失值的近似,并利用这个近似值构建下一轮基础模型。
GBDT(Gradient Boosting Decision Tree,梯度提升树)是一种有监督的集成算法,同样可以用于分类问题的识别和预测问题的解决。拥有三方面的优势,分别是提升Boosting,梯度Gradient和决策树Decision Tree。
“提升”,将多个弱分类器通过线下组合实现强分类器的过程;
“梯度”,算法在Boosting的过程中求解损失函数增强了灵活性和便捷性;
“决策树”,算法所使用的弱分类器为CART决策树。
在python中的调用
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import GradientBoostingRegressor
GradientBoostingClassifier(loss='deviance',learning_rate=0.1,n_eatimator=100,subsample=1.0,criterion='friedman_mse',min_sample_split=2,min_sample_leaf=1,min_weight_fraction_leaf=0.0,max_depth=3,min_impurity_decrease=0.0,min_impurity_split=None,init=None,random_state=None,max_features=None,verbose=0,max_leaf_nodes=None,warm_start=False,presort='auto')
GradientBoostingRegressor(loss='ls',learning_rate=0.1,n_eatimator=100,subsample=1.0,criterion='friedman_mse',min_sample_split=2,min_sample_leaf=1,min_weight_fraction_leaf=0.0,max_depth=3,min_impurity_decrease=0.0,min_impurity_split=None,init=None,random_state=None,max_features=None,alpha=0.9,verbose=0,max_leaf_nodes=None,warm_start=False,presort='auto')
#loss:指定损失函数,对于分类的,可以选择deviance对数似然损失或exponential指数损失函数;对于预测的,可以选择ls平方损失函数或lad绝对值损失函数或huber损失函数或quantile平方损失函数
#subsample:指定基础模型所使用的的抽样比例
XGBoost算法
GBDT模型求解最优化问题应用了一阶导,XGBoost使用一阶和二阶导,而且可以自定义损失函数。还支持并行计算,可以加入正则防止过拟合,支持CART基础模型和线性基础模型,可以对字段进行抽样防止过拟合且减少计算量。
XGBoost的损失函数
提升算法的核心思想就是多个基础模型的线性组合,对于一棵含有t个基础模型的集成树来说可以表示为:
y
^
l
(
t
)
=
∑
k
=
1
t
f
k
(
x
i
)
=
y
^
l
(
t
−
1
)
+
f
t
(
x
i
)
\hat{y}_l^{(t)}=\sum_{k=1}^{t}f_k(x_i)=\hat{y}_l^{(t-1)}+f_t(x_i)
y^l(t)=k=1∑tfk(xi)=y^l(t−1)+ft(xi)
y
^
l
(
t
)
\hat{y}_l^{(t)}
y^l(t),经过t轮迭代后的模型预测值,
y
^
l
(
t
−
1
)
\hat{y}_l^{(t-1)}
y^l(t−1),已知t-1个基础模型的预测值,
f
t
(
x
i
)
f_t(x_i)
ft(xi),第t个基础模型,
关键点在于寻找一个能够使目标函数尽可能最大化降低的
f
t
f_t
ft即可,构造目标函数,
O
b
j
(
t
)
=
∑
i
=
1
n
L
(
y
i
,
y
^
l
(
t
)
)
+
∑
j
=
1
t
Ω
(
f
i
)
=
∑
i
=
1
n
L
(
y
i
,
y
^
l
(
t
−
1
)
+
f
t
(
x
i
)
)
+
∑
j
=
1
t
Ω
(
f
i
)
\begin{aligned} Obj^{(t)} &\left. =\sum_{i=1}^{n}L(y_i,\hat{y}_l^{(t)})+\sum_{j=1}^{t}Ω(f_i) \right.\\ &\left. =\sum_{i=1}^{n}L(y_i,\hat{y}_l^{(t-1)}+f_t(x_i))+\sum_{j=1}^{t}Ω(f_i) \right.\\ \end{aligned}
Obj(t)=i=1∑nL(yi,y^l(t))+j=1∑tΩ(fi)=i=1∑nL(yi,y^l(t−1)+ft(xi))+j=1∑tΩ(fi)
Ω
(
f
i
)
Ω(f_i)
Ω(fi),第j个基础模型的正则项。为了简单起见,将损失函数表示为平方损失,
O
b
j
(
t
)
=
∑
i
=
1
n
(
y
i
−
(
y
^
(
t
−
1
)
+
f
t
(
x
i
)
)
)
2
+
∑
j
=
1
t
Ω
(
f
i
)
=
∑
i
=
1
n
(
2
f
t
(
x
i
)
(
y
^
l
(
t
−
1
)
−
y
i
)
+
f
t
(
x
i
)
2
+
(
y
i
−
y
^
l
(
t
−
1
)
)
2
)
+
∑
j
=
1
t
Ω
(
f
i
)
\begin{aligned} Obj^{(t)} &\left. =\sum_{i=1}^n(y_i-(\hat{y}^{(t-1)}+f_t(x_i)))^2+\sum_{j=1}^{t}Ω(f_i) \right.\\ &\left. =\sum_{i=1}^n(2f_t(x_i)(\hat{y}_l^{(t-1)}-y_i)+f_t(x_i)^2+(y_i-\hat{y}_l^{(t-1)})^2)+\sum_{j=1}^{t}Ω(f_i) \right. \end{aligned}
Obj(t)=i=1∑n(yi−(y^(t−1)+ft(xi)))2+j=1∑tΩ(fi)=i=1∑n(2ft(xi)(y^l(t−1)−yi)+ft(xi)2+(yi−y^l(t−1))2)+j=1∑tΩ(fi)
前t-1基础模型已知,
y
^
l
(
t
−
1
)
\hat{y}_l^{(t-1)}
y^l(t−1)已知,前t-1个基础模型的复杂度也是一致,将已知项设为常数constant,
O
b
j
(
t
)
=
∑
i
=
1
n
(
2
f
t
(
x
i
)
(
y
^
l
(
t
−
1
)
−
y
i
)
+
f
t
(
x
i
)
2
)
+
∑
j
=
1
t
Ω
(
f
i
)
+
c
o
n
s
t
a
n
t
Obj^{(t)}=\sum_{i=1}^n(2f_t(x_i)(\hat{y}_l^{(t-1)}-y_i)+f_t(x_i)^2)+\sum_{j=1}^{t}Ω(f_i) +constant
Obj(t)=i=1∑n(2ft(xi)(y^l(t−1)−yi)+ft(xi)2)+j=1∑tΩ(fi)+constant
(
y
^
l
(
t
−
1
)
−
y
i
)
(\hat{y}_l^{(t-1)}-y_i)
(y^l(t−1)−yi)是前t-1个基础模型所产生的的残差。
根据泰勒展开式:
f
(
x
+
△
x
)
≈
f
(
x
)
+
f
(
x
)
′
△
x
+
f
(
x
)
′
′
△
x
2
f(x+△x)≈f(x)+f(x)'△x+f(x)''△x^2
f(x+△x)≈f(x)+f(x)′△x+f(x)′′△x2
假设令损失函数
L
L
L为泰勒函数中的
f
f
f,令损失函数
y
^
l
(
t
−
1
)
\hat{y}_l^{(t-1)}
y^l(t−1)为泰勒公式中的
x
x
x,
f
t
(
x
i
)
f_t(x_i)
ft(xi)为泰勒公式中的
△
x
△x
△x,目标函数近似表示为:
O
b
j
(
t
)
=
∑
i
=
1
n
L
(
y
i
,
y
^
l
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
≈
∑
i
=
1
n
(
L
(
y
i
,
y
^
l
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
0.5
h
i
f
t
(
x
i
)
2
)
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
\begin{aligned} Obj^{(t)} &\left. =\sum_{i=1}^{n}L(y_i,\hat{y}_l^{(t-1)}+f_t(x_i))+Ω(f_t) \right.\\ &\left. ≈\sum_{i=1}^{n}(L(y_i,\hat{y}_l^{(t-1)})+g_if_t(x_i)+0.5h_if_t(x_i)^2)+Ω(f_t)+constant \right.\\ \end{aligned}
Obj(t)=i=1∑nL(yi,y^l(t−1)+ft(xi))+Ω(ft)≈i=1∑n(L(yi,y^l(t−1))+gift(xi)+0.5hift(xi)2)+Ω(ft)+constant
g
i
g_i
gi和
h
i
h_i
hi分别是损失函数关于
y
^
l
(
t
−
1
)
\hat{y}_l^{(t-1)}
y^l(t−1)的一阶导函数值和二阶导函数值。
损失函数的演变
假设基础函数模型
f
t
f_t
ft由CART树构成,对于一棵树来说,可以被拆分为结构部分
q
q
q,叶子节点所对应的输出值
w
w
w。利用这两部分反映树的复杂度,
Ω
(
f
t
)
=
γ
T
+
0.5
λ
∑
j
=
1
T
w
j
2
Ω(f_t)=\gamma T+0.5\lambda\sum_{j=1}^Tw_j^2
Ω(ft)=γT+0.5λj=1∑Twj2
T
T
T,叶子节点的个数,
w
j
2
w_j^2
wj2,输出向量的平方,
CART树生长越复杂,对应的
T
T
T越大,
Ω
(
f
t
)
Ω(f_t)
Ω(ft)越大。
O
b
j
(
t
)
≈
∑
i
=
1
n
(
L
(
y
i
,
y
^
l
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
0.5
h
i
f
t
(
x
i
)
2
)
+
Ω
(
f
t
)
+
c
o
n
s
t
a
n
t
≈
∑
i
=
1
n
(
g
i
f
t
(
x
i
)
+
0.5
h
i
f
t
(
x
i
)
2
)
+
γ
T
+
0.5
λ
∑
j
=
1
T
w
j
2
+
c
o
n
s
t
a
n
t
≈
∑
i
=
1
n
(
g
i
w
q
(
x
i
)
+
0.5
h
i
w
q
(
x
i
)
2
)
+
γ
T
+
0.5
λ
∑
j
=
1
T
w
j
2
+
c
o
n
s
t
a
n
t
≈
∑
j
=
1
T
(
(
∑
i
∈
I
j
g
i
)
w
j
+
0.5
(
∑
i
∈
I
j
h
i
)
w
j
2
)
+
γ
T
+
0.5
λ
∑
j
=
1
T
w
j
2
+
c
o
n
s
t
a
n
t
≈
∑
j
=
1
T
(
(
∑
i
∈
I
j
g
i
)
w
j
+
0.5
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
)
+
γ
T
+
c
o
n
s
t
a
n
t
≈
∑
j
=
1
T
(
(
∑
i
∈
I
j
g
i
)
w
j
+
0.5
(
∑
i
∈
I
j
h
i
+
λ
)
w
j
2
)
+
γ
T
≈
∑
j
=
1
T
(
G
j
w
j
+
0.5
(
h
j
+
λ
)
w
j
2
)
+
γ
T
\begin{aligned} Obj^{(t)} &\left. ≈\sum_{i=1}^{n}(L(y_i,\hat{y}_l^{(t-1)})+g_if_t(x_i)+0.5h_if_t(x_i)^2)+Ω(f_t)+constant \right.\\ &\left. ≈\sum_{i=1}^{n}(g_if_t(x_i)+0.5h_if_t(x_i)^2)+\gamma T+0.5\lambda\sum_{j=1}^Tw_j^2+constant \right.\\ &\left. ≈\sum_{i=1}^{n}(g_iw_q(x_i)+0.5h_iw_q(x_i)^2)+\gamma T+0.5\lambda\sum_{j=1}^Tw_j^2+constant \right.\\ &\left. ≈\sum_{j=1}^T((\sum_{i\in I_j}g_i)w_j+0.5(\sum_{i\in I_j}h_i)w_j^2)+\gamma T+0.5\lambda\sum_{j=1}^Tw_j^2+constant \right.\\ &\left. ≈\sum_{j=1}^T((\sum_{i\in I_j}g_i)w_j+0.5(\sum_{i\in I_j}h_i+\lambda)w_j^2)+\gamma T+constant \right.\\ &\left. ≈\sum_{j=1}^T((\sum_{i\in I_j}g_i)w_j+0.5(\sum_{i\in I_j}h_i+\lambda)w_j^2)+\gamma T \right.\\ &\left. ≈\sum_{j=1}^T(G_jw_j+0.5(h_j+\lambda)w_j^2)+\gamma T \right.\\ \end{aligned}
Obj(t)≈i=1∑n(L(yi,y^l(t−1))+gift(xi)+0.5hift(xi)2)+Ω(ft)+constant≈i=1∑n(gift(xi)+0.5hift(xi)2)+γT+0.5λj=1∑Twj2+constant≈i=1∑n(giwq(xi)+0.5hiwq(xi)2)+γT+0.5λj=1∑Twj2+constant≈j=1∑T((i∈Ij∑gi)wj+0.5(i∈Ij∑hi)wj2)+γT+0.5λj=1∑Twj2+constant≈j=1∑T((i∈Ij∑gi)wj+0.5(i∈Ij∑hi+λ)wj2)+γT+constant≈j=1∑T((i∈Ij∑gi)wj+0.5(i∈Ij∑hi+λ)wj2)+γT≈j=1∑T(Gjwj+0.5(hj+λ)wj2)+γT
w
q
(
x
i
)
w_{q(x_i)}
wq(xi),第i个样本点的输入值
x
i
x_i
xi所对应的输出值,
i
∈
I
j
i\in{I_j}
i∈Ij,每个叶节点
j
j
j中所包含的样本集合,
G
j
=
∑
i
∈
I
j
g
i
G_j=\sum_{i\in{I_j}}g_i
Gj=∑i∈Ijgi,属于叶子节点
j
j
j的样本点对应的
g
i
g_i
gi之和,
H
j
=
∑
i
∈
I
j
h
i
H_j=\sum_{i\in{I_j}}h_i
Hj=∑i∈Ijhi,属于叶子节点
j
j
j的样本点对应的
h
i
h_i
hi之和,
最终是寻找一个合理的
f
t
f_t
ft,使得式子尽可能的小。
由于构建XGBoost模型之前需要指定某个损失函数
L
L
L如平方损失,指数损失,Huber损失等,进而某种树结构
q
q
q下的
G
j
G_j
Gj和
H
j
H_j
Hj是已知的。要想
O
b
j
(
t
)
Obj^{(t)}
Obj(t)的最小化,需要对方程中的
w
j
w_j
wj(每个叶子节点的输出值)求偏导,并令导数为0,
d
O
b
j
(
t
)
d
w
j
=
G
j
+
(
H
j
+
λ
)
w
j
=
0
\frac{dObj^{(t)}}{dw_j}=G_j+(H_j+\lambda)w_j=0
dwjdObj(t)=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
=
1
T
(
G
j
w
j
+
0.5
(
h
j
+
λ
)
w
j
2
)
+
γ
T
=
−
0.5
∑
j
=
1
T
(
G
j
2
H
j
+
λ
)
+
γ
T
\begin{aligned} J(f_t)) &\left. =\sum_{j=1}^T(G_jw_j+0.5(h_j+\lambda)w_j^2)+\gamma T \right.\\ &\left. =-0.5\sum_{j=1}^T(\frac{G_j^2}{H_j+\lambda})+\gamma T \right.\\ \end{aligned}
J(ft))=j=1∑T(Gjwj+0.5(hj+λ)wj2)+γT=−0.5j=1∑T(Hj+λGj2)+γT
目前的问题是,树结构
q
q
q该如何选择,即最佳的树结构
q
q
q就对应了最佳的基础模型
f
t
f_t
ft。最笨的方法是测试不同分割字段和分割点下的树结构
q
q
q,并计算出所对应的
J
(
f
t
)
J(f_t)
J(ft)值,从而挑选出使得
J
(
f
t
)
J(f_t)
J(ft)达到最小的树结构。这种枚举计算量很大,通常选择贪心算法,即在某个已有的可划分节点中加入一个分割,并通过计算分割前后的增益值决定是否剪枝,增益计算如下,
G
a
i
n
=
0.5
(
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
)
−
γ
Gain=0.5(\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=0.5(HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2)−γ
G
L
G_L
GL和
H
L
H_L
HL为某节点分割后对应的左支样本点的导函数,
G
R
G_R
GR和
H
R
H_R
HR为某节点分割后对应的右支样本点的导函数。这里的增益量就是某节点分割为另外两个节点后对应的目标值
J
(
f
t
)
J(f_t)
J(ft)的减少量。
实际应用中,根据某个给定的增益阈值,对树的生长进行剪枝,当节点分割后产生的增益小于阈值时,减掉该分割,否则允许分割。
在python中调用
from xgboosting import XGBClassifier
from xgboosting import XGBRegressor
XGBClassifier(max_septh=3,learning_rate=0.1,n_estimator=100,silent=True,objective='binary:logistic',booster='gbtree',n_jobs=1,nthread=None,gamma=0,min_child_weight=1,max_delta_step=0,subsample=1,colsample_bytree=1,colsample_bylevel=1,reg_alpha=0,reg_lambda=1,scale_pos_weight=1,base_score=0.1,random_state=0,seed=None,missing=None)
XGBRegressor(max_septh=3,learning_rate=0.1,n_estimator=100,silent=True,objective='reg"linear',booster='gbtree',n_jobs=1,nthread=None,gamma=0,min_child_weight=1,max_delta_step=0,subsample=1,colsample_bytree=1,colsample_bylevel=1,reg_alpha=0,reg_lambda=1,scale_pos_weight=1,base_score=0.1,random_state=0,seed=None,missing=None)
#objective:目标函数中的损失函数类型,对于分类型,默认为二分类的logistic损失,也可以是'multi:softmax',表示多分类的损失函数,还可以是'multi:softprob';对于预测型,默认为线性回归损失
#booster:指定基础模型的类型,默认为'gbtree',即CART模型,也可以是'gblinear',即线性模型
#gamma:节点分割所需的最小损失函数下降值,即增益值Gain的阈值,默认为0