一,集成学习
决策树的集成学习分成两大类,Bagging和Adaboost。AdaBoost中着重介绍boosting。
Bagging的策略:
(1)从样本集中重采样(有重复的)选出n个样本;
(2)在所有属性上,对这n个样本建立分类器(ID3、C4.5、CART、SVM、Logistic回归等);
(3)重复以上两步m次,即获得了m个分类器;
(4)将数据放在这m个分类器上,最后根据这m个分类器的投票结果,决定数据属于哪一类。
在Bagging方法中,每个学习器之间彼此是相互独立的,这样的特点使得Bagging方法更容易并行。
二,Bagging,Adaboost与Boosting DecisionTree(提升树)
通过m次的迭代,每次迭代训练出不同的弱分类器,然后将这m个弱分类器进行组合,形成一个强分类器。
与Bagging方法不同,在AdaBoost算法中,学习器之间是存在先后顺序的,同时,每一个样本是有权重的,初始时,每一个样本的权重是相等的。在学习的过程中更改样本的权重,增大错误样本的权重,同时减小正确样本的权重。
1,Adaboost两个问题
问题1:如何改变训练数据的权重或概率分布。
训练时提高那些被前一轮分类器错误分类的样本的权重,降低那些被正确分类的样本的权重。
问题2:弱分类器如何组合成强分类器
在组合时加大分类误差小的分类器在最终投票时的权重,减小分类误差率大的分类器的权重。
2,AdaBoost与Bagging的不同
样本上: Bagging采取的是随机有放回的取样,每个样本的权重相同且不变;
AdaBoost的每一轮训练的样本是固定的,训练过程中错误率越大的样本权重会变大。
预测函数上:Bagging所以的预测函数权值相同,AdaBoost中误差越小的预测函数其权值越大。
并行计算: Bagging的各个预测函数可以并行生成;AdaBoost的各个预测函数必须按照顺序迭代生成.
3,Boosting DecisionTree
Boosting DecisionTree和AdaBoost都是属于Boost的两种方法。
Boosting DecisionTree下一棵决策树拟合的是残差。其损失函数是平方差损失函数。
AdaBoost其实就是特殊的前向分步算法,用到的损失函数是指数函数。
Boosting DT的损失函数是平方差损失;Boosting DT所有树的权重都是1;
三,boosting到BDT(梯度提升树)
一般的Boosting:
加法模型使用一个前向分布算法:从前往后每一步只学习一个基函数及其系数,逐步逼近优化目标函数式。
训练时提高那些被前一轮分类器错误分类的样本的权重,降低那些被正确分类的样本的权重。投票时误差小的分类器权重大。
而BDT可以说是特殊的Boosting,它有如下条件约束:
- 分类器使用的是决策树(回归问题时是CART回归树)
- 投票时的权重都是1
- 使用平方误差作为损失函数
对于Boosting来说,当前模型为
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),那么第m颗树的参数就是:
θ
m
^
=
∑
i
=
i
N
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
θ
m
)
)
\hat{\theta_m} = \sum_{i=i}^{N}L(y_i, f_{m-1}(x_i)+T(x_i;\theta_m))
θm^=i=i∑NL(yi,fm−1(xi)+T(xi;θm))
若损失函数采用平方差损失函数
L
(
y
,
f
m
−
1
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y,f_{m-1}(x)) = (y-f(x))^2
L(y,fm−1(x))=(y−f(x))2
那么
L
(
y
i
,
f
m
−
1
(
x
i
)
+
T
(
x
i
;
θ
m
)
)
=
[
y
−
f
m
−
1
(
x
)
−
T
(
x
;
θ
m
)
]
2
=
[
r
−
T
(
x
;
θ
m
)
]
2
L(y_i, f_{m-1}(x_i)+T(x_i;\theta_m)) =[y- f_{m-1}(x)-T(x;\theta_m)]^2 =[r-T(x;\theta_m)]^2
L(yi,fm−1(xi)+T(xi;θm))=[y−fm−1(x)−T(x;θm)]2=[r−T(x;θm)]2
其中
r
=
y
−
f
m
−
1
(
x
)
r=y- f_{m-1}(x)
r=y−fm−1(x)就表示当前模型拟合数据的残差。那么只需要拟合当前模型的残差即可。将问题转化成了当前模型与残差的拟合问题。
四,从BDT到GBDT
GBDT是在BDT的基础上进一步的优化的。
GBDT是使用损失函数的负梯度在当前模型的值作为残差的近似值来拟合一个回归树。
损失函数的负梯度在当前模型的值是:
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
(
1
)
-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1)
−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x) (1)
GBDT实际上是直接从假设(函数)空间中寻找出最优的函数来达到输入空间x到输出空间y的映射。
在BDT的情况是:从参数空间寻找到在假设空间中的函数,可以使函数尽可能准确的将x映射到y空间。
而参数空间的寻找,在使用反向传播算法是逐步的更新这个参数的:
w
^
=
w
−
α
∂
L
(
w
x
)
∂
w
\hat{w}=w-\alpha \frac{\partial L(wx)}{\partial w}
w^=w−α∂w∂L(wx)
那么之前的做法就是从参数空间中寻找最优参数,带入到假设空间中构建最优函数,来完成x到y的映射。
GBDT直接是从假设(函数)空间中寻找出最优的函数来达到输入空间x到输出空间y的映射。从假设空间中寻找最优函数与上面类似,也是反向传播的那种求法。
直接使用损失函数对函数的求导,学习率为1就得到了公式(1)了。更新的时候:
f
(
x
i
+
1
)
=
f
(
x
)
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
f(x_{i+1}) =f(x) -[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}
f(xi+1)=f(x)−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
这就使用损失函数梯度的负值来作为结果了。将参数空间的学习问题回归到假设空间中来。
问:没有了参数模型怎么表达?
回归问题的cart树,通过树可以将输入空间划分成M个区域
R
1
,
R
2
,
.
.
.
,
R
M
R_1,R_2,...,R_M
R1,R2,...,RM。
树的表达就是对整个输入空间的离散化,以及每一个区域上的输出值。就是对于输入的数据直接得到该数据被落到哪个区域之间得到的损失最小。因此不用参数表示函数也可以。
对于回归的gbdt来说,其损失函数是平方差损失函数:
L
(
y
i
,
f
(
x
i
)
)
=
1
2
(
y
i
−
f
(
x
i
)
)
2
L(y_i,f(x_i))=\frac{1}{2}(y_i-f(x_i))^2
L(yi,f(xi))=21(yi−f(xi))2
那么损失函数的负梯度就是:
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
=
y
i
−
f
(
x
i
)
-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}=y_i-f(x_i)
−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)=yi−f(xi)
可以看到回归问题的GBDT其损失函数的负梯度就是残差,对于下面的树只要拟合残差即可。
GBDT的算法:
(1)初始化弱分类器
f
0
(
x
)
=
a
r
g
m
i
n
c
∑
i
=
1
N
L
(
y
i
,
c
)
f_0(x)=\underset{c}{argmin}\sum_{i=1}^{N}L(y_i,c)
f0(x)=cargmini=1∑NL(yi,c)
(2)对m = 1 , 2 , . . . , M有:
(a)对每个样本i=1,2,…,N,计算负梯度,即残差
r
i
m
=
−
[
∂
L
(
y
,
f
(
x
i
)
)
∂
f
(
x
i
)
]
f
(
x
)
=
f
m
−
1
(
x
)
r_{im}=-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}
rim=−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
(b)将上步得到的残差作为样本新的真实值,并将数据
(
x
i
,
r
i
m
)
,
i
=
1
,
2
,
.
.
N
(x_i , r_{im}) , i = 1 , 2 , . . N
(xi,rim),i=1,2,..N作为下棵树的训练数据,得到一颗新的回归树
f
m
f_{m}
fm其对应的叶子节点区域为
R
j
m
,
j
=
1
,
2
,
.
.
.
,
J
R_{jm}, j =1,2,..., J
Rjm,j=1,2,...,J.其中J 为回归树t的叶子节点的个数。
(c)对叶子区域
j
=
1
,
2
,
.
.
J
j =1,2,..J
j=1,2,..J计算最佳拟合值
r
j
m
=
a
r
g
m
i
n
⏟
r
∑
x
i
ϵ
R
j
m
L
(
y
i
,
f
m
−
1
(
x
i
)
+
r
)
r_{jm}=\underbrace{argmin}_{\text{r}}\sum_{x_i\epsilon{R_{jm}}}L(y_i,f_{m-1}(x_i)+r)
rjm=r
argminxiϵRjm∑L(yi,fm−1(xi)+r)
(d)更新强学习器
f
m
(
x
)
=
f
m
−
1
(
x
)
+
∑
j
=
1
J
r
j
m
I
(
x
ϵ
R
j
m
)
f_m(x)=f_{m-1}(x)+\sum_{j=1}^{J}r_{jm}I(x\epsilon{R_{jm}})
fm(x)=fm−1(x)+j=1∑JrjmI(xϵRjm)
得到最终的学习器:
f
(
x
)
=
f
M
(
x
)
=
f
0
(
x
)
+
∑
m
=
1
M
∑
j
=
1
J
r
j
m
I
(
x
ϵ
R
j
m
)
f(x)=f_M(x)=f_{0}(x)+\sum_{m=1}^{M}\sum_{j=1}^{J}r_{jm}I(x\epsilon{R_{jm}})
f(x)=fM(x)=f0(x)+m=1∑Mj=1∑JrjmI(xϵRjm)
其实GBDT的那些函数表达跟函数的泰勒级数展开有点像,使用函数的一阶梯度来拟合函数。而xgboost就是使用了二阶梯度来拟合函数。
xgboost对GBDT的优化主要是两个方向:引入二阶项对残差进行拟合;加入正则项对优化目标进行改进来防止过拟合。
XGBoost是对于GBDT在工程是做了大量优化改进的一种算法
XGboost = eXtreme + GBDT = eXtreme + (Gradient + BDT) = eXtreme + Gradient + (Boosting + DecisionTree)