集成学习是将多个基学习器(模型)相结合来完成学习任务。
随机森林:
随机森林是一种常见的集成学习方式。
前面我们学习了决策树,决策树生成后,我们可以利用同样的方法对训练集构建多棵决策树;
构建多棵决策树使用了数据样本随机和属性随机。
- 构建多棵决策树的过程中,对于构建一棵决策树我们可以规定每次随机取训练集的n%个数据,这样可以减少异常值点对构建随机森林造成的影响;
- 在选择属性(特征)时也随机选择多个构建一棵决策树。(样本随机性,特征(属性)随机性),即在当前节点选择一个属性子集来选择最优属性,通常一个属性子集选择
k
=
l
o
g
2
d
k=log_2d
k=log2d个属性,而不是将所有的属性计算熵来选择最优属性构造节点。
对于回归问题,测试集可以取这些决策树结果的均值,即平均法,分类问题,测试结果可以取其中分类概率最大的类别(分类结果最多,若相同,则可随机选择一个),即投票法。
Bagging
Bootstrping:有放回采样,即一个盒子里面有10个白球,每次取三个球后将球放回,下次取还是这十个球。
Bagging:有放回n个样本一起建立分类器
Bagging和随机森林都是并行式集成学习的代表,即各个基学习器之间的训练没有关系,可同时训练,Bagging使用的是自助采样法(即有放回的取部分样本进行基学习器的训练),假设取样得到T组样本,每组m个,我们可以单独使用每组样本进行学习器的训练,可以得到T个基学习器,然后将这些学习器进行组合就是Bagging的基本思想。
Bagging通常也可以采用简单平均法和投票法决定最终的结果。
基本过程如下:
其中
D
b
s
D_{bs}
Dbs是自助采样产生的样本分布,
Y
\mathcal Y
Y表示样本的真实标记集合。
H
(
x
)
=
a
r
g
m
a
x
y
∈
Y
∑
t
=
1
T
I
(
h
t
(
t
)
=
y
)
H(x)=arg\quad max_{y\in{\mathcal Y}}\sum_{t=1}^TI(h_t(t)=y)
H(x)=argmaxy∈Yt=1∑TI(ht(t)=y)即选择使得预测正确最高的结果。
Bagging还有一个特性,在自助采样的过程中,有可能有的样本被多次选取,但有些样本可能一次都未被选取,因此我们可以在采样过程中将样本进行标记,训练结束后,可以使用这些未被选取训练的样本做为验证集,来测试模型的好坏。
Bagging注重关注降低方差,它在不剪枝决策树、神经网络等容易受样本扰动的学习器上效果更明显。下面是基于Bagging的决策树的不同规模的集成和分类边界的结果。
Boosting
和前面随机森林和Bagging的并行式学习不一样,Boost是串行式的学习,即每一步的学习器由前一步的学习器迭代产生。
大致算法:先从训练集中训练出一个基学习器,根据基学习器的表现对样本的分布进行调整,增加识别错误的样本的权重,使这些样本更加被重视,经过样本分布的调整后来训练下一个基学习器,重复进行,达到事先预定的T轮后停止,然后将这T个学习器进行加权结合。
一次更新的结果如下:
u u u是每次更新的权重,在第一次时将每个样本的权重初始化,经过一次学习调高错误样本的权值,降低正确样本的权值,与一般学习器的损失函数相比它的损失函数只是加上了权值。 f ( x n ) f(x^n) f(xn)表示第n个样本的预测值, y ^ n \hat{y}^n y^n表示第n个样本的实际值。那么权重的变化应该遵循怎样的规律呢,常见的有Adaboost来更新权重。
Adaboost
(原始的Adaboost算法只适用于二分类问题。)
Adaboost常见的形式:
H
(
x
)
=
∑
t
=
1
T
α
t
h
t
(
x
)
H(\bm x)=\sum_{t=1}^T\alpha_th_t(\bm x)
H(x)=t=1∑Tαtht(x)
是基学习器的线性组合。
举例:
u
i
u^i
ui表示权重,
(
x
i
,
y
^
i
)
(x^i,\hat{y}^i)
(xi,y^i)表示样本。
y
^
i
\hat{y}^i
y^i表示实际标记。下标表示某次迭代(第几个基学习器)
更新权重:
- 如果第一次 x i x^i xi的样本分类错误,即 f ( x i ) ≠ y ^ i f(x^i) \quad \ne \hat{y}^i f(xi)̸=y^i,我们更新样本的权重 u 2 i = d 1 ∗ u 1 i u_2^i=d_1*u_1^i u2i=d1∗u1i;提升样本的权重,使得分类错误的样本更容易被重视。
- 如果分类正确,则 u 2 i = u 1 i / d 1 u_2^i=u_1^i/d_1 u2i=u1i/d1,即降低样本的权重。
-
d
1
=
(
1
−
ϵ
1
)
/
ϵ
1
>
1
d_1=\sqrt{(1-\epsilon_1)/\epsilon_1}>1
d1=(1−ϵ1)/ϵ1>1
调整权重的推导过程:
对于错误率 ϵ 1 \epsilon_1 ϵ1是第一个基学习器产生的结果,我们希望通过调整错误样本的权重使得此时的 ϵ = 0.5 \epsilon=0.5 ϵ=0.5(大于0.5时,学习器还不如随机过程,没有意义),使得错误样本在下一次的训练中得到重视,然后进行下一个学习器的训练,因此有下面的过程:
经过上面的代换可得到:
将分子分母颠倒:
所以: ∑ f 1 ( x n ) = y ^ n u 1 n / d 1 ∑ f 1 ( x n ) ≠ y ^ n u 1 n d 1 = 1 , 即 : ∑ f 1 ( x n ) = y n u 1 n / d 1 = ∑ f 1 ( x n ) ≠ y ^ n u 1 n d 1 \frac{\sum_{f_{1}\left(x^{n}\right)=\hat y^{n}} u_{1}^{n} / d_{1}}{\sum_{f_{1}\left(x^{n}\right) \neq \hat y^{n}} u_{1}^{n} d_{1}}=1,\quad即:\sum_{f_{1}\left(x^{n}\right)=y^{n}} u_{1}^{n} / d_{1}=\sum_{f_{1}\left(x^{n}\right) \neq \hat y^{n}} u_{1}^{n} d_{1} ∑f1(xn)̸=y^nu1nd1∑f1(xn)=y^nu1n/d1=1,即:f1(xn)=yn∑u1n/d1=f1(xn)̸=y^n∑u1nd1
即: 1 d 1 ∑ f 1 ( x n ) = y ^ n u 1 n = d 1 ∑ f 1 ( x n ) ≠ y n u 1 n \frac{1}{d_{1}} \sum_{f_{1}\left(x^{n}\right)=\hat{y}^{n}} u_{1}^{n}=d_{1} \sum_{f_{1}\left(x^{n}\right) \neq y^{n}} u_{1}^{n} d11f1(xn)=y^n∑u1n=d1f1(xn)̸=yn∑u1n
因为 ϵ 1 = ∑ f 1 ( x n ) ≠ y ^ n u n Z 1 \epsilon_1=\frac{\sum_{f_1(x^n)\neq\hat y^n}u^n}{Z_1} ϵ1=Z1∑f1(xn)̸=y^nun,所以上式可代换: Z 1 ( 1 − ϵ 1 ) / d 1 = Z 1 ϵ 1 d 1 Z_1(1-\epsilon_1)/d_1=Z_1\epsilon_1d_1 Z1(1−ϵ1)/d1=Z1ϵ1d1
所以: d 1 = ( 1 − ϵ 1 ) / ϵ 1 > 1 d_1=\sqrt{(1-\epsilon_1)/\epsilon_1}>1 d1=(1−ϵ1)/ϵ1>1
举例:
第一次迭代:
改变样本权重,进行第二次迭代:
重复上面的过程:
经过三轮后,将上面的三个学习器进行加权结合,产生分类结果:
其中:
Boosting主要注重降低偏差,因此Boosting能基于泛化性能相当弱(容易过拟合)的学习器构建强的集成。
在集成各个基学习器的过程中,一般而言,在个体学习器性能相差较大时宜使用加权平均法结合基学习器,在个体学习器性能相近时,使用简单平均法。