【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

一、Boosting(提升学习)

随机森林

在随机森林的构建过程中,由于各棵树之间是没有关系的,相对独立的;在构建的过程中,构建第m个子树的时候,不会考虑前面的m-1棵子树。

那么:

  • 如果在构建第m棵子树的时候,考虑到前m-1棵子树的结果,会不会对最终结果产生有益
    的影响?
  • 各个决策树组成随机森林后,在形成最终结果的时候能不能给定一种既定的决策顺序呢?
    (也就是哪颗子树先进行决策、哪颗子树后进行决策)

对于 Bagging 思想集成的随机森林,是可以并行训练的,正是因为每个弱分类器之间不相互影响;而 Boosting 是通过串行训练而获得的,每个分类器要根据以前训练出的分类器的性能来进行训练。

【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

  • Boosting 分类的结果是基于所有弱分类器的加权求和结果的,所以 Boosting 中的每个弱分类器的权重不一样,每个权重代表的是其对应的弱分类器在上一轮迭代中的成功度;
  • Bagging 中的弱分类器的权重是一样的。

Boosting 常用模型:

  • AdaBoost
  • Gradient Boosting(GBT/GBDT/GBRT)
  • XGBoost

二、AdaBoost

1、AdaBoost 执行过程

AdaBoost 是一种迭代算法,整个迭代过程直到错误率足够小或者达到一定的迭代次数为止;每轮迭代中会在修改后的训练集上产生一个新的弱学习器,然后使用该弱学习器对所有样本进行预测,以评估每个样本的重要性。

  1. 在每一轮如何改变训练数据的权重或概率分布

AdaBoost算法会为每个样本赋予一个权重,其做法是:

  • 提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。

这样一来,在那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注,也就是说 越难区分 的样本在训练过程中会变得越重要。于是,分类问题被一系列的弱分类器“分而治之”。

  1. 如何将弱分类器组合成一个强分类器

AdaBoost 采取加权多数表决的方法:

  • 具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
  1. 样本加权、弱学习器组合

【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

  • 如图1,训练一个弱分类器,由中间虚线决策;
  • 如图2,将分类错误的样本加权,图中由大小区分,再训练一个弱分类器,由左侧虚线决策;
  • 如图3,再将分类错误的样本权重加大,再训练弱分类器;
  • 如图4,将之前学习的弱学习器决策线组合,形成最终的分类器

2、AdaBoost 算法推导

Adaboost算法将基分类器的线性组合作为强分类器,同时给分类误差率较小的基本分类器以大的权重值,给分类误差率较大的基分类器以小的权重值

重点(仔细推导):
(1)构建的线性组合为:
f(x)=m=1MαmGm(x)f(x) = \sum_{m=1}^M\alpha_mG_m(x)
(2)最强学习器是在线性组合的基础上进行Sign函数转换:
G(x)=sign(f(x))=sign[m=1MαmGm(x)]G(x) = sign(f(x)) = sign\Big[\sum_{m=1}^M\alpha_mG_m(x)\Big]
(3)损失函数:
loss=1ni=1nI(G(xi)yi)1ni=1neyif(xi)loss=\frac{1}{n}\sum_{i=1}^nI(G(x_i) \neq y_i) \leqslant \frac{1}{n}\sum_{i=1}^n e^{-y_if(x_i)}

  • 其中,I(G(xi)yi)I(G(x_i) \neq y_i) 为指示函数,表示预测值与真实值不等则函数为1,否则为0;所以不等式前面一部分表示准确率。
  • 不等式后半部分:假设预测正确结果为1,预测错误结果为0,f(x)f(x) 为预测值,yiy_i 为真实值;
  • 当预测结果与真实值相等,即yi=f(xi)=1yif(xi)=1eyif(xi)=e1<1y_i = f(x_i)=1,y_if(x_i) = 1,e^{-y_if(x_i)} = e^{-1}< 1
  • 当预测结果与真实值不等,即yif(xi)=1eyif(xi)=e>1y_if(x_i) = -1,e^{-y_if(x_i)} = e > 1
  • 故不等式恒成立。

