看上图,首先对集成学习有一个宏观的认识。
三种基本的集成方法:Bagging、Boosting和Stacking。分别产生了Random Forest(随机森林),AdaBoost和GBDT。
1. 集成学习(Ensemble Learning)
集成学习是指将多个基学习器(弱学习器)结合来完成学习任务。通过模型集成,一般会获得比单个基学习器更好的效果。集成学习的原则是 “好而不同”。根据个体学习器的生成方式,可以分为两类。
- 个体学习器间存在强依赖关系,串行生成的序列化方法,Boosting;
- 个体学习器间不存在强依赖关系,并行生成的方式,Bagging;
1.1 Boosting
工作机制:
- 数据集D,首先训练一个弱分类器(学习算法),然后对着同一个数据集进行迭代;
- 队训练样本进行调整,第一次预测错误的样本,我们增加它的权重,然后降低预测正确样本的权重;
- 对这个调整过后的数据集,重新训练分类器;
- 将每个基学习器加权求和
Boosting算法是一种加法模型。
AdaBoost
AdaBoost是Adaptive Boosting的缩写,针对同一个训练集训练不同的学习模型,然后将不同的这n个模型,带权相加。AdaBoost是Boosting的经典算法, 主要给出了每一个权重更新的迭代公示。
AdaBoost Vs GBDT:
相同: 都是Boosting算法,均是迭代求解,都是前向分步算法;
不同: GBDT限定CART树,AdaBoost可使用决策树,NN等基分类器,迭代思路不同
- GBDT:已知前一轮的弱学习器 f t − 1 ( x ) f_{t-1}(x) ft−1(x),损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x))。找到一个弱学习器 h t ( x ) h_t(x) ht(x)使得损失函数最小。 L ( y , f t ( x ) ) = L ( y , f t − 1 ( x ) + h t ( X ) L(y, f_t(x)) = L(y, f_{t-1}(x) + h_t(X) L(y,ft(x))=L(y,ft−1(x)+ht(X)
- AdaBoost:训练前一轮的学习器后,根据错误率,修改数据分布权值,扩大分错数据的权重,重新训练学习器。
1.2 Bagging
Bagging与Boosting有着明显的不同,主要体现在样本的选取,和基学习器的训练与相加上。
考虑数据集 D D D, D D D具有 m m m个样本,我们对数据进行有放回的随机采样(自助采样法),得到具有m个样本的数据集,重复同样的工作T次,便可以得到T个m样本数的数据集。然后对每个训练样本集训练,得到不同的基学习器,对基学习器平均,即得到总的模型。
算法流程图如下:
Bootsing VS Bagging:
算法 | Boosting | Bagging |
---|---|---|
采样方法 | 对同一个数据集迭代,不断增加训练错误样本的权重 | m次有放回采样得到具有m个样本采样集 |
代表算法 | AdaBoost、GBDT | Random Forest |
样本权重 | 不同 | 相同 |
基学习器权重 | 不同 | 相同 |
作用 | 降低偏差 | 降低方差 |
并行 | 不支持 | 支持 |
过拟合 | 容易过拟合 | 不容易过拟合 |
2. GBDT(Gradient Boosting Decision Tree)
这里介绍的GBDT特指,“Greedy Function Approximation:A Gradient Boosting Machine”中提出的算法,使用了一阶展开,也就是梯度下降进行优化。通产情况下,GBDT(Gradient Boosting Decision Tree)泛指所有的梯度提升树算法,也就包括XGBoost和LightGBM。
2.1 提升树(Boosting Tree)
讲解GBDT之前首先明白什么是提升树。
什么是提升树:
提升树是一个以决策树为基模型的Boosting方法,是一个加法模型。
加法模型:
f
M
(
x
)
=
∑
m
=
1
M
T
(
x
,
θ
m
)
f_M(x) = \sum_{m=1}^MT(x, \theta_m)
fM(x)=m=1∑MT(x,θm)
T
(
x
,
θ
m
)
:
T(x, \theta_m):
T(x,θm):第m颗决策树;
θ
m
:
\theta_m:
θm:决策树参数;
M
:
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);
输出:提升树, f M ( x ) f_M(x) fM(x)
- 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0;
- 对
m
=
1
,
2
,
3...
M
m = 1,2,3...M
m=1,2,3...M
(1) 计算残差: r m i = y i − f m − 1 ( x i ) r_{mi} = y_i -f_{m-1}(x_i) rmi=yi−fm−1(xi);
(2) 拟合残差 r m i r_{mi} rmi学习一个回归树,得到 T ( x ; θ m ) T(x; \theta_m) T(x;θm);
(3) 更新 f m ( x ) = f m − 1 ( x ) + T ( x ; θ m ) f_m(x) = f_{m-1}(x) + T(x; \theta_m) fm(x)=fm−1(x)+T(x;θm) - 回归问题提升树: f M ( x ) = ∑ m = 1 M T ( x , θ m ) f_M(x) = \sum_{m=1}^MT(x, \theta_m) fM(x)=∑m=1MT(x,θm)
为什么要拟合残差:
首先提升树是一个加法模型,
f
m
(
x
)
=
f
m
−
1
(
x
)
+
T
(
x
;
θ
m
)
f_m(x) = f_{m-1}(x) + T(x; \theta_m)
fm(x)=fm−1(x)+T(x;θm)。
前向分步算法中第m步,给定
f
m
−
1
(
x
)
f_{m-1}(x)
fm−1(x),求解参数即求Loss最小化:
θ
=
a
r
g
m
i
n
(
∑
L
(
y
i
,
f
m
(
x
)
)
)
=
a
r
g
m
i
n
(
∑
L
(
y
i
,
f
m
−
1
(
x
)
+
T
(
x
;
θ
m
)
)
)
\theta = argmin(\sum L(y_i, f_m(x))) = argmin(\sum L(y_i, f_{m-1}(x) + T(x; \theta_m)))
θ=argmin(∑L(yi,fm(x)))=argmin(∑L(yi,fm−1(x)+T(x;θm)))
平方误差损失函数:
L
(
y
,
f
(
x
)
)
=
(
y
−
f
(
x
)
)
2
L(y, f(x)) = (y-f(x))^2
L(y,f(x))=(y−f(x))2
代入上式:
L
(
y
i
,
f
m
−
1
(
x
)
+
T
(
x
;
θ
m
)
)
=
(
y
−
f
m
−
1
(
x
)
−
T
(
x
;
θ
m
)
)
2
L(y_i, f_{m-1}(x) + T(x; \theta_m)) = (y - f_{m-1}(x) - T(x;\theta_m))^2
L(yi,fm−1(x)+T(x;θm))=(y−fm−1(x)−T(x;θm))2
r
m
i
=
y
i
−
f
m
−
1
(
x
i
)
r_{mi} = y_i -f_{m-1}(x_i)
rmi=yi−fm−1(xi)即为我们要拟合的。
回归问题下,损失函数是MSE,优化简单,但是对于复杂的损失函数,优化并不是那么容易。因此Freidman提出梯度提升的算法,使用负梯度来作为残差的近似值,拟合回归树,进而引出我们的GBDT。
2.GBDT算法原理:
2.1 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),最大迭代次数T, 损失函数L
输出:提升树, f M ( x ) f_M(x) fM(x)
- 初始化: f 0 ( x ) = a r g m i n ( ∑ L ( y i , c ) ) f_0(x) = argmin(\sum L(y_i, c)) f0(x)=argmin(∑L(yi,c));
- 对
t
=
1
,
2
,
3...
m
t = 1,2,3...m
t=1,2,3...m
(1) 计算负梯度:
r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{ti} = -[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)} rti=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)
(2) 利用 ( x i , r t i ) , ( t = 1 , 2 , 3.. m ) (x_i, r_{ti}), (t=1,2,3..m) (xi,rti),(t=1,2,3..m) , 拟合一颗CART回归树,得到第t颗回归树,其对应的叶子节点区域为 R t j , j = 1 , 2... J R_{tj}, j=1,2...J Rtj,j=1,2...J。其中J为回归树t的叶子节点的个数
(3) 对每一个叶子区域计算最佳拟合值: c t j = arg min ⏟ c ∑ x i ∈ R t j L ( y i , f t − 1 ( x i ) + c ) c_{t j}=\underbrace{\arg \min }_{c} \sum_{x_{i} \in R_{t j}} L\left(y_{i}, f_{t-1}\left(x_{i}\right)+c\right) ctj=c argmin∑xi∈RtjL(yi,ft−1(xi)+c)
(4) 更新强学习器: f t ( x ) = f t − 1 ( x ) + ∑ j = 1 J c t j I ( x ∈ R t j ) f_{t}(x)=f_{t-1}(x)+\sum_{j=1}^{J} c_{t j} I\left(x \in R_{t j}\right) ft(x)=ft−1(x)+∑j=1JctjI(x∈Rtj) - 得到强学习器
f
(
x
)
:
f(x):
f(x):
f ( x ) = f T ( x ) = f 0 ( x ) + ∑ t = 1 T ∑ j = 1 J c t j I ( x ∈ R t j ) f(x)=f_{T}(x)=f_{0}(x)+\sum_{t=1}^{T} \sum_{j=1}^{J} c_{t j} I\left(x \in R_{t j}\right) f(x)=fT(x)=f0(x)+t=1∑Tj=1∑JctjI(x∈Rtj)
2.2 GBDT二分类问题:
二分类问题和回归问题大部分是相同的,只是损失函数不同。使用Logloss作为损失函数:
损失函数:
L
(
y
i
,
F
m
(
x
i
)
)
=
−
y
i
l
o
g
p
i
+
(
1
−
y
i
)
l
o
g
(
1
−
p
i
)
L(y_i,F_m(x_i))=−{y_ilogp_i+(1−y_i)log(1−p_i)}
L(yi,Fm(xi))=−yilogpi+(1−yi)log(1−pi)
概率:
p
i
=
1
1
+
e
(
−
F
m
(
x
i
)
)
p_i=\frac{1}{1+e(−F_m(x_i))}
pi=1+e(−Fm(xi))1
代入化简:
L
(
y
i
,
F
m
(
x
i
)
)
=
−
y
i
l
o
g
p
i
+
(
1
−
y
i
)
l
o
g
(
1
−
p
i
)
=
−
y
i
F
m
(
x
i
)
−
l
o
g
(
1
+
e
F
m
(
x
i
)
)
L(y_i,F_m(x_i))=−{y_ilogp_i+(1−y_i)log(1−p_i)}=−{y_iF_m(x_i)−log(1+e^{F_m(x_i)})}
L(yi,Fm(xi))=−yilogpi+(1−yi)log(1−pi)=−yiFm(xi)−log(1+eFm(xi))
参考资料:
[1] GBDT算法原理以及实例理解
[2] GBDT(MART) 迭代决策树入门教程 | 简介
[3] Boosting Decision Tree入门教程
[4] 决策树系列(五)——CART
[5] 梯度提升树GBDT原理
[6] 数据挖掘十大算法之CART详解
[7] 梯度提升树(GBDT)原理小结
[8] 集成学习之Adaboost算法原理小结
[9] GBDT原理与Sklearn源码分析-分类篇
[10] GBDT原理与Sklearn源码分析-回归篇
[11] GBDT原理与实践-多分类篇