BoostingAlgorithmBoosting是一种用来提高弱分类器准确率的算法,是一个“弱学习算法”升级为“强学习算法”的过程,主要思想是“三个皮匠顶诸葛亮”。一般来说,找到一个弱学习算法,然后通过反复学习得到一系列的弱分类器,再把这些弱分类器组合起来得到一个强分类器,是比较容易的。Boosting算法包括两部分,加法模型和前向步进算法。加性模型是指强分类器由一系列弱分类器线性相加而成。一般组合形式如下:$$F_M(x;P)=\sum_{m=1}^n\beta_mh(x;a_m)$$其中,$h(x;a_m)$为弱分类器一个接一个,$a_m$是弱分类器学习到的最优参数,$\beta_m$是弱学习在强分类器中的比例,$P$是所有$\alpha_m$和$\beta_m$的组合.这些弱分类器线性相加形成强分类器。前向步进是指在训练过程中,在上一轮迭代的基础上训练下一轮迭代生成的分类器。即可以写成这样的形式:$$F_m(x)=F_{m-1}(x)+\beta_mh_m(x;a_m)$$用下面的GIF看会更生动Adaboost基本概念AdaBoost典型的Boosting算法是Boosting家族的一员。对于AdaBoost,我们需要弄清楚两点:1.每次迭代的弱学习$h(x;a_m)$有什么区别,如何学习?2.如何确定弱分类器的权重$\beta_m$?第一个问题,AdaBoost的做法是增加那些被上一轮弱分类器误分类的样本的权重,降低那些被正确分类的样本的权重。这样,那些没有被正确分类的数据,由于增加了权重,会在下一轮受到弱分类器更多的关注。因此,分类问题是由一系列弱分类器“分而治之”的。对于第二个问题,即弱分类器的组合,AdaBoost采用加权多数表决的方式。具体来说,增加分类错误率小的弱分类器的权重,使其在投票中发挥更大的作用,降低分类错误率大的弱分类器的权重,使其在投票中发挥较小的作用。角色。Adaboost算法流程——分类输入:训练数据集$T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$,其中$x_i∈X?R^n$,$y_i∈Y={-1,1}$,迭代次数$M$1。初始化训练样本的权重分布:$$\begin{aligned}D_1=(w_{1,1},w_{1,2},…,w_{1,i}),\\w_{1,i}=\frac{1}{N},i=1,2,…,N\end{aligned}$$2。对于$m=1,2,...,M$(a) 使用权值分布为$D_m$的训练数据集进行学习,得到弱分类器$G_m(x)$(b) 计算$G_m(x)$在训练数据集上的分类错误率:$$e_m=\sum_{i=1}^Nw_{m,i}I(G_m(x_i)≠y_i)$$(c) 计算$G_m(x)$在强分类器中的权重:$$\alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m}$$(d) 更新训练数据集的权重分布(这里,(z_m)是归一化因子,目的是为了让样本和的概率分布和为1):$$w_{m+1,i}=\frac{w_{m,i}}{z_m}exp?(-\alpha_my_iG_m(x_i)),i=1,2,…,10$$$$z_m=\sum_{i=1}^Nw_{m,i}exp?(-\alpha_my_iG_m(x_i))$$3。得到最终分类器:$$F(x)=sign(\sum_{i=1}^N\alpha_mG_m(x))$$公式推导假设$m-1$次迭代,得到$F_{m-1}(x)$,根据forwardstep,我们可以得到:$$F_m(x)=F_{m-1}(x)+\alpha_mG_m(x)$$我们已经知道AdaBoost使用exponentialloss,所以我们可以得到损失函数:$$\begin{aligned}Loss=&\sum_{i=1}^Nexp?(-y_iF_m(x_i))\\=&\sum_{i=1}^Nexp?(-y_i(F_{m-1}(x_i)+\alpha_mG_m(x_i)))\end{aligned}$$此时$F_{m-1}(x)$已知,可以移动作为常数放在前面:$$Loss=\sum_{i=1}^N\widetilde{w_{m,i}}exp?(-y_i\alpha_mG_m(x_i))$$其中,$\widetilde{w_{m,i}}=exp?(-y_i(F_{m-1}(x)))$是每次迭代的样本权重!取决于上一轮迭代重新分配再次简化:$$\begin{aligned}\widetilde{w_{m,i}}=&exp?(-y_i(F_{m-1}(x_i)+\alpha_{m-1}G_{m-1}(x_i)))\\=&\widetilde{w_{m-1,i}}exp?(-y_i\alpha_{m-1}G_{m-1}(x_i))\end{aligned}$$继续简化Loss:$$\begin{aligned}Loss=\sum_{y_i=G_m(x_i)}\widetilde{w_{m,i}}exp(-\alpha_m)+\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}}exp?(\alpha_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(-\alpha_m)+\frac{\sum_{y_i≠G_m(x_i)}\widetilde{w_{m,i}}}{\sum_{i=1}^N\widetilde{w_{m,i}}}exp(\alpha_m))\end{aligned}$$其中$\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?(-\alpha_m)+e_mexp?(\alpha_m))$这样我们得到简化损失函数到$\alpha_m$求偏导数阶$\frac{?Loss}{?\alpha_m}=0$得到:$$\alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m}$$AdaBoost例子《统计学习方法》有上面的一个小例子,可以用来加深印象。有如下训练样本,我们需要建立一个强分类器来对它们进行分类。x是特征,y是标签。设权重分布$D_1=(w_{1,1},w_{1,2},...,w_{1,10})$假设一开始的权重分布是均匀分布:$w_{1,i}=0.1,i=1,2,...,10$现在开始训练第一个弱分类器。我们发现阈值为2.5时分类错误率最低,得到的弱分类器为:$$G_1(x)=\begin{cases}1,&\text{x<2.5}\\-1,&\text{x>2.5}\end{cases}$$当然也可以使用其他弱分类器,只要错误率最低即可。为方便起见,这里使用分段函数。得到分类错误率$e_1=0.3$。第二步计算$G_1(x)$在强分类器$\alpha_1=\frac{1}{2}log\frac{1-e_1}{e_1}=0.4236$中的系数第三步是为下一轮迭代训练更新样本的权重分布。从公式:$$w_{2,i}=\frac{w_{1,i}}{z_1}exp?(-\alpha_1y_iG_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次后停止。这里的数据很简单。第三轮迭代得到强分类器:$$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参数详解我们直接使用sklearn.ensemble中的AdaBoostRegressor和AdaBoostClassifier。两者大部分框架参数相同:AdaBoostRegressorclasssklearn.ensemble.AdaBoostRegressor(base_estimator=None,n_estimators=50,learning_rate=1.0,loss='linear',random_state=None)AdaBoostClassifierclasssklearn.ensemble.AdaBoostClassifier(base_estimator=None,n_estimators=50,learning_rate=1.0,algorithm='SAMME.R',random_state=None)parameter1)base_estimator:AdaBoostClassifier和AdaBoostRegressor,也就是我们的弱分类学习器或者弱回归学习器。理论上,可以选择任何分类或回归学习器,但需要支持样本权重。我们通常使用CART决策树或神经网络MLP。默认为决策树,即AdaBoostClassifier默认使用CART分类树DecisionTreeClassifier,AdaBoostRegressor默认使用CART回归树DecisionTreeRegressor。还有一点需要注意的是,如果我们选择的AdaBoostClassifier算法是SAMME.R,那么我们的弱分类学习器还需要支持概率预测,即scikit-learn中弱分类学习器对应的预测方法除了predict之外还需要有预测概率。2)algorithm:这个参数只有AdaBoostClassifier才有。主要原因是scikit-learn实现了两种Adaboost分类算法,SAMME和SAMME.R。两者的主要区别在于弱学习者权重的衡量。SAMME使用二分类Adaboost算法的扩展,即以样本集的分类效果作为弱学习器的权重,而SAMME.R则使用样本集分类的预测概率。该大小用作弱学习器权重。由于SAMME.R使用概率测度的连续值,迭代一般比SAMME快,所以AdaBoostClassifier默认算法algorithm的值也是SAMME.R。我们一般使用默认的SAMME.R,但是需要注意的是,如果使用SAMME.R,弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME算法没有这个限制。3)loss:这个参数只有AdaBoostRegressor才有,Adaboost.R2算法需要。共有三个选项:linear'linear'、square'square'和exponential'exponential'。默认是线性的。通常,线性就足够了,除非您怀疑此参数会导致拟合不佳。4)n_estimators:AdaBoostClassifier和AdaBoostRegressor都是我们弱学习器的最大迭代次数,或者说弱学习器的最大数量。一般来说,n_estimators太小容易欠拟合,n_estimators太大容易过拟合。一般选择一个适中的值。默认为50。在实际调优过程中,我们往往会将n_estimators与下面介绍的参数learning_rate一起考虑。5)learning_rate:AdaBoostClassifier和AdaBoostRegressor都有,即每个weaklearner的权重降低系数ν。我们在原理篇的正则化章节也提到过。添加正则化项后,我们的强学习器的迭代公式为$fk(x)=fk?1(x)+ναkGk(x)$。ν的取值范围为0<ν≤1。对于相同的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器迭代。通常我们用步长和最大迭代次数一起来判断算法的拟合效果。所以这两个参数n_estimators和learning_rate应该一起调整。一般来说,可以从较小的ν开始调谐,默认为1。SAMME.R算法流程1.初始化样本权重:$$w_i=1/N,i=1,2,…,N$$2.重复$m=1,2,…,M$2.1Trainaweakclassifier,得到样本的类别预测概率分布$p_m(x)=P(y=1|x)∈[0,1]$2.2$f_m(x)=\frac{1}{2}log\frac{p_m(x)}{1-p_m(x)}$2.3$w_i=w_iexp[-y_if_m(x_i)]$,同时需要归一化使得权重和为13。得到一个强分类模型:$sign{\sum_{m=1}^{M}f_m(x)}$DecisionTreeClassifier和DecisionTreeRegressor的弱学习器参数,以CART分类树为例,这里和前面的随机森林类似。方法decision_function(X):返回决策函数值fit(X,Y):在数据集(X,Y)上训练模型get_parms():获取模型参数predict(X):预测数据集X的结果predict_log_proba(X):预测数据集X的对数概率predict_proba(X):预测数据集X的概率值score(X,Y):输出数据集(X,Y)在模型上的准确率staged_decision_function(X):returns每个基分类器的决策函数值staged_predict(X):返回每个基分类器预测数据集X的结果staged_predict_proba(X):返回每个基分类器预测数据集X的概率结果staged_score(X,Y):返回每个基分类器的预测准确率。Adaboost总结了Adaboost1的优点,可以使用各种方法构造子分类器。Adaboost算法提供了一个框架2.简单,无需特征筛选3.与RF相比,不用担心过拟合问题Adaboost的缺点1.从wiki上面的介绍可以看出,adaboost对噪声数据非常敏感并且异常数据。Boosting方法本身对噪声点的异常点非常敏感,所以每次迭代都会给噪声点更大的权重,这不是我们系统所期望的。2、运行速度慢。基本上,并行计算不能用于任何涉及迭代的事情。Adaboost是一种“串行”算法。因此,GBDT(GradientBoostingDecisionTree)也很慢。参考:李航《统计学习方法》第八章改进方法《Getting Started with Machine Learning》JimLianghttps://www.cnblogs.com/pinar...https://www.cnblogs.com/Scorp...https://louisscorpio。github.i...https://ask.hellobi.com/blog/...本文由多帖博客平台OpenWrite发布!