(4)假设第k-1轮的强学习器为:
fk1(x)=j=1k1αjGj(x)f_{k-1}(x)=\sum_{j=1}^{k-1}\alpha_jG_j(x)
(5)第k轮的强学习器为:
fk(x)=fk1(x)+αkGk(x)f_k(x) = f_{k-1}(x) + \alpha_kG_k(x)
(6)损失函数为:
loss=1ni=1neyi(fk1(xi)+αkGk(xi))loss = \frac{1}{n}\sum_{i=1}^ne^{-y_i( f_{k-1}(x_i) + \alpha_kG_k(x_i))}
=1ni=1neyifk1(xi)eyiαkGk(xi)= \frac{1}{n}\sum_{i=1}^ne^{-y_i f_{k-1}(x_i)}e^{-y_i\alpha_kG_k(x_i)}
由于在训练第k轮的时候,前一轮损失是一个已知值,所以可令 wki=eyifk1(xi)\overline{w}_{ki} = e^{-y_i f_{k-1}(x_i)},第k轮的损失函数为:
loss=1ni=1nwkieyiαkGk(xi)loss= \frac{1}{n}\sum_{i=1}^n\overline{w}_{ki}e^{-y_i\alpha_kG_k(x_i)}
(7)是上面损失函数达到最小值的αkGk\alpha_k,G_k 就是AdaBoost算法的最终解

求解过程分为两步:

  1. Gk(x)G^*_k(x)
  • 对于任意α>0\alpha >0,使损失函数最小的Gk(x)G^*_k(x)可由下式得到:
  • Gk(x)=argminGi=1nwkiI(yiG(xi))G^*_k(x) = arg \min_G\sum_{i=1}^n\overline{w}_{ki} I(y_i \neq G(x_i))
  • 其中:wki=eyifk1(xi)\overline{w}_{ki} = e^{-y_i f_{k-1}(x_i)};表示第kk轮第ii个实例的权重,且i=1nwmi=1\sum_{i=1}^n \overline{w}_{mi}=1
  • 此分类器Gk(x)G^*_k(x)即为AdaBoost算法的基本分类器(弱分类器),它是使第k轮加权训练数据分类误差率最小的基本分类器。
  1. αk\alpha^*_k
  • i=1nwkieyiαkGk(xi)\sum_{i=1}^n\overline{w}_{ki}e^{-y_i\alpha_kG_k(x_i)}
  • =yi=Gk(xi)wkieαk+yiGk(xi)wkieαk=\sum_{y_i = G_k(x_i)}\overline{w}_{ki}e^{-\alpha_k}+\sum_{y_i \neq G_k(x_i)}\overline{w}_{ki}e^{\alpha_k}
  • =(eαkeαk)i=1nwkiI(yiG(xi))+eαki=1nwki=(e^{\alpha_k }-e^{-\alpha_k})\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i)) + e^{-\alpha_k}\sum_{i=1}^n \overline{w}_{ki}
  • 其中:i=1nwkiI(yiG(xi))=yiGk(xi)wki\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))=\sum_{y_i \neq G_k(x_i)}\overline{w}_{ki}
  • i=1nwki=yi=Gk(xi)wki+yiGk(xi)wki\sum_{i=1}^n \overline{w}_{ki}=\sum_{y_i = G_k(x_i)}\overline{w}_{ki}+\sum_{y_i \neq G_k(x_i)}\overline{w}_{ki}
  • 然后对αk\alpha_k求导并使导数为0:
  • (eαk+eαk)i=1nwkiI(yiG(xi))eαki=1nwki=0(e^{\alpha_k}+e^{-\alpha_k})\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i)) - e^{-\alpha_k}\sum_{i=1}^n \overline{w}_{ki} = 0
  • (eαk+eαk)i=1nwkiI(yiG(xi))=eαki=1nwki(e^{\alpha_k}+e^{-\alpha_k})\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))=e^{-\alpha_k}\sum_{i=1}^n \overline{w}_{ki}
  • eαk+eαkeαk=i=1nwkii=1nwkiI(yiG(xi))\frac{e^{\alpha_k}+e^{-\alpha_k}}{e^{-\alpha_k}}=\frac{\sum_{i=1}^n \overline{w}_{ki}}{\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))}
  • e2αk+1=i=1nwkii=1nwkiI(yiG(xi))e^{2\alpha_k} + 1 = \frac{\sum_{i=1}^n \overline{w}_{ki}}{\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))}
  • e2αk=i=1nwkii=1nwkiI(yiG(xi))i=1nwkiI(yiG(xi))e^{2\alpha_k} = \frac{\sum_{i=1}^n \overline{w}_{ki} - \sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))}{\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))}
  • αk=12ln(i=1nwkii=1nwkiI(yiG(xi))i=1nwkiI(yiG(xi)))\alpha_k = \frac{1}{2}ln\Big(\frac{\sum_{i=1}^n \overline{w}_{ki} - \sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))}{\sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i))}\Big)
  • Ek=i=1nwkiI(yiG(xi))\mathcal{E_k} = \sum_{i=1}^n \overline{w}_{ki}I(y_i \neq G(x_i)),且i=1nwmi=1\sum_{i=1}^n \overline{w}_{mi}=1
  • 故:
  • αk=12ln(1EkEk)\alpha_k^* = \frac{1}{2}ln\Big(\frac{1 - \mathcal{E}_k}{\mathcal{E}_k}\Big)

