XGboost/Adaboost算法 程序对比
https://blog.csdn.net/weixin_42567027/article/details/107535632
提升
提升是一个机器学习技术,可以用于回归和分类问题,它每一步产生一个弱预测模型(如决策树),并加权累加到总模型中,如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之为梯度提升。
梯度提升算法首先给定一个目标损失函数,它的定义域是所有可信的弱函数集合(基函数);提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部最小值。
提升算法
- 给定输入向量x和输出变量y组成若干训练样本
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
(x_1,y_1),(x_2,y_2),...,(x_n,y_n)
(x1,y1),(x2,y2),...,(xn,yn),目标是找到近似函数
F
(
x
⃗
)
F(\vec x)
F(x),使得损失函数
L
(
y
,
F
(
x
)
)
L(y,F(x))
L(y,F(x))的损失值最小。
其中 L ( y , F ( x ) ) L(y,F(x)) L(y,F(x))可以定义为
L ( y , F ( x ⃗ ) ) L(y,F(\vec x)) L(y,F(x))= 1 2 ( y − F ( x ⃗ ) ) 2 \frac{1}{2}(y-F(\vec x))^2 21(y−F(x))2 均方误差
L ( y , F ( x ⃗ ) ) L(y,F(\vec x)) L(y,F(x))= ∣ y − F ( x ⃗ ) ∣ |y-F(\vec x)| ∣y−F(x)∣ 绝对值差
y y y是实际值, F ( x ⃗ ) F(\vec x) F(x)是预测值。 - 假定最优函数 F ∗ ( x ⃗ ) F^*(\vec x) F∗(x)= a r g m i n E ( x , y ) [ L ( y , F ( x ⃗ ) ) ] argminE_(x,y)[L(y,F(\vec x))] argminE(x,y)[L(y,F(x))]
-
F
(
x
)
F(x)
F(x)是基函数
f
i
(
x
)
f_i(x)
fi(x)的加权和
F ( x ⃗ ) = ∑ i = 1 M r i f i ( x ) + c o n s t F(\vec x)=\displaystyle\sum_{i=1}^{M} r_if_i(x)+const F(x)=i=1∑Mrifi(x)+const
梯度提升算法寻找最优解
F
(
x
)
F(x)
F(x),使得损失函数在训练集上的期望最小。
具体公式:
给定常函数
F
0
(
x
)
=
a
r
g
m
i
n
∑
i
=
1
n
L
(
y
i
,
γ
)
F_0( x)=argmin\displaystyle\sum_{i=1}^{n}L(y_i,\gamma)
F0(x)=argmini=1∑nL(yi,γ),对于m=1到M
- 计算伪残差 r i m = [ d d F ( x ⃗ ) L ( y , F ( x ⃗ ) ) ] F ( x ⃗ ) = F m − 1 ( x ⃗ i ) , i = 1 , 2... n r_{im}=[\frac{d}{dF(\vec x)}L(y,F(\vec x))]_{F(\vec x)=F_{m-1}(\vec x_i)},i=1,2...n rim=[dF(x)dL(y,F(x))]F(x)=Fm−1(xi),i=1,2...n
- 使用数据{ ( x ⃗ , r i m ) i = 1 n {(\vec x,r_{im})}_{i=1}^n (x,rim)i=1n}计算拟合残差的基函数 f m ( x ) f_m(x) fm(x)
- 计算步长 γ m = a r g m i n ∑ i = 1 n L ( y i , F m − 1 ( x ⃗ i ) − γ . f m ( x ⃗ i ) ) \gamma_m=argmin\displaystyle\sum_{i=1}^{n}L(y_i,F_{m-1}(\vec x_i)-\gamma.f_m(\vec x_i)) γm=argmini=1∑nL(yi,Fm−1(xi)−γ.fm(xi))
- 更新模型 F m ( x ⃗ ) = F m − 1 ( x ⃗ ) − γ m f m ( x ⃗ i ) F_m(\vec x)=F_{m-1}(\vec x)-\gamma_mf_m(\vec x_i) Fm(x)=Fm−1(x)−γmfm(xi)
梯度提升决策树GBDT
GBDT是在函数空间上利用梯度下降进行优化,是多个弱分类器合成强分类器的过程(加权求和),每次迭代产生一个弱分类器,当前弱分类器是在之前分类器残差基础上训练。
公式推导
- 在第m步的梯度提升是根据伪残差数据计算决策树
t
m
(
x
)
t_m(x)
tm(x)
t m ( x ⃗ ) = ∑ j = 1 J b j m I ( x ⃗ ∈ R j m ) t_m(\vec x)=\displaystyle\sum_{j=1}^{J}b_{jm}I(\vec x\in\R_{jm}) tm(x)=j=1∑JbjmI(x∈Rjm)
J是叶节点数目, R J m R_{Jm} RJm是输入空间划分的 J J J个不相交区域,并且每个区域中给定出某个类型的确定性预测。 b i m b_{im} bim是样本x在区域 R j m R_{jm} Rjm的预测值。 I ( x ) I(x) I(x)是指示符号。 - 使用线性搜索计算学习率,最小化损失函数
F
m
(
x
⃗
)
=
F
m
−
1
(
x
⃗
)
−
γ
m
t
m
(
x
⃗
i
)
F_m(\vec x)=F_{m-1}(\vec x)-\gamma_mt_m(\vec x_i)
Fm(x)=Fm−1(x)−γmtm(xi)
r m = a r g m i n ∑ i = 1 n L ( y i , F m − 1 ( x ⃗ i ) − γ . t m ( x ⃗ i ) ) r_m=argmin\displaystyle\sum_{i=1}^{n}L(y_i,F_{m-1}(\vec x_i)-\gamma.t_m(\vec x_i)) rm=argmini=1∑nL(yi,Fm−1(xi)−γ.tm(xi)) - 对树的每个区域分别计算步长,conger系数
b
j
m
b_{jm}
bjm被合并到步长中,得到
F
m
(
x
⃗
)
=
F
m
−
1
(
x
⃗
)
+
∑
j
=
1
J
γ
j
m
I
(
x
⃗
∈
R
j
m
)
F_m(\vec x)=F_{m-1}(\vec x)+\displaystyle\sum_{j=1}^{J}\gamma_{jm}I(\vec x\in\R_{jm})
Fm(x)=Fm−1(x)+j=1∑JγjmI(x∈Rjm)
γ j m = a r g m i n ∑ x ⃗ ∈ R j m L ( y i , F m − 1 ( x ⃗ i ) − γ . t m ( x ⃗ i ) ) \gamma_{jm}=argmin\displaystyle\sum_{\vec x\in\R_{jm}}L(y_i,F_{m-1}(\vec x_i)-\gamma.t_m(\vec x_i)) γjm=argminx∈Rjm∑L(yi,Fm−1(xi)−γ.tm(xi)) - 设置衰减因子 F m ( x ⃗ ) = F m − 1 ( x ⃗ ) + ν . γ m f m ( x ⃗ i ) , 0 < ν < 1 F_m(\vec x)=F_{m-1}(\vec x)+\nu.\gamma_mf_m(\vec x_i),0<\nu<1 Fm(x)=Fm−1(x)+ν.γmfm(xi),0<ν<1, ν \nu ν是学习率
- 设置降采样(Stochastic gradient boosting) :能够使用剩余样本做模型验证
每次迭代都对伪残差样本应用无放回的降采样,用部分样本训练基函数的参数。
XGboost算法
XGboost实现中使用了并行/多核计算,训练速度快。
公式推导
2. 使用决策树做分类,样本
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),一个决策树的核心即:“树结构”和“叶权值”
3. 正则项
决策树的复杂度可考虑叶结点数和叶权值,如使用叶结点总数和叶权值平方和的加权。
Ω
(
f
t
)
=
γ
T
+
1
2
λ
∑
j
=
1
T
w
j
2
\varOmega(f_t)=\gamma T+\frac{1}{2}\lambda\displaystyle\sum_{j=1}^{T}w_j^2
Ω(ft)=γT+21λj=1∑Twj2
4 目标函数计算
5.
Adaboost算法
模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类学习方法。
先通过对N个训练样本的学习得到第一个弱分类器; 将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器 ; 将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器; 最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。
公式推导
- 训练数据集 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)
- 初始化训练集数据的权值分布 D 1 = ( w 11 , w 12 . . . w 1 i . . . w 1 N ) , w 1 i = 1 N , i = 1 , 2 , . . . , N D_1=(w_{11},w_{12}...w_{1i}...w_{1N}),w_{1i}=\frac{1}{N},i=1,2,...,N D1=(w11,w12...w1i...w1N),w1i=N1,i=1,2,...,N
- 使用权值分布 D m D_m Dm的训练数据集学习,得到基本分类器 G m ( x ) : x → − 1 , 1 G_m(x):x\rarr{-1,1} Gm(x):x→−1,1
- 计算
G
m
(
x
)
G_m(x)
Gm(x)在训练数据集上的分类误差率
e m = P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x ) ≠ y i ) e_m=P(G_m(x_i)\neq y_i)=\displaystyle\sum_{i=1}^{N}w_{mi}I(G_m(x)\neq y_i) em=P(Gm(xi)=yi)=i=1∑NwmiI(Gm(x)=yi) - 计算 G m ( x ) G_{m(x)} Gm(x)的系数 α m = 1 2 log 2 1 − e m e m \alpha_m=\frac{1}{2}\log_2 \frac{1-e_m}{e_m} αm=21log2em1−em
- 更新训练数据集的权值分布
D
m
+
1
=
(
w
m
+
1
,
1
,
w
m
+
1
,
2
.
.
.
w
m
+
1
,
i
.
.
.
w
m
+
1
,
N
)
,
w
m
+
1
,
i
=
w
m
i
Z
m
e
x
p
(
−
α
m
y
i
G
m
(
x
i
)
)
,
i
=
1
,
2...
,
N
D_{m+1}=(w_{m+1,1},w_{m+1,2}...w_{m+1,i}...w_{m+1,N}),w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),i=1,2...,N
Dm+1=(wm+1,1,wm+1,2...wm+1,i...wm+1,N),wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2...,N
Z m Z_m Zm是规范化因子 - 构建基本分类器的线性组合
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
f(x)=\displaystyle\sum_{m=1}^{M}\alpha_mG_m(x)
f(x)=m=1∑MαmGm(x),进而得到最终分类器
G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) ) G(x)=sign(f(x))=sign(\displaystyle\sum_{m=1}^{M}\alpha_mG_m(x)) G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
算法对比
Adaboost与GBDT
- Adaboost每轮学习的一个基本学习器是通过改变样本的权值,关注上轮分类错误的样本的权值,以逐步减少在训练集上的分类误差率。
- GBDT每轮学习一个基本学习器是通过改变输出值,每轮拟合的值为真实值与已有的加法模型的差值(即残差)。GBDT无论是进行分类还是回归问题,都用的CART树。对于分类问题用二叉分类树,回归问题用二叉回归树。
GBDT与XGboost
- 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
- Xgboost在代价函数里加入了正则项,正则项降低了模型variance,使学习出来的模型更加简单,防止过拟合。
- XGboost可进行并行计算。