写一点本身理解的AdaBoost,而后再贴上面试过程当中被问到的相关问题。按照如下目录展开。git
固然,也能够去个人博客上看github
AdaBoost是典型的Boosting算法,属于Boosting家族的一员。在说AdaBoost以前,先说说Boosting提高算法。Boosting算法是将“弱学习算法“提高为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛亮”。通常来讲,找到弱学习算法要相对容易一些,而后经过反复学习获得一系列弱分类器,组合这些弱分类器获得一个强分类器。Boosting算法要涉及到两个部分,加法模型和前向分步算法。加法模型就是说强分类器由一系列弱分类器线性相加而成。通常组合形式以下:面试
$$F_M(x;P)=\sum_{m=1}^nβ_mh(x;a_m)$$算法
其中,$h(x;a_m)$ 就是一个个的弱分类器,$a_m$是弱分类器学习到的最优参数,$β_m$就是弱学习在强分类器中所占比重,$P$是全部$a_m$和$β_m$的组合。这些弱分类器线性相加组成强分类器。机器学习
前向分步就是说在训练过程当中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是能够写成这样的形式:ide
$$F_m (x)=F_{m-1}(x)+ β_mh_m (x;a_m)$$函数
因为采用的损失函数不一样,Boosting算法也所以有了不一样的类型,AdaBoost就是损失函数为指数损失的Boosting算法。学习
基于Boosting的理解,对于AdaBoost,咱们要搞清楚两点:ui
对于第一个问题,AdaBoost改变了训练数据的权值,也就是样本的几率分布,其思想是将关注点放在被错误分类的样本上,减少上一轮被正确分类的样本权值,提升那些被错误分类的样本权值。而后,再根据所采用的一些基本机器学习算法进行学习,好比逻辑回归。spa
对于第二个问题,AdaBoost采用加权多数表决的方法,加大分类偏差率小的弱分类器的权重,减少分类偏差率大的弱分类器的权重。这个很好理解,正确率高分得好的弱分类器在强分类器中固然应该有较大的发言权。
为了加深理解,咱们来举一个例子。
有以下的训练样本,咱们须要构建强分类器对其进行分类。x是特征,y是标签。
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
y | 1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | -1 |
令权值分布$D_1=(w_{1,1},w_{1,2},…,w_{1,10} )$
并假设一开始的权值分布是均匀分布:$w_{1,i}=0.1,i=1,2,…,10$
如今开始训练第一个弱分类器。咱们发现阈值取2.5时分类偏差率最低,获得弱分类器为:
固然,也能够用别的弱分类器,只要偏差率最低便可。这里为了方便,用了分段函数。获得了分类偏差率$e_1=0.3$。
第二步计算$(G_1 (x)$在强分类器中的系数$α_1=\frac{1}{2} log\frac{ 1-e_1}{e_1}=0.4236$,这个公式先放在这里,下面再作推导。
第三步更新样本的权值分布,用于下一轮迭代训练。由公式:
$$w_{2,i}=\frac{w_{1,i}}{z_1}exp(-α_1 y_i G_1 (x_i )),i=1,2,…,10$$
获得新的权值分布,从各0.1变成了:
$$D_2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)$$
能够看出,被分类正确的样本权值减少了,被错误分类的样本权值提升了。
第四步获得第一轮迭代的强分类器:
$$sign(F_1 (x))=sign(0.4236G_1 (x))$$
以此类推,通过第二轮……第N轮,迭代屡次直至获得最终的强分类器。迭代范围能够本身定义,好比限定收敛阈值,分类偏差率小于某一个值就中止迭代,好比限定迭代次数,迭代1000次中止。这里数据简单,在第3轮迭代时,获得强分类器:
$$sign(F_3 (x))=sign(0.4236G_1 (x)+0.6496G_2 (x)+0.7514G_3 (x))$$
的分类偏差率为0,结束迭代。
$F(x)=sign(F_3 (x))$就是最终的强分类器。
总结一下,获得AdaBoost的算法流程:
$$e_m=\sum_{i=1}^Nw_{m,i} I(G_m (x_i )≠y_i )$$
$$α_m=\frac{1}{2}log \frac{1-e_m}{e_m} $$
$$w_{m+1,i}=\frac{w_{m,i}}{z_m}exp(-α_m y_i G_m (x_i )),i=1,2,…,10$$
$$z_m=\sum_{i=1}^Nw_{m,i}exp(-α_m y_i G_m (x_i ))$$
$$F(x)=sign(\sum_{i=1}^Nα_m G_m (x))$$
如今咱们来搞清楚上述公式是怎么来的。
假设已经通过$m-1$轮迭代,获得$F_{m-1} (x)$,根据前向分步,咱们能够获得:
$$F_m (x)=F_{m-1} (x)+α_m G_m (x)$$
咱们已经知道AdaBoost是采用指数损失,由此能够获得损失函数:
$$Loss=\sum_{i=1}^Nexp(-y_i F_m (x_i ))=\sum_{i=1}^Nexp(-y_i (F_{m-1} (x_i )+α_m G_m (x_i )))$$
这时候,$F_{m-1}(x)$是已知的,能够做为常量移到前面去:
$$Loss=\sum_{i=1}^N\widetilde{w_{m,i}} exp(-y_i α_m G_m (x_i ))$$
其中,$\widetilde{w_{m,i}}=exp(-y_i (F_{m-1} (x)))$ ,敲黑板!这个就是每轮迭代的样本权重!依赖于前一轮的迭代重分配。
是否是以为还不够像?那就再化简一下:
$$\widetilde{w_{m,i}}=exp(-y_i (F_{m-1} (x_i )+α_{m-1} G_{m-1} (x_i )))=\widetilde{w_{m-1,i}} exp(-y_i α_{m-1} G_{m-1} (x_i ))$$
如今够像了吧?ok,咱们继续化简Loss:
$$Loss=\sum_{y_i=G_m(x_i)}\widetilde{w_{m,i}} exp(-α_m)+\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}} exp(α_m)$$
$$=\sum_{i=1}^N\widetilde{w_{m,i}}(\frac{\sum_{y_i=G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}exp(-α_m)+\frac{\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}exp(α_m))$$
公式变形以后,炒鸡激动!$\frac{\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}$这个不就是分类偏差率$e_m$吗???!重写一下,
$$Loss=\sum_{i=1}^N\widetilde{w_{m,i}}exp(-α_m)+e_m exp(α_m))$$
Ok,这样咱们就获得了化简以后的损失函数。接下来就是求导了。
对$α_m$求偏导,令$\frac{∂Loss}{∂α_m }=0$获得:
$$α_m=\frac{1}{2}log\frac{1-e_m}{e_m} $$
真漂亮!
另外,AdaBoost的代码实战与详解请戳代码实战之AdaBoost
今年8月开始找工做,参加大厂面试问到的相关问题有以下几点:
做者 Scorpio.Lu转载请注明出处!