【集成学习】—— AdaBoost

1. Boosting算法的基本原理

        Boosting算法基本原理,在分类问题中是通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。
        Boosting算法工作机制,首先从训练集用初始权重训练出一个弱学习器1,根据弱学习器1的学习误差率来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过结合策略进行整合,得到最终的强学习器。

2. AdaBoost算法

        Adaboost既可以用作分类,也可以用作回归。使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。

        根据Boosting算法原理发现关键需要解决两个问题,就可以提高算法模型分类性能,那么看看AdaBoost算法是如何解决的,问题如下:

  • 每一轮如何改变训练数据的权重或概率分布?
    • AdaBoost算法是根据学习误差率按照一定方法,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值 ;
  • 如何将所学习器组合成一个强分类器?
    • AdaBoost算法是采取加权多数表决的方法 ,加大分类误差率小的弱分类器权重系数,使其在表决中起较大作用,减小分类误差率大的弱分类器的权重系数,使其在表决中起较小作用;

最终具体要解决的4个问题:

  • (1)如何计算弱学习器的学习误差率?
  • (2)如何更新每一轮训练样本的权重?
  • (3)如何计算每个弱学习器权重系数?
  • (4)选择何种结合策略得到强学习器?

2.1 AdaBoost分类算法流程

AdaBoost二元分类问题算法流程如下:

  • 输入:训练数据集 T = { ( x , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\} T={(x,y1),(x2,y2),...(xm,ym)},输出为{-1, +1}, 弱分类器迭代次数 K

  • 输出:输出为最终的强分类器 G ( x ) G(x) G(x)

  • Step1:初始化训练数据的权值分布: D 1 = ( w 11 , w 12 , . . . w 1 m ) ;      w 1 i = 1 m ;      i = 1 , 2... m D_{1} = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m D1=(w11,w12,...w1m);w1i=m1;i=1,2...m

  • Step2:对 k = 1,2,…,K

    • (a)使用具有权重 D k D_{k} Dk 的样本集来训练数据,得到弱分类器 G k ( x ) G_{k}(x) Gk(x)

    • (b)计算 G k ( x ) G_{k}(x) Gk(x) 的在训练数据集上的分类误差率 e k e_{k} ek

      e k = ∑ i = 1 m P ( G k ( x i ) ≠ y i ) = ∑ i = 1 m w k i I ( G k ( x i ) ≠ y i ) e_k = \sum\limits_{i=1}^{m}P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i) ek=i=1mP(Gk(xi)̸=yi)=i=1mwkiI(Gk(xi)̸=yi)

    • (c)计算弱分类器 G k ( x ) G_{k}(x) Gk(x) 的权重系数 α k \alpha_k αk α k = 1 2 l o g 1 − e k e k \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} αk=21logek1ek

    • (d) 更新训练样本集的权重分布:

      w k + 1 , i = w k i Z K e x p ( − α k y i G k ( x i ) )      i = 1 , 2 , . . . m w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i)) \;\; i =1,2,...m wk+1,i=ZKwkiexp(αkyiGk(xi))i=1,2,...m

      其中, Z k Z_k Zk 是规范化因子: Z k = ∑ i = 1 m w k i e x p ( − α k y i G k ( x i ) ) Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i)) Zk=i=1mwkiexp(αkyiGk(xi))

      那么k+1轮训练数据集的权重分布为: D k + 1 = ( w k + 1 , 1 , w k + 1 , 2 , . . . w k + 1 , m ) D_{k+1}= (w_{k+1,1}, w_{k+1,2}, ...w_{k+1,m}) Dk+1=(wk+1,1,wk+1,2,...wk+1,m)

  • Step3:构建基本弱分类器的线性组合: f ( x ) = ∑ k = 1 K α k G k ( x ) f(x) = \sum\limits_{k=1}^{K}\alpha_kG_k(x) f(x)=k=1KαkGk(x)

    得到最终分类器: G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ k = 1 K α k G k ( x ) ) G(x) = sign(f(x))=sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x)) G(x)=sign(f(x))=sign(k=1KαkGk(x))

对于Adaboost多元分类算法,其实原理和二元分类类似,最主要区别在弱分类器的系数上。比如Adaboost SAMME算法,它的弱分类器的系数:

α k = 1 2 l o g 1 − e k e k + l o g ( R − 1 ) \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} + log(R-1) αk=21logek1ek+log(R1)

其中R为类别数。

2.2 AdaBoost回归算法流程

