Adaboost理解

集成学习器的形式:

G(X)=sign[f(x)]=sign[\alpha_1G_1(x)+\alpha_2G_2(x)+...+\alpha_nG_n(x)]

(sign(x)为符号函数,x>0输出1,x<0输出-1)

  (G_i(x)为个体学习器,\alpha _i表示该学习器的重要性)

Adaboost算法分析:

该算法其实是一个简单的弱分类算法提升过程,这个过程通过不断的训练,可以提高对数据的分类能   Adaboost
力。整个过程如下所示:   

       1. 先通过对N个训练样本的学习得到第一个弱分类器;   

       2. 将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器 ;   
       3. 将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器;

  4. 最终经过提升的强分类器 。即某个数据被分为哪一类要通过 , ……的多数表决。

下面直接通过例子去理解AdaBoost算法。(例子与解法来源于李航的《统计学习方法》)

例子:

        假设个体学习器由x(输入)和y(输出)产生,其阈值v(判定正反例的分界线)使该分类器在训练数据集上分类误差率最低。(y=1为正例,y=-1为反例)

序号12345678910
X0123456789
y111-1-1-1111-1

第一个个体学习器:

第一个学习器,先认为每个x的权重一样,即 w_i=0.1 (i=1-10)。 

D1:

X0123456789
w10.10.10.10.10.10.10.10.10.10.1
y111-1-1-1111-1

(a)对于n=1(即第一个学习器),在权值分布为D1(10个数据,每个数据的权值皆初始化为0.1)的训练数据上,经过计算可得

  1. 阈值v取2.5时误差率为0.3(x < 2.5时取1,x > 2.5时取-1,则6 7 8分错,误差率为0.3),
  2. 阈值v取5.5时误差率最低为0.4(x < 5.5时取1,x > 5.5时取-1,则3 4 5 6 7 8皆分错,误差率0.6大于0.5,不可取。故令x > 5.5时取1,x < 5.5时取-1,则0 1 2 9分错,误差率为0.4),
  3. 阈值v取8.5时误差率为0.3(x < 8.5时取1,x > 8.5时取-1,则3 4 5分错,误差率为0.3)。

因此选择2.5与8.5为阈值错误率均为0.3,故可取任意一个,根据代码取2.5为阈值。