以上就是算法的推导过程,下面我们就用上面得到的解,来构建 AdaBoost 算法:

3、AdaBoost 算法的构建过程:

  • 1、假设训练数据集T={(X1,Y1),(X2,Y2),..,(Xn,Yn)}T = \{(X_1,Y_1),(X_2,Y_2),..,(X_n,Y_n)\}
  • 2、初始化训练数据权重分布:
    D1=(w11,w12,...,w1n),w1i=1n,i=1,2,...,nD_1 = (w_{11},w_{12},...,w_{1n}),\quad w_{1i} = \frac{1}{n},\quad i=1,2,...,n
  • 3、使用具有权重分布 DmD_m 的训练数据集学习,得到基本分类器
    Gm(x)x{1,+1}G_m(x):x \rightarrow\{-1, +1\}
  • 4、计算 Gm(x)G_m(x) 在训练集上的分类误差
    Em=P(Gm(x)yi)=i=1nw(mi)I(Gm(x)yi)\mathcal{E}_m = P(G_m(x) \neq y_i) = \sum_{i=1}^n w_{(mi)}I(G_m(x) \neq y_i)

其中,w(mi)w_{(mi)}为第m次迭代第i个样本的权重,I(Gm(x)yi)I(G_m(x) \neq y_i)为指示函数,决策正确为0,决策错位为1;

  • 5、计算 Gm(x)G_m(x) 模型的权重系数 αm\alpha_m
    αm=12ln(1EmEm)\alpha_m = \frac{1}{2} ln(\frac{1 - \mathcal{E}_m}{\mathcal{E}_m})
  • 6、权重训练数据集的权重分布
    Dm+1=(w(m+1,1),w(m+1,2),...,w(m+1,n))D_{m+1} = (w_{(m+1,1)},w_{(m+1,2)},...,w_{(m+1,n)})
    w(m+1,i)=w(m,i)ZmeyiαmGm(xi)w_{(m+1,i)} = \frac{w_{(m,i)}}{Z_m}e^{-y_i\alpha_mG_m(x_i)}