AdaBoost回归算法变种很多,下面的算法为Adaboost R2回归算法过程:

  • 输入:训练数据集 T = { ( x , y 1 ) , ( x 2 , y 2 ) , . . . ( x m , y m ) } T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\} T={(x,y1),(x2,y2),...(xm,ym)},输出为{-1, +1}, 弱分类器迭代次数 K

  • 输出:输出为最终的强分类器 G ( x ) G(x) G(x)

  • Step1:初始化训练数据的权值分布: D 1 = ( w 11 , w 12 , . . . w 1 m ) ;      w 1 i = 1 m ;      i = 1 , 2... m D_{1} = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m D1=(w11,w12,...w1m);w1i=m1;i=1,2...m

  • Step2:对 k = 1,2,…,K

    • (a)使用具有权重 D k D_{k} Dk 的样本集来训练数据,得到弱分类器 G k ( x ) G_{k}(x) Gk(x)

    • (b)计算 G k ( x ) G_{k}(x) Gk(x) 的在训练数据集上的最大误差 E k E_{k} Ek

      E k = m a x ∣ y i − G k ( x i ) ∣    i = 1 , 2... m E_k= max|y_i - G_k(x_i)|\;i=1,2...m Ek=maxyiGk(xi)i=1,2...m

    • (c)计算每个样本的相对误差 e k i e_{ki} eki

      线性误差: e k i = ∣ y i − G k ( x i ) ∣ E k e_{ki}= \frac{|y_i - G_k(x_i)|}{E_k} eki=EkyiGk(xi)

      平方误差: e k i = ( y i − G k ( x i ) ) 2 E k 2 e_{ki}= \frac{(y_i - G_k(x_i))^2}{E_k^2} eki=Ek2(yiGk(xi))2

      指数误差: e k i = 1 − e x p ( − ∣ y i − G k ( x i ) ∣ E k ) e_{ki}= 1 - exp(\frac{-|y_i -G_k(x_i)|}{E_k}) eki=1expEkyiGk(xi)

    • (d)计算 G k ( x ) G_{k}(x) Gk(x) 的在训练数据集上的回归误差率 e k e_{k} ek e k = ∑ i = 1 m w k i e k i e_k = \sum\limits_{i=1}^{m}w_{ki}e_{ki} ek=i=1mwkieki

    • (e)计算弱分类器 G k ( x ) G_{k}(x) Gk(x) 的权重系数 α k \alpha_k αk α k = e k 1 − e k \alpha_k =\frac{e_k}{1-e_k} αk=1ekek

    • (f) 更新训练样本集的权重分布: w k + 1 , i = w k i Z k α k 1 − e k i w_{k+1,i} = \frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}} wk+1,i=Zkwkiαk1eki

      其中, Z k Z_k Zk 是规范化因子: Z k = ∑ i = 1 m w k i α k 1 − e k i Z_k = \sum\limits_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}} Zk=i=1mwkiαk1eki

      那么k+1轮训练数据集的权重分布为: D k + 1 = ( w k + 1 , 1 , w k + 1 , 2 , . . . w k + 1 , m ) D_{k+1}= (w_{k+1,1}, w_{k+1,2}, ...w_{k+1,m}) Dk+1=(wk+1,1,wk+1,2,...wk+1,m)

  • Step3:构建最终强学习器为: G ( x ) = G k ∗ ( x ) G(x) =G_{k^*}(x) G(x)=Gk(x)

    其中, G k ∗ ( x ) G_{k^*}(x) Gk(x) 是所有 l n 1 α k , k = 1 , 2 , . . . . K ln\frac{1}{\alpha_k}, k=1,2,....K lnαk1,k=1,2,....K 的中位数值对应序号 k ∗ k^* k 对应的弱学习器。

3. AdaBoost in Python

4. AdaBoost in Sklearn

4.1 AdaBoost类库简单实现

from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier(n_estimators=100, learning_rate=0.5)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)

AdaBoostClassifier(algorithm=‘SAMME.R’, base_estimator=None,
learning_rate=0.5, n_estimators=100, random_state=None)
1.0

4.2 Adaboost类库概述

        Adaboost调参时,主要要对两部分内容进行调参,第一部分是对我们的Adaboost的框架进行调参, 第二部分是对我们选择的弱分类器进行调参。

  • 分类库:AdaBoostClassifier:使用了 SAMME算法和SAMME.R算法
  • 回归库:AdaBoostRegresso:使用了 Adaboost.R2算法

(1) AdaBoost框架参数

        AdaBoostClassifier和AdaBoostRegressor框架参数大部分框架参数相同,如下:

  • base_estimator: AdaBoostClassifier和AdaBoostRegressor都有,即我们的弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。我们常用的一般是CART决策树或者神经网络MLP需要注意的点是: 如果我们选择的AdaBoostClassifier算法是SAMME.R,则我们的弱分类学习器还需要支持概率预测,也就是在scikit-learn中弱分类学习器对应的预测方法除了predict还需要有predict_proba。
  • n_estimators: AdaBoostClassifier和AdaBoostRegressor都有,就是我们的弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
  • earning_rate: AdaBoostClassifier和AdaBoostRegressor都有,即每个弱学习器的权重缩减系数ν。
  • 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算法则没有这个限制。
  • loss: 这个参数只有AdaBoostRegressor有,Adaboost.R2算法需要用到。有线性‘linear’, 平方‘square’和指数 ‘exponential’三种选择, 默认是线性。

(2)AdaBoost弱学习器参数

        AdaBoostClassifier和AdaBoostRegressor弱学习器参数,由于使用不同的弱学习器,则对应的弱学习器参数各不相同。而默认是决策树弱学习器的参数,即CART分类树DecisionTreeClassifier和CART回归树DecisionTreeRegressor。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值