此时分类器为G_1(x)\left\{\begin{matrix}1 & x<2.5\\ -1 & x>2.5 \end{matrix}\right.

通过代码绘制出树:

import numpy as np
from sklearn.ensemble import AdaBoostClassifier
from sklearn import tree

X=np.arange(10).reshape(-1,1)
y=np.array([1,1,1,-1,-1,-1,1,1,1,-1])

ada=AdaBoostClassifier(n_estimators=3,algorithm='SAMME')
ada.fit(X,y)

plt.figure(figsize=(9,6))
_=tree.plot_tree(ada[0])

y_=ada[0].predict(X)  #查看第一棵树的预测值
print(y_)
print(y)
>>> [ 1,  1,  1, -1, -1, -1, -1, -1, -1, -1]
>>> [ 1,  1,  1, -1, -1, -1,  1,  1,  1, -1]

 (b)可以看到将6,7,8预测错误,此时误差e1=0.3,根据e1求\alpha _1:

\alpha _i=\frac{1}{2}log\frac{1-e_i}{e_i},  则\alpha _1=0.4236

(c)更新训练数据的权值分布  

 即此处为:w*e^{-a_i*y*\hat{y}},其中y为真实值\hat{y}为预测值,w为权重。通过代码计算求得:

#更新的权重
w2=0.1*np.e**(-a1*y*y_)
w2
>>>   [0.06546857, 0.06546857, 0.06546857, 0.06546857, 0.06546857,
       0.06546857, 0.15274505, 0.15274505, 0.15274505, 0.06546857]
w2.sum()
>>> 0.9165151400883117

此处,和应该为1,则将权重重新分布,使其和为1。

w2=w2/w2.sum()
w2=np.round(w2,5)  
w2
>>>   [0.07143, 0.07143, 0.07143, 0.07143, 0.07143, 
       0.07143, 0.16666,0.16666, 0.16666, 0.07143]

   D2:

X0123456789
w20.071430.071430.071430.071430.071430.071430.166660.166660.166660.07143
y111-1-1-1111-1

        可以看到x=6,7,8的数据的权重变大,而其他数据的权重降低这是希望能把之前经常分类错误的数据能在下一个个体学习器分类正确(经常分类错误会出现权重不断变大)。(权重是用来计算误差的,为了降低误差,选择阈值时会倾向把权重大的分类正确)此时 :

f_1(x)=\alpha _1G_1(x)=0.4236G_1(x)=\left\{\begin{matrix}0.4236*1 &x<2.5 \\ 0.4236*(-1) & x>2.5 \end{matrix}\right.

sign[f_1(x)]=\left\{\begin{matrix}1 &x<2.5 \\ -1 & x>2.5 \end{matrix}\right.

第二个个体学习器:

 D2:

X0123456789
w20.071430.071430.071430.071430.071430.071430.166660.166660.166660.07143
y111-1-1-1111-1

(a)在权值分布为D2的训练数据上,阈值取8.5时分类误差率最低,其中3,4,5被分错,错分为正例(即将-1分为1),误差e2为:0.07143*3=0.2143(3,4,5权重之和)。

此时分类器为:G_2(x)=\left\{\begin{matrix}1 &x<8.5 \\ -1 & x>8.5 \end{matrix}\right.

 同理画出树:

 根据e2与公式\alpha _i=\frac{1}{2}log\frac{1-e_i}{e_i}\alpha _2=0.6496

 根据w*e^{-a_i*y*\hat{y}},求出w3:

w3=w2*np.e**(-a2*y*y_1)
w3=w3/w3.sum()
w3=np.round(w3,4)  
w3
  >>> [0.0455, 0.0455, 0.0455, 0.1666, 0.1666, 
       0.1666, 0.1061, 0.1061,0.1061, 0.0455]

 与D2对比,可以看到x=3,4,5的数据的权重变大了,而其他权重降低了。

此时f_2(x)=\alpha _1G_1(x)+\alpha _2G_2(x)=0.4236*G_1(x)+0.6496*G_2(x)

 f_2(x)=\left\{\begin{matrix}0.4236*1+0.6496*1=1.0732 &x<2.5 \\ 0.4236*(-1)+0.6496*1=0.226 &2.5<x<8.5 \\ 0.6496*(-1)=-0.6496 & x>8.5 \end{matrix}\right.

 即此时:sign[f_2(x)]=\left\{\begin{matrix}1 &x<8.5 \\ -1 & x>8.5 \end{matrix}\right.

 第三个个体学习器:

D3:

X0123456789
w30.04550.04550.04550.16660.16660.16660.10610.10610.10610.0455
y111-1-1-1111-1

在权值分布为D3的训练数据上,阈值取5.5时分类误差率最低,为e3=0.0455*4=0.1820,x=0,1,2,9被分类错误。

个体学习器为:G_3(x)=\left\{\begin{matrix}1 &x>5.5 \\ -1 & x<5.5 \end{matrix}\right.

 \alpha _3=0.7514

则更新训练数据的权值分布:

w4=w3*np.e**(-a3*y*y_2)
w4=np.round(w4/w4.sum(),4)
w4

>>> [0.125 , 0.125 , 0.125 , 0.1018, 0.1018, 0.1018, 0.0649, 0.0649, 0.0649, 0.125 ]

D4:

x0123456789
w40.1250.1250.1250.10180.10180.10180.06490.06490.06490.125
y111-1-1-1111-1

此时:

y_predict=a1*ada[0].predict(X)+a2*ada[1].predict(X)+a3*ada[2].predict(X)
y_predict

 >>> [ 0.3218, 0.3218, 0.3218, -0.5254, -0.5254, -0.5254, 0.9774, 0.9774, 0.9774, -0.3218]

np.sign(y_predict)
>>> [ 1.,  1.,  1., -1., -1., -1.,  1.,  1.,  1., -1.]

 由此看出输出与y一致。

参考文献:https://zhuanlan.zhihu.com/p/27126737

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Adaboost算法是一种集成学习方法,它通过组合多个弱分类器来构建一个强分类器。具体实现上,Adaboost算法会根据每个样本的权重进行迭代,每次迭代都会调整样本的权重以使分类器更加关注分错的样本。这样,每个弱分类器都能够针对分错的样本进行更好的分类,最终将它们结合起来形成一个强分类器。 另一种解释是,Adaboost算法可以视为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。这种解释对于理解提升树算法和BGDT算法等有很大帮助。 总结起来,Adaboost算法是一种集成学习方法,它通过组合多个弱分类器形成强分类器,具体实现上会根据样本的权重进行迭代调整,以使分类器更关注分错的样本。另外,Adaboost算法也可以被看作是加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [adaboost算法](https://download.csdn.net/download/yantingting000/9872105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [AdaBoost算法详解](https://blog.csdn.net/weixin_42385782/article/details/123242042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值