文章目录

  • 1. AdaBoost 算法简介
  • 2. AdaBoost算法 逻辑详解
    • 2.1 数据
    • 2.2 带权错误率
    • 2.3 损失函数 与 确定样本权重
    • 2.3 确定模型权重
    • 2.4 输出模型
  • 3.AdaBoost算法的python实现

1. AdaBoost 算法简介

Boosting是机器学习的三大框架之一,其特点是,训练过程中的诸多弱模型,彼此之间有着强依赖关系。Boost也被称为增强学习或提升法。典型的代表算法是AdaBoost算法。AdaBoost算法的核心思想是:将关注点放在预测错误的样本上。

AdaBoost 算法可以概括如下:

①假设共有m个样本数据,首先根据需求划分好训练集数据,按照一般思路,训练出第一个弱模型G1(x)G_1(x)G1​(x)。

②对第一个弱模型G1(x)G_1(x)G1​(x),计算该弱模型的分类错误率(或者说带权错误率,但是因为第一次迭代训练是均等权重的,所以第一次迭代的带权错误率等于普通的分类错误率)。
通过计算的分类错误率来确定该弱模型的权重,并更新训练集数据的权值分布。
(这里涉及两个权重不要弄混,先是模型权重,再是样本数据权重)
记模型G1(x)G_1(x)G1​(x)的权重为α1\alpha_1α1​,则F1(x)=0+α1G1(x)F_1(x)=0+\alpha_1G_1(x)F1​(x)=0+α1​G1​(x)(因为是第一次迭代,所以上一次可以暂记为0)。

③开始第二次迭代,使用更新后的样本权重再次训练一个弱模型,然后将该弱模型与上一次训练的弱模型G2(x)G_2(x)G2​(x),按照一定的规则得到的模型权重进行复合,F2(x)=F1(x)+α2G2(x)F_2(x)=F_1(x) + \alpha_2 G_2(x)F2​(x)=F1​(x)+α2​G2​(x)。
遂得到模型F2(x)F_2(x)F2​(x)。
这里的重点,就在于α1,α2\alpha_1,\alpha_2α1​,α2​等,这些模型的权重的确定。

④循环以上过程n次(从第二次开始,每次计算的模型错误率,是带权错误率)。
(n的值是自己指定的,希望的迭代次数)。
直到得到模型Fn(x)=Fn−1(x)+Gn(x)F_n(x)=F_{n-1}(x)+G_n(x)Fn​(x)=Fn−1​(x)+Gn​(x),即为AdaBoost算法的输出模型,此时的模型Fn(x)F_n(x)Fn​(x)是一个强训练模型。


2. AdaBoost算法 逻辑详解

按照以上思路,下边开始针对其中涉及的细节进行详解。

2.1 数据


首先要面对的,是数据。假设样本数据集D中共有m个样本,并表示如下:

          D={(x1,y1),(x2,y2),...,(xm,ym)}D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}D={(x1​,y1​),(x2​,y2​),...,(xm​,ym​)}

其中xix_ixi​是特征向量,yiy_iyi​是标签。标签的取值可以是1和-1。

AdaBoost算法每次训练模型的时候,使用的可以是从m个样本中抽样抽出的部分样本,但是预测的时候必须统一,测试集必须是固定的m个样本。


2.2 带权错误率

使用AdaBoost算法,每次训练完弱模型后,需要进一步计算出其带权错误率。
带权错误率的公式如下:
            εj=∑i=1mωijI{fj(x)≠yi}\varepsilon_j=\sum_{i=1}^m \omega_{ij}I\{f_j(x)≠y_i\}εj​=∑i=1m​ωij​I{fj​(x)=yi​}

如何理解这个式子:其中I()I()I()是指示函数,即,当括号内条件满足时值为1,当不满足条件时值为0。
这里括号内的条件,即表示对某样本的分类不正确。可以看出,预测错误的样本越多,该值则越大。

ωij\omega_{ij}ωij​即第j次迭代中的第i个样本的权重。
在第一次迭代中第一次训练弱模型时,每个样本的初始权重是均等的,均为1m\frac{1}{m}m1​。

