Boosting是一族可将弱学习器提升为强学习器的算法。这族算法的工作机制类似:
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的样本在后面受到更多关注。
AdaBoost
一直觉得AdaBoost这个名字起得好呀,全拼是Adaptive Boosting;adaptive是适应的,适合额意思。但是世界上第一个程序媛不也叫Ada嘛~
haha~扯远了。我们看看AdaBoost是怎么提升正确率的。
实现
在理论推导之前我们先看看它到底是怎么做的。
现在我们有训练集D={
(x1,y1),(x2,y2),...,(xm,ym)}D=\{(\mathbf{x_1},y_1),(\mathbf{x_2},y_2), ... ,(\mathbf{x_m},y_m)\}D={
(x1,y1),(x2,y2),...,(xm,ym)},基学习算法φ\varphiφ。其中Y∈{
−1,+1}Y\in\{-1,+1\}Y∈{
−1,+1}
-
第一次训练我们就像平常一样,每个样例的权重为1/m1/m1/m。
-
我们为每个训练好的学习器附加权重,因为我们最后要线性求和学习器输出结果。这个权重怎么分配呢?我们让它与分类错误率挂钩。设第k个学习器的分类错误率为ϵk\epsilon_kϵk,则权重为
αk=12ln(1−ϵtϵt)\alpha_k=\frac{1}{2}ln(\frac{1-\epsilon_t}{\epsilon_t})αk=21ln(ϵt1−ϵt) -
为了下一次的基学习器的训练,我们需要改变样本权重,大致思想为,这次分类对的缩小权重,这个分类错的,加大。这个权重的变更也跟ϵk\epsilon_kϵk有关:
Dk+1(x)=Dk(x)Zk×{ exp(−αk),if hk(x)=f(x)exp(αk),if hk(x)≠f(x)=Dk(x)Zk×exp(−αkf(x)hk(x)) D_{k+1}(x)=\frac{D_k(\mathbf{x})}{Z_k}\times\begin{cases} exp(-\alpha_k),if h_k(\mathbf{x})=f(\mathbf{x})\\ exp(\alpha_k),if h_k(\mathbf{x})\neq f(\mathbf{x}) \end{cases}\\ =\frac{D_k(\mathbf{x})}{Z_k}\times exp(-\alpha_kf(\mathbf{x})h_k(\mathbf{x}))Dk+1(x)=ZkDk(x)×{ exp(−αk),if hk(x)=f(x)exp(αk),if hk(x)