Framework of Ensemble
简单来说,Ensemble就是组合多种不同的模型进行学习的方式。
Bagging
简单的model:大的Bias,小的Variance
复杂的model:小的Bias,大的Variance
组合的情况下,Error rate随着model的复杂度下降然后又升高。
有多个复杂的model进行平均,就能达到小的bias和小的variance。bagging要做的就是这个事情。
步骤:
对原来训练数据进行放回采用,比如上面采样4次,有可能一笔数据在多个子集合用到。
regression用average
classifier用voting
注意:只有再模型很复杂,很容易overfitting时候,为了减轻variance,才选用bagging方法。一般NN不是很容易overfitting的方法,而decision tree是个很容易overfitting的方法
Decision Tree
Decision Tree做bagging的版本就是随机森林(random forest)
Decision Tree可以在training data上达到100%准确度是很容易的,就是没笔data都作为树的叶子。但是,这也就是明显的overfitting,不见得在validation上有很好的performance。
Experiment: Function of Miku
对这样的数据进行分类实验。
深度为5可以想象Decision Tree的每个节点范围都是比较大的,比如level1:
100
<
x
<
200
100<x<200
100<x<200 level2:
300
<
y
<
400
300<y<400
300<y<400 是1
。所以分的不是很精确,然后随着深度提升,精度越来越高。
Random Forest
实现Random Forest可以用传统sample的方法,但是performance是和没用差不多的。
一般Random Forest是随机限制那些分支或者问题。
如果使用bagging,是不用把labeled data分成training data和validation data的。但是有 一样的validation,具体做:
分成4个子集个,比如训练f1的时候只用了第3,4笔数据。
Random Forest结果:
可以看到更加平滑。
Boosting
Bagging使用在很复杂的model上,而Boosting是用在比较简单的model上
Guarantee
Framework of boosting
需要注意的是:The classifiers are learned sequentially,先找f1后才知道怎么找f2.
How to obtain different classifiers?
当有不同的训练数据时,就获得了不同的classifier
问题变成怎么找不同的训练数据:
- Re-sampling :和Bagging一样使用放回采样得到新的训练集
- Re-weighting:对数据加上不同的weight得到的训练集,在Re-sampling中如果一笔data用了2次,那么weight就是2,Re-weighting可以用小数罢了
事实上,Re-weighting只是改变不同数据对loss的侧重。
Adaboost
找会在f1上烂掉的新的训练数据(reweight training example),作为f1的训练数据
问题变成怎么找会在f1上烂掉的新的训练数据:
先来看一下在f1上的错误率
ε
1
\varepsilon_{1}
ε1怎么算:
ε
1
=
∑
n
u
1
n
δ
(
f
1
(
x
n
)
≠
y
^
n
)
∑
n
u
1
n
\varepsilon_{1}=\frac{\sum_{n} u_{1}^{n} \delta\left(f_{1}\left(x^{n}\right) \neq \hat{y}^{n}\right)}{\sum_{n} u_{1}^{n}}
ε1=∑nu1n∑nu1nδ(f1(xn)=y^n)
一笔来说,初始的f1,除非是随机,再差也会小于0.5,即
ε
1
<
0.5
\varepsilon_{1}<0.5
ε1<0.5。
u
1
n
u_{1}^{n}
u1n变成
u
2
n
u_{2}^{n}
u2n,还是在这些数据上,用了
u
2
n
u_{2}^{n}
u2n后,使得:
∑
n
u
2
n
δ
(
f
1
(
x
n
)
≠
y
^
n
)
∑
n
u
2
n
=
0.5
\frac{\sum_{n} u_{2}^{n} \delta\left(f_{1}\left(x^{n}\right) \neq \hat{y}^{n}\right)}{\sum_{n} u_{2}^{n}}=0.5
∑nu2n∑nu2nδ(f1(xn)=y^n)=0.5
然后用
u
2
n
u_{2}^{n}
u2n作为weight的数据,去训练f2。那么f2就是和f1互补的。
下面是这么找
u
2
n
u_{2}^{n}
u2n步骤:
比如上面的f1,错误率是0.25
u
2
n
u_{2}^{n}
u2n要做的就是分类正确的examp对应的u变小,分类错误的examp对应的u变大。这样错误率就变为0.5了。然后就得到
u
2
n
u_{2}^{n}
u2n了,然后用
u
2
n
u_{2}^{n}
u2n作为weight的数据训练f2,错误率又会小于0.5。并且f2和f1是互补的。
怎么求
d
1
d_{1}
d1呢?
最后分子分母倒了一下,本来是 = 0.5的。
嘿嘿,最后就推导了
d
1
=
(
1
−
ε
1
)
/
ε
1
>
1
d_{1}=\sqrt{\left(1-\varepsilon_{1}\right) / \varepsilon_{1}}>1
d1=(1−ε1)/ε1
>1,比如上面的
ε
1
=
0.25
\varepsilon_{1} = 0.25
ε1=0.25,带进去求得的的
d
1
=
(
1
−
0.25
)
/
0.25
=
3
d_{1}=\sqrt{\left(1-0.25\right) / 0.25} = \sqrt{3}
d1=(1−0.25)/0.25
=3
。
AdaBoost算法:
-
给定训练数据
{ ( x 1 , y ^ 1 , u 1 1 ) , ⋯ , ( x n , y ^ n , u 1 n ) , ⋯ , ( x N , y ^ N , u 1 N ) } y ^ = ± 1 (Binary classification), u 1 n = 1 (equal weights) \left\{\left(x^{1}, \hat{y}^{1}, u_{1}^{1}\right), \cdots,\left(x^{n}, \hat{y}^{n}, u_{1}^{n}\right), \cdots,\left(x^{N}, \hat{y}^{N}, u_{1}^{N}\right)\right\} \\ \hat{y}=\pm 1 \text { (Binary classification), } u_{1}^{n}=1 \text { (equal weights) } {(x1,y^1,u11),⋯,(xn,y^n,u1n),⋯,(xN,y^N,u1N)}y^=±1 (Binary classification), u1n=1 (equal weights) -
迭代 t = 1 , … , T \mathrm{t}=1, \ldots, \mathrm{T} t=1,…,T:
- 使用 { u t 1 , ⋯ , u t N } \left\{u_{t}^{1}, \cdots, u_{t}^{N}\right\} {ut1,⋯,utN}作为weight的数据来训练比较弱的的 f t ( x ) f_t(x) ft(x)分类器
- 计算训练得到的错误率 ε t \varepsilon_{t} εt
- 迭代
n
=
1
,
…
,
N
n=1, \ldots, N
n=1,…,N
- 如果 x n x^{n} xn被 f t ( x ) f_t(x) ft(x)分类器分错:
- u t + 1 n = u t n × d t = u t n × exp ( α t ) u_{t+1}^{n}=u_{t}^{n} \times d_{t}=u_{t}^{n} \times \exp \left(\alpha_{t}\right) ut+1n=utn×dt=utn×exp(αt)
- 否则:
- u t + 1 n = u t n / d t = u t n × exp ( − α t ) u_{t+1}^{n}=u_{t}^{n} / d_{t}=u_{t}^{n} \times \exp \left(-\alpha_{t}\right) ut+1n=utn/dt=utn×exp(−αt)
- 也可写成一步: u t + 1 n ← u t n × exp ( − y ^ n f t ( x n ) α t ) u_{t+1}^{n} \leftarrow u_{t}^{n} \times \exp \left(-\hat{y}^{n} f_{t}\left(x^{n}\right) \alpha_{t}\right) ut+1n←utn×exp(−y^nft(xn)αt)
其中, d t = ( 1 − ε t ) / ε t d_{t}=\sqrt{\left(1-\varepsilon_{t}\right) / \varepsilon_{t}} dt=(1−εt)/εt , α t = ln ( 1 − ε t ) / ε t \alpha_{t}=\ln \sqrt{\left(1-\varepsilon_{t}\right) / \varepsilon_{t}} αt=ln(1−εt)/εt
得到了
f
1
(
x
)
,
…
,
f
t
(
x
)
.
.
,
f
T
(
x
)
f_{1}(x), \ldots, f_{t}(x). ., f_{T}(x)
f1(x),…,ft(x)..,fT(x),怎么叠加起来,得到测试的输出结果?
使用不一样的权重,表示错误率的分类器
α
t
\alpha_{t}
αt会更大。
Toy Example
对于右下角:f1和f2都认为蓝色,权重之和为1.08,f3认为是红色,权重为0.95.所以最终右下角是蓝色。类似的其他块。3个weak的classifier组合起来就可以得到好的结果。
Warning of Math
H
(
x
)
=
sign
(
∑
t
=
1
T
α
t
f
t
(
x
)
)
α
t
=
ln
(
1
−
ε
t
)
/
ε
t
H(x)=\operatorname{sign}\left(\sum_{t=1}^{T} \alpha_{t} f_{t}(x)\right) \quad \alpha_{t}=\ln \sqrt{\left(1-\varepsilon_{t}\right) / \varepsilon_{t}}
H(x)=sign(t=1∑Tαtft(x))αt=ln(1−εt)/εt
证明:更多的classifier:
f
t
f_{t}
ft,即迭代更多次,
H
(
x
)
H(x)
H(x)在训练数据上会有更小的错误率。
这里提出
1
N
∑
n
exp
(
−
y
^
n
g
(
x
n
)
)
\frac{1}{N} \sum_{n} \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right)
N1∑nexp(−y^ng(xn))作为
H
(
x
)
H(x)
H(x)的上界。所以我们要证明
H
(
x
)
H(x)
H(x)随着迭代次数增加这个上界会越来越小。
注意:
g
(
x
n
)
=
∑
t
=
1
T
α
t
f
t
(
x
)
g\left(x^{n}\right) = \sum_{t=1}^{T} \alpha_{t} f_{t}(x)
g(xn)=∑t=1Tαtft(x),所以上界是会随着迭代次数t变换的。
先定义 Z t Z_{t} Zt: f t f_{t} ft这个classifier对应的训练数据的权重和。
所以就有:
1
N
∑
exp
(
−
y
^
n
g
(
x
n
)
)
=
1
N
Z
T
+
1
\frac{1}{N} \sum \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right)=\frac{1}{N} Z_{T+1}
N1∑exp(−y^ng(xn))=N1ZT+1
那么证明
Z
t
Z_{t}
Zt随着
t
t
t递减就行了。
其中,
Z
t
=
Z
t
−
1
ε
t
exp
(
α
t
)
+
Z
t
−
1
(
1
−
ε
t
)
exp
(
−
α
t
)
Z_{t}=Z_{t-1} \varepsilon_{t} \exp \left(\alpha_{t}\right)+Z_{t-1}\left(1-\varepsilon_{t}\right) \exp \left(-\alpha_{t}\right)
Zt=Zt−1εtexp(αt)+Zt−1(1−εt)exp(−αt)
是比较直观的一种做法,
Z
t
Z_{t}
Zt是
f
t
f_{t}
ft对应的训练数据的权重和。
Z
t
−
1
ε
t
Z_{t-1} \varepsilon_{t}
Zt−1εt表示分类错误的部分,乘上
exp
(
α
t
)
=
d
t
\exp \left(\alpha_{t}\right) = d_{t}
exp(αt)=dt,正确部分同理。
最终推导错误率的上界形式:
∏
t
=
1
T
2
ε
t
(
1
−
ε
t
)
\prod_{t=1}^{T} 2 \sqrt{\varepsilon_{t}\left(1-\varepsilon_{t}\right)}
t=1∏T2εt(1−εt)
由于:
2
ϵ
t
(
1
−
ϵ
t
)
<
1
2 \sqrt{\epsilon_{t}\left(1-\epsilon_{t}\right)} < 1
2ϵt(1−ϵt)
<1,累乘会越来越小。所以上界越来越小,也就可以证明:迭代更多次,
H
(
x
)
H(x)
H(x)在训练数据上会有更小的错误率。
发现Adaboost在train时在迭代5次时已经达到0了,但继续迭代,test时还会继续下降。
Margin的定义
我们希望
y
^
\hat{y}
y^和
g
(
x
)
g(x)
g(x)不只是同号,还希望它们相乘越大越好。
迭代5次的时候,从CDF来看,在margin为0.7附近时,不会再有数据可以使得margin提升。说明迭代5次时training data上
y
^
n
g
(
x
n
)
\hat{y}^{n} g\left(x^{n}\right)
y^ng(xn)都大于0。而迭代100次就一直会有数据使得margin提升(CDF的导数为概率密度不为0)。
为什么Adaboost可以让margin增加?
之前已经说了,Adaboost的上界是图上标记的那条。我们期望减小上界来减少错误率。目标函数也就变成
∏
t
=
1
T
2
ε
t
(
1
−
ε
t
)
\prod_{t=1}^{T} 2 \sqrt{\varepsilon_{t}\left(1-\varepsilon_{t}\right)}
∏t=1T2εt(1−εt)
,它是随着t减少的。
Gradient Boosting
从梯度下降方法来看Adaboost
H
(
x
)
H(x)
H(x)和上面一样,迭代T次对
f
t
f_{t}
ft加权累加,期望输出和真实值越大越好(也同号)。
我们从梯度下降角度出发,有这么一个损失函数:
L
(
g
)
=
∑
n
l
(
y
^
n
,
g
(
x
n
)
)
L(g)=\sum_{n} l\left(\hat{y}^{n}, g\left(x^{n}\right)\right)
L(g)=n∑l(y^n,g(xn))
函数l可以是cross entropy或者mse。这里我们假设是:
∑
n
exp
(
−
y
^
n
g
(
x
n
)
)
\sum_{n} \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right)
∑nexp(−y^ng(xn))
g
t
(
x
)
g_{t}(x)
gt(x)怎么看做是参数?可以这么理解:
输入
g
t
(
x
1
)
g_{t}(x_1)
gt(x1),得到一个参数
g
t
(
x
1
)
g_{t}(x_1)
gt(x1)
输入
g
t
(
x
2
)
g_{t}(x_2)
gt(x2),得到一个参数
g
t
(
x
2
)
g_{t}(x_2)
gt(x2)
无穷多个点,就是输入
g
t
(
x
)
g_{t}(x)
gt(x),得到一个参数
g
t
(
x
)
g_{t}(x)
gt(x)
然后做GD,我们希望下降的方向和Adaboost优化的方向一样:
就是找
f
t
f_{t}
ft使得乘积最大。发现这个式子的weight就是Adaboost的weight :
u
t
n
u_{t}^{n}
utn,也就是说GD每次更新和Adaboost是一样,那么最后得到的
f
t
f_{t}
ft也是一样。
求
α
t
\alpha_{t}
αt要是的loss最小,也就是对
α
t
\alpha_{t}
αt求导要为0,最后求得的
α
t
\alpha_{t}
αt和Adaboost一样。
要注意的是:Gradient Boosting可以改Objective Function,不一定非要是
∑
n
exp
(
−
y
^
n
g
(
x
n
)
)
\sum_{n} \exp \left(-\hat{y}^{n} g\left(x^{n}\right)\right)
∑nexp(−y^ng(xn))
Stacking
投票方式可能会存在个别非常差的model影响整个model输出。
Final Classifier不需要太复杂,只需要Logistic Regression就行了。注意训练数据要分2份,防止有故意拟合Training data的model。
以上参考李宏毅老师视频和ppt,仅作为学习笔记交流使用