即每个样本被选中的概率是均等的。AdaBoost算法首先基于该均等的权重训练一个简单的弱学习器。
且因为均等权重,在第一次迭代的输出的弱分类器的带权错误率,是刚好等于预测错误的个数在m个样本中所占的比重的。(即带权错误率等于普通的分类错误率)。


2.3 损失函数 与 确定样本权重

AdaBoost算法的损失函数为指数损失。

以第k次迭代为例,第k次迭代将得到模型Fk(x)=Fk−1(x)+αkG(x)F_k(x)=F_{k-1}(x)+\alpha_kG(x)Fk​(x)=Fk−1​(x)+αk​G(x),则
Fk(x)F_k(x)Fk​(x)的损失函数函数为:

     Loss=∑i=1me−yiFk(xi)Loss=\sum_{i=1}^me^{-y_iF_k(x_i)}Loss=∑i=1m​e−yi​Fk​(xi​)

     经简单分析,可以看出,对于每个样本
     若预测正确,则指数为负,损失只增加1e\frac{1}{e}e1​;
     若预测错误,则损失函数的损失会增加e。

 将该损失函数进行进一步展开得:

     Loss=∑i=1me−yiFk(xi)Loss=\sum_{i=1}^me^{-y_iF_k(x_i)}Loss=∑i=1m​e−yi​Fk​(xi​)

        =∑i=1me−yi(Fk−1(xi)+αkG(xi))=\sum_{i=1}^{m}e^{-y_i(F_{k-1}(x_i)+\alpha_kG(x_i))}=∑i=1m​e−yi​(Fk−1​(xi​)+αk​G(xi​))

        =∑i=1me−yiFk−1(xi)e−yiαkGk(xi)=\sum_{i=1}^me^{-y_iF_{k-1}(x_i)}e^{-y_i\alpha_kG_k(x_i)}=∑i=1m​e−yi​Fk−1​(xi​)e−yi​αk​Gk​(xi​)

因为LossLossLoss,即该表达式整体,表示的是模型Fk(x)F_k(x)Fk​(x)的损失,
e−yiαkGk(xi)e^{-y_i\alpha_kG_k(x_i)}e−yi​αk​Gk​(xi​)表示的则是第kkk次迭代中,新训练弱模型,样本和模型都加权后的损失。
e−yiFk−1(xi)e^{-y_iF_{k-1}(x_i)}e−yi​Fk−1​(xi​)表示的则是第k−1k-1k−1次迭代中得到的模型Fk−1F_{k-1}Fk−1​的损失。

鉴于AdaBoost算法是利用上一个弱分类器Fk−1F_{k-1}Fk−1​的准确率(或者说错误率) 和 模型权重来调整数据,以获得下一个分类器。继续观察该表达式,可以清晰地发现,模型FkF_kFk​的损失,等于模型GkG_kGk​乘以模型权重αk\alpha_kαk​后,并经过 以模型Fk−1F_{k-1}Fk−1​损失为度量尺度的样本权重的调节,后的损失。所以式子中的e−yiFk−1(xi)e^{-y_iF_{k-1}(x_i)}e−yi​Fk−1​(xi​)即可以理解为样本权重ωk,i\omega_{k,i}ωk,i​。

对于每一个样本,如果在上次迭代结果的模型Fk−1F_{k-1}Fk−1​中预测正确,则在第k次迭代中给予较小的样本权重;如果在上次迭代结果的模型Fk−1F_{k-1}Fk−1​中预测错误,则在第k次迭代的预测中给予较大的样本权重,这使得其在第k次迭代中预测的结果将拥有更大的话语权。如果再次预测错误将带来更大的损失。

 ωk,i=e−yiFk−1(xi)\omega_{k,i}=e^{-y_iF_{k-1}(x_i)}ωk,i​=e−yi​Fk−1​(xi​)这样的表示还尚不完美,因为要将其作为权重,就还需要进行归一化处理才好。

