一般来说,Ensemble模型适合于过拟合的模型,包括bagging和boosting.
3.1 Bagging
其中Bagging是单独训练每个分类器,然后用平均或者投票的方法组合,boosting的方法则是分类器之前存在强依赖,前一个分类器预测的结果会影响后一个分类器。随机森林就是DT的bagging。
在相同的深度下,随机森林并不会比决策树好很多,但会让分类的结果更平滑
3.2 Boosting
boosting的目的是用迭代的方法提高弱分类器的性能(improving weak classifier)
boosting的架构如下:
首先获取到第一个分类器
f
1
(
x
)
f_1(x)
f1(x),然后用第二个分类器
f
2
(
x
)
f_2(x)
f2(x)去help
f
1
(
x
)
f_1(x)
f1(x),如果
f
2
(
x
)
f_2(x)
f2(x)与
f
1
(
x
)
f_1(x)
f1(x)很像,则可能对帮助的有限,我们更希望
f
2
(
x
)
f_2(x)
f2(x)是
f
1
(
x
)
f_1(x)
f1(x)的补充。bagging的时候不同分类器用的dataset是原有数据集放回采样得到的,而在boosting时,不同dataset用到的数据集则是原数据集然后乘一个weight
u
(
i
)
u^{(i)}
u(i),这样总的损失函数就是
L ( f ) = ∑ i = 1 m u ( i ) l ( f ( x ( i ) ) , y ^ ( i ) ) L(f) = \sum_{i=1}^{m} u^{(i)} l(f(x^{(i)}),\hat{y}^{(i)}) L(f)=i=1∑mu(i)l(f(x(i)),y^(i))
其中
l
(
f
(
x
(
i
)
)
,
y
^
(
i
)
)
l(f(x^{(i)}),\hat{y}^{(i)})
l(f(x(i)),y^(i))代表任意一种衡量预测值和真实值的损失函数。
adaboost的思路就是,假设有k个弱分类器
f
1
,
f
2
,
.
.
.
,
f
k
f_1,f_2,...,f_k
f1,f2,...,fk,先用一组带权重的数据集
{
x
(
i
)
,
y
^
(
i
)
,
u
1
(
i
)
}
\{x^{(i)},\hat{y}^{(i)},u^{(i)}_1\}
{x(i),y^(i),u1(i)}训练
f
1
f_1
f1,然后更改每组训练数据的权重得到
u
2
(
i
)
u^{(i)}_2
u2(i),这时新的带权重的数据集
{
x
(
i
)
,
y
^
(
i
)
,
u
2
(
i
)
}
\{x^{(i)},\hat{y}^{(i)},u^{(i)}_2\}
{x(i),y^(i),u2(i)}在
f
1
f_1
f1上的performance会变差,这时候训练
f
2
f_2
f2使得新的数据集在
f
2
f_2
f2上的performance变好。所谓表现差,就是正确率低,错误率高,用下边的式子来计算错误率:
ϵ 1 = ∑ i = 1 m u 1 ( i ) δ ( f 1 ( x ( i ) ) ≠ y ^ ( i ) ) Z 1 \epsilon_1 = \frac{ \sum_{i=1}^{m}u^{(i)}_1\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})}{Z_1} ϵ1=Z1∑i=1mu1(i)δ(f1(x(i))=y^(i))
其中
δ
(
f
1
(
x
(
i
)
)
≠
y
^
(
i
)
)
\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})
δ(f1(x(i))=y^(i))为符号函数,即两者不相等时取1,否则取0,
Z
1
Z_1
Z1则表示归一化权重:
Z
1
=
∑
i
=
1
m
u
1
(
i
)
Z_1 = \sum_{i=1}^{m}u^{(i)}_1
Z1=i=1∑mu1(i)
这是因为每次训练的数据集所用的权重加起来并不为1,因此需要归一化。这个式子看起来并不太好理解,为什么能表示错误率呢?我们举个简单的例子,假设权重为1,这时候
Z
1
=
m
Z_1=m
Z1=m,也就是
m
m
m个样本,上式的分母就是
m
m
m,假设分类器
f
1
f_1
f1让
t
t
t个样本分类错误,这时上边
ϵ
1
\epsilon_1
ϵ1表达式的分子就是
t
t
t,
t
m
\frac{t}{m}
mt当然就是错误率啦。另一个角度也可以从概率的角度理解,
u
1
(
i
)
Z
1
\frac{u^{(i)}_1}{Z_1}
Z1u1(i)可以表示对于每个样本预测错误的概率,然后加权平均就是第一个分类器的错误率啦(这种解释有点粗糙,仅帮助理解)。
注意,对于二分类,错误率
ϵ
1
<
0.5
\epsilon_1<0.5
ϵ1<0.5,多分类的话
ϵ
1
<
1
/
K
\epsilon_1<1/K
ϵ1<1/K,下边的公式也只介绍二类的情况。接下来把数据集从权重从
u
1
(
i
)
u^{(i)}_1
u1(i)变到
u
2
(
i
)
u^{(i)}_2
u2(i),使得
∑
i
=
1
m
u
2
(
i
)
δ
(
f
1
(
x
(
i
)
)
≠
y
^
(
i
)
)
Z
2
=
0.5
\frac{ \sum_{i=1}^{m}u^{(i)}_2\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})}{Z_2}=0.5
Z2∑i=1mu2(i)δ(f1(x(i))=y^(i))=0.5
这是因为,最烂的二分类器,随机猜也有50%的准确率,我们要使
f
1
f_1
f1的性能变差,就让
f
1
f_1
f1对
u
2
(
i
)
u^{(i)}_2
u2(i)权重的训练数据
{
x
(
i
)
,
y
^
(
i
)
,
u
2
(
i
)
}
\{x^{(i)},\hat{y}^{(i)},u^{(i)}_2\}
{x(i),y^(i),u2(i)}的错误率升到0.5即可。
那如何让
f
1
f_1
f1错误率提升呢,也就是让
f
1
f_1
f1分类效果变差呢?很简单的方法就是,让分类器
f
1
f_1
f1对于分类正确的那些数据,我们给它更少的权重,对于分类错误的数据则给更大的权重。一个形象的例子如下:
假设刚开始的权重都是1,其中第1,3,4组训练数据分类正确,那
f
1
f_1
f1的错误率就是0.25,然后呢,对于分类正确的数据,我们把训练集数据要乘的权重调低到
1
/
3
1/\sqrt3
1/3,把分类错误的第二组数据的权重调高到
3
\sqrt3
3这时候
f
1
f_1
f1的错误率就升高到0.5了。总结规律就是:
- 如果 f 1 f_1 f1能正确分类某个数据,也就是 f 1 ( x i ) ≠ y ^ ( i ) f_1(x^{i})\not =\hat{y}^{(i)} f1(xi)=y^(i),则把新训练数据的权重 u 2 ( i ) u^{(i)}_2 u2(i)减小为原来的权重除以 d 1 d_1 d1: u 2 ( i ) = u 1 ( i ) / d 1 u^{(i)}_2=u^{(i)}_1/d_1 u2(i)=u1(i)/d1
- 如果
f
1
f_1
f1错误分类某个数据,也就是
f
1
(
x
i
)
=
y
^
(
i
)
f_1(x^{i})=\hat{y}^{(i)}
f1(xi)=y^(i),则把新训练数据的权重
u
2
(
i
)
u^{(i)}_2
u2(i)增大为原来的权重乘
d
1
d_1
d1:
u
2
(
i
)
=
u
1
(
i
)
d
1
u^{(i)}_2=u^{(i)}_1 d_1
u2(i)=u1(i)d1
那 d 1 d_1 d1怎么求呢?
∑ i = 1 m u 2 ( i ) δ ( f 1 ( x ( i ) ) ≠ y ^ ( i ) ) Z 2 = 0.5 \frac{ \sum_{i=1}^{m}u^{(i)}_2\delta(f_1(x^{(i)})\not=\hat{y}^{(i)})}{Z_2}=0.5 Z2∑i=1mu2(i)δ(f1(x(i))=y^(i))=0.5
其实就是把上式中 u 2 ( i ) u^{(i)}_2 u2(i)分类错误的展开成 u 1 ( i ) d 1 u^{(i)}_1d_1 u1(i)d1,分类正确的展开乘 u 1 ( i ) / d 1 u^{(i)}_1/d_1 u1(i)/d1然后解方程即可,经过一系列化简可以得到:
∑ f 1 ( x ( i ) ) = y ^ ( i ) u 1 ( i ) / d 1 = ∑ f 1 ( x ( i ) ) ≠ y ^ ( i ) u 1 ( i ) d 1 \sum_{f_1(x^{(i)})=\hat{y}^{(i)}} u^{(i)}_1/d_1=\sum_{f_1(x^{(i)})\not=\hat{y}^{(i)}} u^{(i)}_1d_1 f1(x(i))=y^(i)∑u1(i)/d1=f1(x(i))=y^(i)∑u1(i)d1
也就是那些分类错误的数据的权重的和要等于分类正确的数据的权重的和,在经过推导得到
d
1
d_1
d1为:
d
1
=
1
−
ϵ
1
ϵ
1
>
1
d_1 = \sqrt{\frac{1-\epsilon_1}{\epsilon_1}}>1
d1=ϵ11−ϵ1>1
从上边可以看出,要更新数据的权重时,对于上一轮迭代分类错误的数据,我们要增加权重也就是乘一个数,对于上一轮迭代分类正确的数据,我们要减小权重也就是除一个数,有没有办法都用乘法表示呢?只需要把权重取对数即可,因为取对数后原来的函数仍然保持之前的单调性,除此之外,取完对数,之前的乘除运算就可以变成加减运算。上述
d
1
d_1
d1取对数后就变成:
a
1
=
log
d
1
=
log
(
1
−
ϵ
1
ϵ
1
)
=
1
2
log
1
−
ϵ
1
ϵ
1
a_1 = \log d_1 = \log (\sqrt{\frac{1-\epsilon_1}{\epsilon_1}})= \frac{1}{2}\log \frac{1-\epsilon_1}{\epsilon_1}
a1=logd1=log(ϵ11−ϵ1)=21logϵ11−ϵ1
这样更新的权重就都可以用乘法来表示
- 如果 f 1 f_1 f1能正确分类某个数据,权重 u 2 ( i ) u^{(i)}_2 u2(i)减小为 u 2 ( i ) = u 1 ( i ) e − a 1 u^{(i)}_2=u^{(i)}_1 e^{-a_1} u2(i)=u1(i)e−a1
- 如果
f
1
f_1
f1错误分类某个数据,权重
u
2
(
i
)
u^{(i)}_2
u2(i)增加为
u
2
(
i
)
=
u
1
(
i
)
e
a
1
u^{(i)}_2=u^{(i)}_1 e^{a_1}
u2(i)=u1(i)ea1
用一个式子表示 u 2 ( i ) u^{(i)}_2 u2(i)的更新就是
u 2 ( i ) = u 1 ( i ) × exp ( − y ^ ( i ) f 1 ( x ( i ) ) a 1 ) u^{(i)}_2 = u^{(i)}_1 \times \exp(-\hat{y}^{(i)}f_1(x^{(i)})a_1) u2(i)=u1(i)×exp(−y^(i)f1(x(i))a1)
当预测值和真实值相同时, − y ^ ( i ) f 1 ( x ( i ) ) = − 1 -\hat{y}^{(i)}f_1(x^{(i)})=-1 −y^(i)f1(x(i))=−1否则取1
综上,二分类的Adaboost算法就可以概况为:
输入:
{
(
x
(
1
)
,
y
^
(
1
)
,
u
1
(
1
)
)
,
(
x
(
2
)
,
y
^
(
2
)
,
u
1
(
2
)
)
,
.
.
.
,
(
x
(
m
)
,
y
^
(
m
)
,
u
1
(
m
)
)
}
\{(x^{(1)},\hat{y}^{(1)},u^{(1)}_1),(x^{(2)},\hat{y}^{(2)},u^{(2)}_1),...,(x^{(m)},\hat{y}^{(m)},u^{(m)}_1)\}
{(x(1),y^(1),u1(1)),(x(2),y^(2),u1(2)),...,(x(m),y^(m),u1(m))}
其中
y
(
i
)
=
±
1
y^{(i)}=\pm 1
y(i)=±1, 初始权重为
u
1
(
i
)
=
1
u^{(i)}_1=1
u1(i)=1
- 对于弱分类器
t
=
1
,
2
,
.
.
.
,
T
t=1,2,...,T
t=1,2,...,T
a. 用带权重 { u 1 ( 1 ) , u 1 ( 2 ) , . . . , u 1 ( m ) } \{u^{(1)}_1,u^{(2)}_1,...,u^{(m)}_1\} {u1(1),u1(2),...,u1(m)}的数据训练弱分类器t
b. 计算第t个弱分类器的分类错误率 ϵ t \epsilon_t ϵt(公式见上)
c. 用分类错误率计算权重要乘的数 a t a_t at
d. 用 u 2 ( i ) = u 1 ( i ) × exp ( − y ^ ( i ) f 1 ( x ( i ) ) a 1 ) u^{(i)}_2 = u^{(i)}_1 \times \exp(-\hat{y}^{(i)}f_1(x^{(i)})a_1) u2(i)=u1(i)×exp(−y^(i)f1(x(i))a1)更新数据集的权重 - 训练得到一系列的弱分类器
f
1
,
f
2
,
.
.
.
,
f
T
f_1,f_2,...,f_T
f1,f2,...,fT
最后的强分类器就为:
H ( x ) = s i g n ( ∑ t = 1 T a t f t ( x ) ) H(x) = sign(\sum_{t=1}^T a_t f_t(x)) H(x)=sign(t=1∑Tatft(x))
这里的 a t a_t at就是前边用错误率计算出的 a t a_t at
组合的策略从直观上解释就是错误率低的分类器权重更高,反之权重更低。
可以证明Adaboost每次迭代的权重和是收敛的!
至此adaboost讲完