文章目录
1. 集成算法
集成学习本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务。
1.1 强可学习和弱可学习
在概率近似正确学习的框架中, 一个类,如果存在一个多项式的学习算法能够学习它,并且正确率很高, 那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。
在集成学习中会遇到最明显的两个问题,一是怎么得到多个弱学习器,而是怎么将多个弱学习器结合起来进行预测。
1.2 得到弱学习器
得到弱学习器有两种方式。
一是所有的弱学习器都是一个种类的,称之为同质弱学习器。比如都是决策树学习器,或者都是神经网络学习器。二是所有的个体学习器不全是一个种类的,称为异质弱学习器。比如训练集中训练的学习器有支持向量机、神经网络、逻辑回归等,然后通过一些方法来使其结合形成一个集成学习器。
目前来说,同质学习器的应用是最广泛的,一般我们常说的集成学习的方法都是指的同质个体学习器。而同质个体学习器使用最多的模型是CART决策树和神经网络。同质个体学习器按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,一系列个体学习器基本都需要串行生成,代表算法是boosting系列算法,第二个是个体学习器之间不存在强依赖关系,一系列个体学习器可以并行生成,代表算法是bagging和随机森林系列算法。下面就分别对这两类算法做一个概括总结。
1.3 结合多个弱学习器
对于回归问题来说,常用的是平均法,对每一个弱学习器都赋予一个权值
w
i
w_i
wi ,然后加权得到回归问题的最终预测结果
y
(
x
)
y(x)
y(x),即预测如下:
y
(
x
)
=
∑
i
=
1
N
w
i
h
i
(
x
)
y(x)= \sum^{N}_{i=1}w_ih_i(x)
y(x)=i=1∑Nwihi(x)而且有
∑
i
=
1
N
w
i
=
1
\sum^N_{i=1}w_i=1
i=1∑Nwi=1
对于分类问题来说,常用的是多数决法,即多个弱学习器分别进行预测,然后数量最多的预测类别为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。稍微复杂一点也可以进行加权。
2. AdaBoost 算法
2.1 Boosting 算法概述
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2,如此重复进行,直到弱学习器数达到事先指定的数目,最终将这些弱学习器通过集合策略进行整合,得到最终的强学习器。
随着Boosting算法中一些细节的不同,算法的名称也不同,这些细节中最容易注意到的是一下几个问题:
- 误差率的表现怎么衡量?
- 如何使误差率高的训练样本权重变高?
- 通过怎样的集合策略对弱学习器进行整合?
Boosting系列算法里最著名算法主要有AdaBoost算法和提升树系列算法。提升树系列算法里面应用最广泛的是梯度提升树。下面我们就来看看AdaBoost算法。
设我们训练的样本为 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x n , y n ) } T=\{ (x_1,y_1),(x_2,y_2), \cdots ,(x_n,y_n) \} T={(x1,y1),(x2,y2),⋯,(xn,yn)},学习器的输出加权权重为 D ( k ) = { w k 1 , w k 2 , ⋯ , w k n } D(k)=\{ w_{k1},w_{k2}, \cdots, w_{kn} \} D(k)={wk1,wk2,⋯,wkn},每一个学习器对应着 n n n 个权重,初始时设置每个学习器的权重都为 1 / w k i 1/w_{ki} 1/wki。
2.2 AdaBoost 分类细节
假设我们进行的分类问题时二分类,输出
y
∈
{
−
1
,
+
1
}
y \in \{-1,+1\}
y∈{−1,+1},则可以定义第
k
k
k 个弱分类器
G
(
k
)
G(k)
G(k) 在训练集上的误差率
e
k
e_k
ek 为
e
k
=
∑
i
=
0
n
w
k
i
I
(
G
(
x
i
)
≠
y
i
)
e_k=\sum_{i=0}^nw_{ki}I(G(x_i) \neq y_i)
ek=i=0∑nwkiI(G(xi)=yi)然后更新弱学习器的权重系数
α
k
\alpha_k
αk,表示如下:
α
k
=
1
2
l
o
g
1
−
e
k
e
k
\alpha_k= \frac{1}{2}log \frac{1-e_k}{e_k}
αk=21logek1−ek这就实现了分类误差率越大,在本分类器中的权重就越小。
设此时的各样本集的权重是
D
(
k
)
=
{
w
k
1
,
w
2
,
⋯
,
w
k
n
}
D(k)=\{ w_{k1},w_{2}, \cdots, w_{kn} \}
D(k)={wk1,w2,⋯,wkn} ,则对应的第
k
+
1
k+1
k+1 个弱分类器的样本集权重系数为
w
k
+
1
,
i
=
w
k
i
Z
k
e
x
p
(
−
α
k
y
i
G
k
(
x
i
)
)
w_{k+1,i}= \frac{w_{ki}}{Z_k}exp(-\alpha_ky_iG_k(x_i))
wk+1,i=Zkwkiexp(−αkyiGk(xi))其中
Z
k
Z_k
Zk 为
Z
k
=
∑
i
=
1
m
w
k
i
e
x
p
(
−
α
k
y
i
G
k
(
x
i
)
)
Z_k=\sum^m_{i=1}w_{ki} exp(-\alpha_ky_iG_k(x_i))
Zk=i=1∑mwkiexp(−αkyiGk(xi))这保证了各分类器的系数之和为1。
从
w
k
+
1
,
i
w_{k+1,i}
wk+1,i 计算公式可以看出,如果第
i
i
i 个样本分类错误,则
y
i
G
k
(
x
i
)
<
0
y_iG_k(xi)<0
yiGk(xi)<0,导致样本的权重在第
k
+
1
k+1
k+1 个弱分类器中增大,如果分类正确,则权重在第
k
+
1
k+1
k+1 个弱分类器中减少.
AdaBoost 采用多数表决法,最终的强分类器为
f
(
x
)
=
s
i
g
n
(
∑
k
=
1
K
α
k
G
k
(
x
)
)
f(x)=sign(\sum_{k=1}^K \alpha_k G_k(x))
f(x)=sign(k=1∑KαkGk(x))
2.3 AdaBoost 回归细节
由于Adaboost的回归问题有很多变种,我们以Adaboost R2算法为准。
对于第
k
k
k 个弱学习器的误差率,我们计算其最大误差:
E
k
=
m
a
x
∣
y
i
−
G
k
(
x
i
)
∣
E_k=max \vert y_i - G_k(x_i) \vert
Ek=max∣yi−Gk(xi)∣然后计算该弱学习器在每个样本的相对误差:
e
k
i
=
∣
y
i
−
G
k
(
x
i
)
∣
E
k
e_{ki}= \frac{ \vert y_i - G_k(x_i) \vert}{E_k}
eki=Ek∣yi−Gk(xi)∣这里是误差损失为线性时的情况,如果我们用平方误差,则
e
k
i
=
(
y
i
−
G
k
(
x
i
)
)
2
E
k
2
e_{ki}=\frac{(y_i−G_k(x_i))^2}{E_k^2}
eki=Ek2(yi−Gk(xi))2。
得到第
k
k
k 个弱学习器的误差率为:
e
k
=
∑
i
=
1
n
w
k
i
e
k
i
e_k=\sum_{i=1}^nw_{ki}e_{ki}
ek=i=1∑nwkieki对于更新弱学习器的权重系数
α
\alpha
α ,有:
α
k
=
e
k
1
−
e
k
\alpha_k = \frac{e_k}{1-e_k}
αk=1−ekek所以,对于更新更新样本权重
D
D
D,第
k
+
1
k+1
k+1 个弱学习器的样本集权重系数为:
w
k
+
1
,
i
=
w
k
i
Z
k
α
k
1
−
e
k
i
w_{k+1,i}= \frac{w_{ki}}{Z_k} \alpha_{k}^{1-e_{ki}}
wk+1,i=Zkwkiαk1−eki这里
Z
k
Z_k
Zk 是规范因子,
Z
k
=
∑
i
=
1
n
w
k
i
α
k
1
−
e
k
i
Z_k= \sum_{i=1}^n w_{ki} \alpha_{k}^{1-e_{ki}}
Zk=i=1∑nwkiαk1−eki最后是结合策略,和分类问题稍有不同,采用的是对加权的弱学习器取权重中位数对应的弱学习器作为强学习器的方法,最终的强回归器为
f
(
x
)
=
G
k
∗
(
x
)
f(x)=G_k*(x)
f(x)=Gk∗(x)其中,
G
k
∗
(
x
)
G_k*(x)
Gk∗(x) 是所有
−
l
n
α
k
-ln{\alpha_k}
−lnαk 的中位数值对应序号
k
∗
k∗
k∗ 对应的弱学习器。
2.4 Adaboost 二分类算法流程
这里我们对AdaBoost二元分类问题算法流程做一个总结。
输入为样本集
T
=
{
(
x
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
m
,
y
m
)
}
,
y
i
∈
{
−
1
,
+
1
}
T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\},y_i \in \{-1, +1\}
T={(x,y1),(x2,y2),...(xm,ym)},yi∈{−1,+1},弱分类器算法, 弱分类器迭代次数
K
K
K 。
输出为最终的强分类器
f
(
x
)
f(x)
f(x)。
(1) 初始化样本集权重为
D
(
1
)
=
(
w
11
,
w
12
,
.
.
.
w
1
m
)
;
w
1
i
=
1
m
;
i
=
1
,
2...
m
D(1) = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m
D(1)=(w11,w12,...w1m);w1i=m1;i=1,2...m
(2) 对于
k
=
1
,
2
,
⋯
,
K
k=1,2, \cdots,K
k=1,2,⋯,K:
(a) 使用具有权重
D
k
D_k
Dk 的样本集来训练数据,得到弱分类器
G
k
(
x
)
G_k(x)
Gk(x)
(b) 计算
G
k
(
x
)
G_k(x)
Gk(x) 的分类误差率
e
k
=
P
(
G
k
(
x
i
)
≠
y
i
)
=
∑
i
=
1
m
w
k
i
I
(
G
k
(
x
i
)
≠
y
i
)
e_k = P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i)
ek=P(Gk(xi)=yi)=i=1∑mwkiI(Gk(xi)=yi) (c) 计算弱分类器的系数
α
k
=
1
2
l
o
g
1
−
e
k
e
k
\alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k}
αk=21logek1−ek (d) 更新样本集的权重分布
w
k
+
1
,
i
=
w
k
i
Z
K
e
x
p
(
−
α
k
y
i
G
k
(
x
i
)
)
i
=
1
,
2
,
.
.
.
m
w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i)) \;\; i =1,2,...m
wk+1,i=ZKwkiexp(−αkyiGk(xi))i=1,2,...m
Z
k
=
∑
i
=
1
m
w
k
i
e
x
p
(
−
α
k
y
i
G
k
(
x
i
)
)
Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i))
Zk=i=1∑mwkiexp(−αkyiGk(xi))(3) 构建最终分类器为:
f
(
x
)
=
s
i
g
n
(
∑
k
=
1
K
α
k
G
k
(
x
)
)
f(x) = sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x))
f(x)=sign(k=1∑KαkGk(x))
对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数
α
k
=
1
2
l
o
g
1
−
e
k
e
k
+
l
o
g
(
R
−
1
)
\alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} + log(R-1)
αk=21logek1−ek+log(R−1)其中
R
R
R 为类别数。从上式可以看出,如果是二元分类,
R
=
2
R=2
R=2,则上式和我们的二元分类算法中的弱分类器的系数一致。
2.5 Adaboost 回归算法流程
输入为样本集
T
=
{
(
x
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
(
x
m
,
y
m
)
}
,
y
i
∈
{
−
1
,
+
1
}
T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\},y_i \in \{-1, +1\}
T={(x,y1),(x2,y2),...(xm,ym)},yi∈{−1,+1},弱分类器算法, 弱分类器迭代次数
K
K
K 。
输出为最终的强分类器
f
(
x
)
f(x)
f(x)。
(1) 初始化样本集权重为
D
(
1
)
=
(
w
11
,
w
12
,
.
.
.
w
1
m
)
;
w
1
i
=
1
m
;
i
=
1
,
2...
m
D(1) = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m
D(1)=(w11,w12,...w1m);w1i=m1;i=1,2...m
(2) 对于
k
=
1
,
2
,
⋯
,
K
k=1,2, \cdots,K
k=1,2,⋯,K:
(a) 使用具有权重
D
k
D_k
Dk 的样本集来训练数据,得到弱学习器
G
k
(
x
)
G_k(x)
Gk(x)
(b) 计算训练集上的最大误差
E
k
=
m
a
x
∣
y
i
−
G
k
(
x
i
)
∣
i
=
1
,
2...
m
E_k= max|y_i - G_k(x_i)|\;i=1,2...m
Ek=max∣yi−Gk(xi)∣i=1,2...m (c) 计算每个样本的相对误差:
如果是线性误差,则
e
k
i
=
∣
y
i
−
G
k
(
x
i
)
∣
E
k
e_{ki}= \frac{|y_i - G_k(x_i)|}{E_k}
eki=Ek∣yi−Gk(xi)∣ 如果是平方误差,则
e
k
i
=
(
y
i
−
G
k
(
x
i
)
)
2
E
k
2
e_{ki}= \frac{(y_i - G_k(x_i))^2}{E_k^2}
eki=Ek2(yi−Gk(xi))2 如果是指数误差,则
e
k
i
=
1
−
e
x
p
(
−
∣
y
i
−
G
k
(
x
i
)
∣
E
k
)
e_{ki}= 1 - exp(\frac{-|y_i -G_k(x_i)|}{E_k})
eki=1−exp(Ek−∣yi−Gk(xi)∣) (d) 计算回归误差率
e
k
=
∑
i
=
1
m
w
k
i
e
k
i
e_k = \sum\limits_{i=1}^{m}w_{ki}e_{ki}
ek=i=1∑mwkieki (e) 计算弱学习器的系数
α
k
=
e
k
1
−
e
k
\alpha_k =\frac{e_k}{1-e_k}
αk=1−ekek (f) 更新样本集的权重分布为
w
k
+
1
,
i
=
w
k
i
Z
k
α
k
1
−
e
k
i
w_{k+1,i} = \frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}}
wk+1,i=Zkwkiαk1−eki
Z
k
=
∑
i
=
1
m
w
k
i
α
k
1
−
e
k
i
Z_k = \sum\limits_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}}
Zk=i=1∑mwkiαk1−eki(3) 构建最终分类器为:
f
(
x
)
=
G
k
∗
(
x
)
f(x) =G_{k^*}(x)
f(x)=Gk∗(x)其中,
G
k
∗
(
x
)
G_k*(x)
Gk∗(x) 是所有
−
l
n
α
k
-ln{\alpha_k}
−lnαk 的中位数值对应序号
k
∗
k∗
k∗ 对应的弱学习器。
2.6 AdaBoost 正则化
为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长。定义为
ν
\nu
ν ,对于前面的弱学习器的迭代
f
k
(
x
)
=
f
k
−
1
(
x
)
+
α
k
G
k
(
x
)
f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x)
fk(x)=fk−1(x)+αkGk(x)如果我们加上了正则化项,则有
f
k
(
x
)
=
f
k
−
1
(
x
)
+
ν
α
k
G
k
(
x
)
f_{k}(x) = f_{k-1}(x) + \nu\alpha_kG_k(x)
fk(x)=fk−1(x)+ναkGk(x)
ν
\nu
ν的取值范围为
0
<
ν
≤
1
0 < \nu \leq 1
0<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
2.7 AdaBoost 例子
参考文章:
[1]: https://www.cnblogs.com/pinard/p/6133937.html
[2]: https://www.cnblogs.com/pinard/p/6131423.html