进一步将Fk−1F_{k-1}Fk−1​再展开可得到每次迭代的样本权重,与上次迭代样本权重之间的关系,并做归一化处理得:

        ωk,i=ωk−1,i⋅e−yiαk−1Gk−1(xi)Zt\omega_{k,i}=\frac{\omega_{k-1,i}· e^{-y_i\alpha_{k-1}G_{k-1}(x_i)}}{Z_t}ωk,i​=Zt​ωk−1,i​⋅e−yi​αk−1​Gk−1​(xi​)​

其中ZtZ_tZt​是归一化因子。这里的Zt=ek−1(1−ek−1)Z_t=\sqrt{e_{k-1}(1-e_{k-1})}Zt​=ek−1​(1−ek−1​)​,其中ek−1e_{k-1}ek−1​是第k-1次迭代分类的带权错误率。


可以看到该表达式中还有模型权重αk−1\alpha_{k-1}αk−1​需要进一步确定。


2.3 确定模型权重

模型权重的确定这一环节,涉及了较为麻烦的推导。这里只讨论逻辑,具体推导过程不再细究。
以第k次迭代为例,第k次迭代将得到模型Fk(x)=Fk−1(x)+αkG(x)F_k(x)=F_{k-1}(x)+\alpha_kG(x)Fk​(x)=Fk−1​(x)+αk​G(x),我们需要确定的是αk\alpha_kαk​的值。

以使得AdaBoost算法的损失函数Loss最小为目标,经过一系列麻烦的推导,最终得到
αk=12log⁡1−ekek\alpha_k=\frac{1}{2}\log{\frac{1-e_k}{e_k}}αk​=21​logek​1−ek​​

根据该表达式不难看出,分类误差率越大,则对应的弱分类器权重系数也就越小。
​___

2.4 输出模型

最终模型的表达式如下所示:

       Fn(x)=sign(∑k=1mαkGk(x))F_n(x)=sign(\sum_{k=1}^m\alpha_kG_k(x))Fn​(x)=sign(∑k=1m​αk​Gk​(x))

这里使用了符号函数sign,即若值大于0则表示标签1,小于0则表示标签-1。


3.AdaBoost算法的python实现

首先生成两组高斯分布的数据,用于模型训练和效果展示。

import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import make_gaussian_quantiles# 符合高斯分布,均值默认为0,方差为2,200个样本,2个特征,标签有2类,打乱
x1,y1 = make_gaussian_quantiles(cov=2,n_samples=200,n_features=2,n_classes=2,shuffle=True,random_state=1
)
# 满足高斯分布,两个特征,均值都为3,方差为1.5,300个样本数据,标签也有两个类别,打乱
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
)# 水平拼接:x1, x2
X = np.vstack((x1,x2))# 垂直拼接:标签值
y = np.hstack((y1,y2))

得到了有500个样本的数据集,该数据集有两个特征,标签取值有两种。特征数据为X,标签数据为y。
  


做数据可视化展示如下:

# 可视化
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

数据分布图像如下图所示:
             


然后训练模型:

# 基础模型 使用决策树分类器作为基础模型
from sklearn.tree import DecisionTreeClassifier
# 导入集成模型AdaBoostClassifier
from sklearn.ensemble import AdaBoostClassifier# 实例化弱模型 设置最大深度为2
weak_classifier = DecisionTreeClassifier(max_depth=2)# 集成模型 每次训练随机抽取300个样本,学习率为0.8
clf = AdaBoostClassifier(base_estimator=weak_classifier,algorithm="SAMME",n_estimators=300,learning_rate=0.8)
clf.fit(X,y)

为了更直观地展示模型在每个点处的效果,接下来我们绘制等高线图来呈现模型效果。
首先找出两个特征x1和x2的最小值和最大值,然后在原来的基础上分别减一、加一,来构建网格化数据。

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_new,x2_new = np.meshgrid(np.arange(x1_min,x1_max),np.arange(x2_min,x2_max))

做预测:

y_t = clf.predict(np.c_[x1_new.ravel(),x2_new.ravel()])

模型预测结果如下:
       
绘制等高线图,并填充色彩:

y_t = y_t.reshape(x1_new.shape)
plt.contourf(x1_new,x2_new,y_t)plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

输出图像效果如下:
             
