AdaBoost算法

1、AdaBoost算法

1)Boosting提升算法

Boosting算法是将“弱学习算法”提升为“强学习算法”。其主要涉及两个部分,加法模型和前向分步算法。加法模型就是说强分类器由弱分类器线性相加而成。一般组合形式如下:

                                                                    F_{M}(x;P)=\sum_{m=1}^{n}\beta _{m}h(x;\alpha _{m})

 

其中,h(x;\alpha _{m})就是一个个的弱分类器,\alpha _{m}是弱分类器学习到的最优参数,\beta _{m}就是弱分类器在强分类器中所占比重,P是所有\alpha _{m}\beta _{m}的组合。

前向分布算法是指在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的,可以写成如下的形式:

                                                                F_{m}(x)=F_{m-1}(x)+\beta _{m}h_{m}(x;\alpha _{m})

由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数函数的Boosting算法。

2)AdaBoost原理解释

基于Boosting的理解,对于AdaBoost,需要清楚两点:

(1) 每一次迭代的弱学习h(x;\alpha _{m})有何不一样,如何学习?

(2) 弱分类器权值\beta _{m}如何确定?

(1) AdaBoost改变了训练数据的权值,也就是样本的概率分布,其思想是将关注点放在被错误分类的样本上,减少上一轮被正确分类的样本权值,提高那些被错误分类的样本权值。然后,根据所采用的基本机器学习算法进行学习。

(2) AdaBoost采用加权多数表决的方法,加大分类误差率小的弱分类器的权重,减小分类误差率大的弱分类器的权重。

3)实例

有如下的训练样本,我们需要构建强分类器对其进行分类。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,j}=0.1,i=1,2,...,10

现在开始训练第一个弱分类器。我们发现阈值取2.5时分类误差率最低,得到弱分类器为:

                                                      G_{1}(x)=\left\{\begin{matrix} 1 &x<2.5 \\ -1&x\geqslant 2.5 \end{matrix}\right.

此处亦可以用其他的弱分类器,只要误差率最低即可。这里用了分段函数,得到了分类误差率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 _{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))

4) 算法流程

AdaBoost算法流程:

输入:训练数据集T=\begin{Bmatrix} (x_{1},y_{1}),(x_{2},y_{2}),...,(x_{N},y_{N}) \end{Bmatrix},其中,x_{i}\in X\subseteq R^{n},y_{i}\in Y=\begin{Bmatrix} 1,-1 \end{Bmatrix},迭代次数M;

step1: 初始化训练样本的权值分布:D_{1}=(w_{1,1},w_{1,2},...,w_{1,i}),w_{1,i}=\frac{1}{N},i=1,2,...,N

step2: 对于m=1,2,....M

           a) 使用具有权值分布D_{m}的训练数据集进行学习,得到弱分类器 G_{m}(x)

           b)  计算G_{m}(x)在训练数据集上的分类误差率:e{_m}=\sum_{i=1}^{M}w_{m,j}I(G_{m}(x_{i})\neq 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 _{m}y_{i}G_{m}(x_{i})),i=1,2,...,10

                                                                               z_{m}=\sum_{i=1}^{N}w_{m,i}exp(-\alpha _{m}y_{i}G_{m}(x_{i}))

step3: 得到最终分类器:

                                                                         F(x)=sign(\sum_{i=1}^{N}\alpha _{m}G_{m}(x))

公式推导:

(原文链接:请戳

更详细的案例实现过程:请戳链接

2、AdaBoost实现之sklearn

例子:鸢尾花例子

"""
在scikit-learn库中,有AdaBoostRegression(回归)和AdaBoostClassifier(分类)两个
在对和AdaBoostClassifier进行调参时,主要是对两部分进行调参:1)AdaBoost框架调参;2)弱分类器调参"""
# 导包
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
#载入数据,sklearn中自带的iris数据集
"""
AdaBoostClassifier参数解释
base_estimator:弱分类器,默认是CART分类树: DecisionTreeClassifier
algorithm: 在scikit-learn实现了两种AdaBoost分类算法,即SAMME和SAMME.R,
           SAMME就是原理篇介绍到的AdaBoost分类算法,指Discrete AdaBoost
           SAME.R指Real AdaBoost,返回值不再是离散的类型,而是一个表示概率的实数值,算法流程见后         文,两者的主要区别是弱分类器权重的度量,SAMME使用了分类效果作为弱分类器权重,SAMME.R使用了预测概率作为弱分类器权重。
           SAMME.R的迭代一般比SAMME快,默认算法是SAMME.R。因此,base_estimator必须使用支持概率预测的分类器。
loss: 这个只在回归中用到
n_estimator: 最大迭代次数,默认50.在实际调参过程中,常常将n_estimator和学习率learning_rate一起考虑
learning_rate: 每个弱分类器的权重缩减系数v。f_k(x)=f_{k-1}*a_k*G_k(x).
"""

SAMME.R算法流程

step1: 初始化样本权值:w_{i}=1/N,i=1,2,...,N

step2: Repeat for m=1,2,...,M:

           a) 训练一个弱分类器,得到样本的类别预测概率分布p_{m}(x)=P(y=1|x)\subseteq [0,1]

           b) f_{m}(x)=\frac{1}{2}log\frac{p_{m}}{1-p_{m}}

           c) w_{i}=w_{i}exp[-y_{i}f_{m}(x_{i})],同时,要进行归一化使得权重和为1

step3:得到强分类模型:sign\Sigma _{m=1}^{M}f_{m}(x)

AdaBoostClassifier类

关于AdaBoostClassifier:  sklearn.ensemble.AdaBoostClassifier的构造函数如下:

AdaBoostClassifier(base_estimator=None,n_estimators=50,learning_rate=1.0,algorithm='SAMME.R',random_state=None)

demo实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
# 用make_gaussian_quantiles生成多组多维正太分布的数据
x1,y1 = make_gaussian_quantiles(cov=2.,n_samples=200,n_features=2,n_classes=2,shuffle=True,random_state=1)
 x2,y2 = make_gaussian_quantiles(mean=(3,3),cov=1.5,n_samples=300,n_features=2,n_classes=2,shuffle=True,random_state=1)
X = np.vstack((x1,x2))
y = np.hstack((y1,1-y2))
weakClassifier = DecisionTreeClassifier(max_depth=1)
clf = AdaBoostClassifier(base_estimator=weakClassifier,algorithm='SAMME',n_estimators=300,learning_rate=0.8)
clf.fit(X,y)
x1_min = X[:,0].min()-1
x1_max = X[:,0].max()+1
x2_min = X[:,1].min()-1
x2_max = X[:,1].max()+1
x1_,x2_ = np.meshgrid(np.arange(x1_min,x1_max,0.02),np.arange(x2_min,x2_max,0.02))
y_ = clf.predict(np.c_[x1_.ravel(),x2_.ravel()])
plt.contourf(x1_,x2_,y_,cmap=plt.cm.Paired)
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

(原文链接:请戳

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值