其中:Zm=i=1nw(mi)eyiαmGm(xi)Z_m = \sum_{i=1}^n w_{(mi)}e^{-y_i\alpha_mG_m(x_i)}

  • 7、构建基本分类器的线性组合
    f(x)=m=1MαmGm(x)f(x) = \sum_{m=1}^M \alpha_mG_m(x)
  • 8、得到最终分类器
    G(x)=sign(f(x))=sign[m=1MαmGm(x)]G(x) = sign\big(f(x)\big) = sign \Big[\sum_{m=1}^M\alpha_m G_m(x)\Big]

【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

4、简单实例进一步理解 AdaBoost算法

通过具体数据了解 AdaBoost 算法

训练数据集如下表:

【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

(1)初始化数据权值分布
D1=(w11,w12,...,w110)w1i=0.1,i=1,2,...,10D_1 = (w_{11},w_{12},...,w_{110}) \\ w_{1i} = 0.1, i = 1,2,...,10
(2)m=1m = 1:

  • (a)在权值分布为D1D_1的训练数据集上,阀值vv取2.5时分类误差率最低,故基本分类器为:
    G1(x)={1,x<2.51,x>2.5G_1(x) = \begin{cases} 1, \quad x < 2.5 \\ \\ -1, \quad x>2.5 \end{cases}

  • (b)G1(x)G_1(x)在训练数据集上的误差率
    e1=P(G1(x)yi)=0.3e_1 = P(G_1(x) \neq y_i) = 0.3

  • (c)计算G1(x)G_1(x)的系数:
    α1=12log1e1e1=0.4236\alpha_1 = \frac{1}{2}log\frac{1- e_1}{e_1} = 0.4236

  • (d)更新训练数据集的权值分布
    D2=(w21,w22,...,w210)wwi=w1iZ1exp(α1yiG1(x)),i=1,2,...,10D2=(0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143)f1(x)=0.4236G1(x)D_2 = (w_{21},w_{22},...,w_{210}) \\ w_{wi} = \frac{w_{1i}}{Z_1}exp(-\alpha_1 y_iG_1(x)), i = 1, 2,...,10 \\ D_2 = (0.07143,0.07143,0.07143,0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.07143) \\ f_1(x) = 0.4236G_1(x)
    分类器sing[f1(x)]sing[f_1(x)]在训练数据集上有3个误分类点。

m=2m = 2:

  • (a)在权值分布为D2D_2的训练数据集上,阀值vv取8.5时分类误差率最低,故基本分类器为:
    G2(x)={1,x<8.51,x>8.5G_2(x) = \begin{cases} 1, \quad x < 8.5 \\ \\ -1, \quad x>8.5 \end{cases}
    此时,序号为4,5,6的分类错误

  • (b)G2(x)G_2(x)在训练数据集上的误差率(将序号为4,5,6对应的w相加):
    e2=0.07143+0.07143+0.07143=0.2143e_2 =0.07143 + 0.07143+0.07143 = 0.2143

  • (c)计算G2(x)G_2(x)的系数:α2=0.6496\alpha_2 = 0.6496

  • (d)更新训练数据集的权值分布
    D3=(0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,0.1667,0.1667,0.1667,0.0455)f2(x)=0.4236G1(x)+0.6496G2(x)D_3 = (0.0455,0.0455,0.0455,0.1667,0.1667,0.1667,\\ 0.1667,0.1667,0.1667,0.0455) \\ f_2(x) = 0.4236G_1(x) + 0.6496G_2(x)
    分类器sing[f2(x)]sing[f_2(x)]在训练数据集上有3个误分类点。

m=3m = 3:

  • (a)在权值分布为D3D_3的训练数据集上,阀值vv取8.5时分类误差率最低,故基本分类器为:
    G3(x)={1,x<5.51,x>5.5G_3(x) = \begin{cases} 1, \quad x < 5.5 \\ \\ -1, \quad x>5.5 \end{cases}

  • (b)G3(x)G_3(x)在训练数据集上的误差率:e3=0.1820e_3 = 0.1820

  • (c)计算G3(x)G_3(x)的系数:α3=0.7514\alpha_3 = 0.7514

  • (d)更新训练数据集的权值分布
    D3=(0.125,0.125,0.125,0.125,0.102,0.102,0.102,0.065,0.065,0.125)f3(x)=0.4236G1(x)+0.6496G2(x)+0.7514G3(x)D_3 = (0.125,0.125,0.125,0.125,0.102,0.102,\\ 0.102,0.065,0.065,0.125) \\ f_3(x) = 0.4236G_1(x) + 0.6496G_2(x)+0.7514G_3(x)

分类器sing[f3(x)]sing[f_3(x)]在训练数据集上有0个误分类点。

最终分类器为:
G(x)=sign[f3(x)]=sign[0.4236G1(x)+0.6496G2(x)+0.7514G3(x)]G(x) = sign[f_3(x)] = sign[0.4236G_1(x) + 0.6496G_2(x)+0.7514G_3(x)]

三、AdaBoost 案例

代码可见:Github

sklearn 库中 ensemble.AdaBoostClassifier 以及 ensemble.AdaBoostRegressor API:

分类:
sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50, 
		learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)
回归:		
sklearn.ensemble.AdaBoostRegressor(base_estimator=None, n_estimators=50,
		learning_rate=1.0, loss=’linear’, random_state=None)

常用参数比较:

参数 AdaBoostClassifier AdaBoostRegressor
base_estimator 弱分类器对象,默认为CART分类树,DecisionTreeClassifier; 弱回归器对象,默认为CART回归树,DecisionTreeRegressor;
algorithm SAMME和SAMME.R;SAMME表示构建过程中使用样本集分类效果作为弱分类器的权重;SAMME.R使用对样本集分类的预测概率大小作为弱分类器的权重。由于SAMME.R使用了连续的概率度量值,所以一般迭代比SAMME快,默认参数为SAMME.R;强调:使用SAMME.R必须要求base_estimator指定的弱分类器模型必须支持概率预测,即具有predict_proba方法。 不支持
loss 不支持 指定误差的计算方式,可选参数”linear”, “square”,“exponential”, 默认为”linear”;一般不用改动
n_estimators 最大迭代次数,值过小可能会导致欠拟合,值过大可能会导致过拟合,一般50~100比较适合,默认50
learning_rate 指定每个弱分类器的权重缩减系数v,默认为1;一般从一个比较小的值开始进行调参;该值越小表示需要更 多的弱分类器
  • 数据量大的时候,可以增加内部分类器的树深度,也可以不限制树深 max_depth,一般范围在10-100之间
  • 数据量小的时候,一般可以设置树深度较小,或者 n_estimators 较小迭代次数或者最大弱分类器数:200次

1、Adaboost 分类算法

本案例将 AdaBoosted 决策树桩拟合到由两个“高斯分位数” 聚类组成的非线性可分类分类数据集,并绘制决策边界和决策分数

【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

代码可见:05_Adaboost分类算法.py

2、Adaboost参数algorithm取值比较

本案例通过更改参数algorithm的取值比较"ASMME""SAMME.R" 的收敛速度,错误率

【机器学习】一文理解集成学习Boosting思想之AdaBoost,附带案例

可以看出,SAMME.R 的收敛速度明显比 SAMME 快,错误率也比 SAMME 低,所以一般推荐使用 SAMME.R

代码可见:06_Adaboost参数algorithm取值比较.py

总结

AdaBoost 的优点如下:

  • 可以处理连续值和离散值;
  • 模型的鲁棒性比较强;
  • 解释强,结构简单。

AdaBoost 的缺点如下:

  • 对异常样本敏感,异常样本可能会在迭代过程中获得较高的权重值,最终影响模型效果。