如果对等高线图的绘制存在疑问,欢迎点击博客进行学习:实现 等高线图 - 基于python-matplotlib


本次分享就到这里,小啾感谢您的关注与支持!

AdaBoost算法详解及python实现【Python机器学习系列(十八)】相关推荐

  1. AdaBoost算法详解与python实现

    AdaBoost算法详解与python实现 https://tangshusen.me/2018/11/18/adaboost/

  2. Adaboost算法详解(haar人脸检测)

    转自:https://wizardforcel.gitbooks.io/dm-algo-top10/content/adaboost.html(脸书动不动上不去故转载)(主要看adaboost的例子. ...

  3. AdaBoost算法详解

    AdaBoost是集成学习Boosting思想的代表,目前对AdaBoost的解释有两种,下面对这两种解释分别进行说明. 解释一 adaboost算法的核心思想是:对于所有的样本我们先初始化一个权重, ...

  4. 真题详解(数字签名算法)-软件设计(七十八)

    真题详解(有限自动机)-软件设计(七十七)https://blog.csdn.net/ke1ying/article/details/130748759 可用于数字签名算法的是_____. 答案:非对 ...

  5. single-shot detection(SSD)目标检测算法详解——(一看就懂系列!!!)

    SSD是One-stage系列的优秀算法之一 one-stage的意思是挑选候选框和预测候选框两步是同时完成的,R-CNN家族都是two-stage. SSD有什么创新点? (1)基于Faster-R ...

  6. Unicode双向算法详解(bidi算法)(二)

    作者:黄邦勇帅(原名:黄勇)2019-10-17 Unicode双向算法详解(bidi算法)(二) 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文是对<C+ ...

  7. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  8. 基于多相滤波器的数字信道化算法详解(Python, Verilog代码已开源)

    基于多相滤波器的数字信道化算法详解 推导过程 总结 仿真 本文详细介绍了基于多相滤波器的数字信道化算法的推导过程, 如果您在阅读的过程中发现算法推导过程中有任何错误, 请不吝指出. 此外, 进入我的G ...

  9. 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现

    0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1)  在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...

最新文章

  1. SSD算法 模板 匹配
  2. linux脚本日期时间,Linux 日期和时间操作详解
  3. 使用WGAN生成手写字体
  4. linux文件内容打印成二进制,如何在二进制文件中只打印可打印字符(相当于Linux下的字符串)?...
  5. java ee ide 添加spring,如何在Eclipse IDE项目文件夹中为spring添加jar文件
  6. 【项目合作】方向任意的目标检测
  7. dubbo简易实现_分别利用自定义的注册中心和zookeeper
  8. linux ftdi 虚拟,linux – 由FTDI USB串行转换器创建的监控(嗅探)/ dev / ttyUSB0
  9. Hadoop The Definitive Guide:Hadoop权威指南-PART 1
  10. java手机视频下载_使用JAVA合并哔哩哔哩手机客户端下载的视频
  11. 工业级POE交换机、企业级交换机、普通交换机之间各区别?
  12. 老男孩教育老师的博客
  13. 苹果发布蓝牙耳机新固件,耳机Find My功能越发普及
  14. STC89C51单片机
  15. ios安装python的步骤,iOS常见砸壳方法
  16. clipboard.js
  17. Nginx服务器安装
  18. java win8 任务管理器_笔记本win8系统如何使用快捷键打开任务管理器
  19. TOI2008 大数运算
  20. C语言计算10年后我国国民生产总值与现在相比增长多少百分比

热门文章

  1. NLPIR系统自动构建知识图谱核查招标文件
  2. 数据分析项目实战之淘宝女装店铺销售分析(二)excel数据分析篇
  3. 用计算机键盘方法是,如何使用电脑键盘,从零开始学电脑的方法
  4. SHUOJ多项式构造
  5. ftp:connect:Connection refused
  6. 1.10 打造自带涨粉体质的小红书号,原来是有方法的【玩赚小红书】
  7. tls handshake timeout解决方案
  8. android 电池(二):android关机充电流程、充电画面显示【转】
  9. CSS基础--颜色、字体、背景、边框等
  10. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数