热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自适应增强(AdaptiveBoosting)

简介AdaBoost,是英文”AdaptiveBoosting“(自适应增强)的缩写,是一种迭代提升算法,其核
  • 简介

AdaBoost,是英文”Adaptive Boosting“(自适应增强)的缩写,是一种迭代提升算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。

它的自适应在于:其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。

 

  • 基本思想

AdaBoost 的核心就是不断迭代训练弱分类器,并计算弱分类器的权重。需要注意的是,弱分类器的训练依赖于样本权重。每一轮迭代的样本权重都不相同,依赖于弱分类器的权重值和上一轮迭代的样本权重。具体过程如下:

1、训练当前迭代最优弱分类器

  最优弱分类器是错误率最小的那个弱分类器。错误率的计算公式是:

  

  其中m = 1,2,..,M,代表第m轮迭代。i代表第i个样本。w 是样本权重。I指示函数取值为1或0,当I指示函数括号中的表达式为真时,I 函数结果为1;当I函数括号中的表达式为假时,I 函数结果为0。取错误率最低的弱分类器为当前迭代的最优弱分类器。

  第一轮迭代计算时样本权重初始化为总样本数分之一。

2、计算最优弱分类器的权重

  优弱分类器的权重只与该弱分类器的错误率有关。弱分类器的权重计算公式如下:

  

  可以看出,错误率越小,则 alpha 值越大,即该弱分类器的权重越高;反之,错误率越大,则 alpha 值越小,则该弱分类器的权重越小。这样可以使分类精度高的弱分类器起到更大的作用,并削弱精度低的弱分类器的作用。

3、根据错误率更新样本权重

  样本权重的更新与当前样本权重和弱分类器的权重有关。样本权重更新公式如下:

  

  其中m = 1,2,..,M,代表第 m 轮迭代。i代表第i个样本。w 是样本权重。alpha 是弱分类器的权重。当样本被正确分类时,y 和 Gm 取值一致,则新样本权重变小;当样本被错误分类时,y 和 Gm 取值不一致,则新样本权重变大。这样处理,可以使被错误分类的样本权重变大,从而在下一轮迭代中得到重视。

4、迭代终止条件

  不断重复1,2,3步骤,直到达到终止条件为止。终止条件是强分类器的错误率低于最低错误率阈值或达到最大迭代次数。

 

  • 举例说明

数据集如表:

X012345
Y11-1-11-1

 

 

第一轮迭代

 

1、选择最优弱分类器

第一轮迭代时,样本权重初始化为(0.167, 0.167, 0.167, 0.167, 0.167, 0.167)。即1/6

表1数据集的切分点有0.5, 1.5, 2.5, 3.5, 4.5

若按0.5切分数据&#xff0c;得弱分类器x <0.5,则 y &#61; 1; x > 0.5, 则 y &#61; -1。此时错误率为2 * 0.167 &#61; 0.334

若按1.5切分数据&#xff0c;得弱分类器x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。此时错误率为1 * 0.167 &#61; 0.167

若按2.5切分数据&#xff0c;得弱分类器x <2.5,则 y &#61; 1; x > 2.5, 则 y &#61; -1。此时错误率为2 * 0.167 &#61; 0.334

若按3.5切分数据&#xff0c;得弱分类器x <3.5,则 y &#61; 1; x > 3.5, 则 y &#61; -1。此时错误率为3 * 0.167 &#61; 0.501

若按4.5切分数据&#xff0c;得弱分类器x <4.5,则 y &#61; 1; x > 4.5, 则 y &#61; -1。此时错误率为2 * 0.167 &#61; 0.334

由于按1.5划分数据时错误率最小为0.167&#xff0c;则最优弱分类器为x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。

 

2、计算最优弱分类器的权重

alpha &#61; 0.5 * ln((1 – 0.167) / 0.167) &#61; 0.8047

 

3、更新样本权重

x &#61; 0, 1, 2, 3, 5时&#xff0c;y分类正确&#xff0c;则样本权重为&#xff1a;

0.167 * exp(-0.8047) &#61; 0.075

x &#61; 4时&#xff0c;y分类错误&#xff0c;则样本权重为&#xff1a;

0.167 * exp(0.8047) &#61; 0.373

新样本权重总和为0.075 * 5 &#43; 0.373 &#61; 0.748

规范化后&#xff0c;

x &#61; 0, 1, 2, 3, 5时&#xff0c;样本权重更新为&#xff1a;

0.075 / 0.748 &#61; 0.10

x &#61; 4时, 样本权重更新为&#xff1a;

0.373 / 0.748 &#61; 0.50

综上&#xff0c;新的样本权重为(0.1, 0.1, 0.1, 0.1, 0.5, 0.1)。

此时强分类器为G(x) &#61; 0.8047 * G1(x)。G1(x)为x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。则强分类器的错误率为1 / 6 &#61; 0.167。

 

第二轮迭代

 

1、选择最优弱分类器

若按0.5切分数据&#xff0c;得弱分类器x > 0.5,则 y &#61; 1; x <0.5, 则 y &#61; -1。此时错误率为0.1 * 4 &#61; 0.4

若按1.5切分数据&#xff0c;得弱分类器x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。此时错误率为1 * 0.5 &#61; 0.5

若按2.5切分数据&#xff0c;得弱分类器x > 2.5,则 y &#61; 1; x <2.5, 则 y &#61; -1。此时错误率为0.1 * 4 &#61; 0.4

若按3.5切分数据&#xff0c;得弱分类器x > 3.5,则 y &#61; 1; x <3.5, 则 y &#61; -1。此时错误率为0.1 * 3 &#61; 0.3

若按4.5切分数据&#xff0c;得弱分类器x <4.5,则 y &#61; 1; x > 4.5, 则 y &#61; -1。此时错误率为2 * 0.1 &#61; 0.2

由于按4.5划分数据时错误率最小为0.2&#xff0c;则最优弱分类器为x <4.5,则 y &#61; 1; x > 4.5, 则 y &#61; -1。

 

2、计算最优弱分类器的权重

alpha &#61; 0.5 * ln((1 –0.2) / 0.2) &#61; 0.6931

 

3、更新样本权重

x &#61; 0, 1, 5时&#xff0c;y分类正确&#xff0c;则样本权重为&#xff1a;

0.1 * exp(-0.6931) &#61; 0.05

x &#61; 4 时&#xff0c;y分类正确&#xff0c;则样本权重为&#xff1a;

0.5 * exp(-0.6931) &#61; 0.25

x &#61; 2,3时&#xff0c;y分类错误&#xff0c;则样本权重为&#xff1a;

0.1 * exp(0.6931) &#61; 0.20

新样本权重总和为 0.05 * 3 &#43; 0.25 &#43; 0.20 * 2 &#61; 0.8

规范化后&#xff0c;

x &#61; 0, 1, 5时&#xff0c;样本权重更新为&#xff1a;

0.05 / 0.8 &#61; 0.0625

x &#61; 4时, 样本权重更新为&#xff1a;

0.25 / 0.8 &#61; 0.3125

x &#61; 2, 3时, 样本权重更新为&#xff1a;

0.20 / 0.8 &#61; 0.250

综上&#xff0c;新的样本权重为(0.0625, 0.0625, 0.250, 0.250, 0.3125, 0.0625)。

此时强分类器为G(x) &#61; 0.8047 * G1(x) &#43; 0.6931 * G2(x)。G1(x)为x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。G2(x)为x <4.5,则 y &#61; 1; x > 4.5, 则 y &#61; -1。

按G(x)分类会使x&#61;4分类错误&#xff0c;则强分类器的错误率为1 / 6 &#61; 0.167。

 

第三轮迭代

 

1、选择最优弱分类器

若按0.5切分数据&#xff0c;得弱分类器x <0.5,则 y &#61; 1; x > 0.5, 则 y &#61; -1。此时错误率为0.0625 &#43; 0.3125 &#61; 0.375

若按1.5切分数据&#xff0c;得弱分类器x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。此时错误率为1 * 0.3125 &#61; 0.3125

若按2.5切分数据&#xff0c;得弱分类器x > 2.5,则 y &#61; 1; x <2.5, 则 y &#61; -1。此时错误率为0.0625 * 2 &#43; 0.250 &#43; 0.0625 &#61; 0.4375

若按3.5切分数据&#xff0c;得弱分类器x > 3.5,则 y &#61; 1; x <3.5, 则 y &#61; -1。此时错误率为0.0625 * 3 &#61; 0.1875

若按4.5切分数据&#xff0c;得弱分类器x <4.5,则 y &#61; 1; x > 4.5, 则 y &#61; -1。此时错误率为2 * 0.25 &#61; 0.5

由于按3.5划分数据时错误率最小为0.1875&#xff0c;则最优弱分类器为x > 3.5,则 y &#61; 1; x <3.5, 则 y &#61; -1。

 

2、计算最优弱分类器的权重

alpha &#61; 0.5 * ln((1 –0.1875) / 0.1875) &#61; 0.7332

 

3、更新样本权重

x &#61; 2, 3时&#xff0c;y分类正确&#xff0c;则样本权重为&#xff1a;

0.25 * exp(-0.7332) &#61; 0.1201

x &#61; 4 时&#xff0c;y分类正确&#xff0c;则样本权重为&#xff1a;

0.3125 * exp(-0.7332) &#61; 0.1501

x &#61; 0, 1, 5时&#xff0c;y分类错误&#xff0c;则样本权重为&#xff1a;

0.0625 * exp(0.7332) &#61; 0.1301

新样本权重总和为 0.1201 * 2 &#43; 0.1501 &#43; 0.1301 * 3 &#61; 0.7806

规范化后&#xff0c;

x &#61; 2, 3时&#xff0c;样本权重更新为&#xff1a;

0.1201 / 0.7806 &#61; 0.1539

x &#61; 4时, 样本权重更新为&#xff1a;

0.1501 / 0.7806 &#61; 0.1923

x &#61; 0, 1, 5时, 样本权重更新为&#xff1a;

0.1301 / 0.7806 &#61; 0.1667

综上&#xff0c;新的样本权重为(0.1667, 0.1667, 0.1539, 0.1539, 0.1923, 0.1667)。

 

此时强分类器为G(x) &#61; 0.8047 * G1(x) &#43; 0.6931 * G2(x) &#43; 0.7332 * G3(x)。

G1(x)为x <1.5,则 y &#61; 1; x > 1.5, 则 y &#61; -1。

G2(x)为x <4.5,则 y &#61; 1; x > 4.5, 则 y &#61; -1。

G3(x)为x > 3.5,则 y &#61; 1; x <3.5, 则 y &#61; -1。

按G(x)分类所有样本均分类正确&#xff0c;则强分类器的错误率为0 / 6 &#61; 0&#xff0c;则停止迭代。

最终强分类器为G(x) &#61; 0.8047 * G1(x) &#43; 0.6931 * G2(x) &#43; 0.7332 * G3(x)。

 

  • 代码实现

环境&#xff1a;MacOS mojave  10.14.3

Python  3.7.0

使用库&#xff1a;scikit-learn    0.19.2

sklearn.ensemble.AdaBoostClassifier官方库&#xff1a;https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html

 

AdaBoost.py  主程序和算法

import matplotlib.pyplot as plt
from prep_terrain_data import makeTerrainData
from class_vis import prettyPicturefeatures_train, labels_train, features_test, labels_test &#61; makeTerrainData()### the training data (features_train, labels_train) have both "fast" and "slow"
#
## points mixed together--separate them so we can give them different colors
#
## in the scatterplot and identify them visually
grade_fast &#61; [features_train[ii][0] for ii in range(0, len(features_train)) if labels_train[ii]&#61;&#61;0]
bumpy_fast
&#61; [features_train[ii][1] for ii in range(0, len(features_train)) if labels_train[ii]&#61;&#61;0]
grade_slow
&#61; [features_train[ii][0] for ii in range(0, len(features_train)) if labels_train[ii]&#61;&#61;1]
bumpy_slow
&#61; [features_train[ii][1] for ii in range(0, len(features_train)) if labels_train[ii]&#61;&#61;1]#### initial visualization
plt.xlim(0.0, 1.0)
plt.ylim(
0.0, 1.0)
plt.scatter(bumpy_fast, grade_fast, color
&#61; "b", label&#61;"fast")
plt.scatter(grade_slow, bumpy_slow, color
&#61; "r", label&#61;"slow")
plt.legend()
plt.xlabel(
"bumpiness")
plt.ylabel(
"grade")################################################################################### your code here! name your classifier object clf if you want the
#
## visualization code (prettyPicture) to show you the decision boundary
from sklearn.ensemble import AdaBoostClassifierclf &#61; AdaBoostClassifier(n_estimators&#61;100)
clf.fit(features_train,labels_train)prettyPicture(clf, features_test, labels_test)
accuracy
&#61; clf.score(features_test, labels_test)
print (accuracy)plt.show()

 

class_vis.py  绘图与保存图像

import numpy as np
import matplotlib.pyplot as plt
import pylab as pldef prettyPicture(clf, X_test, y_test):x_min &#61; 0.0; x_max &#61; 1.0y_min &#61; 0.0; y_max &#61; 1.0# Plot the decision boundary. For that, we will assign a color to each# point in the mesh [x_min, m_max]x[y_min, y_max].h &#61; .01 # step size in the meshxx, yy &#61; np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))Z &#61; clf.predict(np.c_[xx.ravel(), yy.ravel()])# Put the result into a color plotZ &#61; Z.reshape(xx.shape)plt.xlim(xx.min(), xx.max())plt.ylim(yy.min(), yy.max())plt.pcolormesh(xx, yy, Z, cmap&#61;pl.cm.seismic)# Plot also the test pointsgrade_sig &#61; [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;0]bumpy_sig &#61; [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;0]grade_bkg &#61; [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;1]bumpy_bkg &#61; [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;1]plt.scatter(grade_sig, bumpy_sig, color &#61; "b", )plt.scatter(grade_bkg, bumpy_bkg, color &#61; "r",)plt.legend()plt.xlabel("bumpiness")plt.ylabel("grade")plt.savefig("test.png")

 

perp_terrain_data.py  生成训练点

import randomdef makeTerrainData(n_points&#61;1000):
###############################################################################
#
## make the toy datasetrandom.seed(42)grade &#61; [random.random() for ii in range(0,n_points)]bumpy &#61; [random.random() for ii in range(0,n_points)]error &#61; [random.random() for ii in range(0,n_points)]y &#61; [round(grade[ii]*bumpy[ii]&#43;0.3&#43;0.1*error[ii]) for ii in range(0,n_points)]for ii in range(0, len(y)):if grade[ii]>0.8 or bumpy[ii]>0.8:y[ii] &#61; 1.0### split into train/test setsX &#61; [[gg, ss] for gg, ss in zip(grade, bumpy)]split &#61; int(0.75*n_points)X_train &#61; X[0:split]X_test &#61; X[split:]y_train &#61; y[0:split]y_test &#61; y[split:]grade_sig &#61; [X_train[ii][0] for ii in range(0, len(X_train)) if y_train[ii]&#61;&#61;0]bumpy_sig &#61; [X_train[ii][1] for ii in range(0, len(X_train)) if y_train[ii]&#61;&#61;0]grade_bkg &#61; [X_train[ii][0] for ii in range(0, len(X_train)) if y_train[ii]&#61;&#61;1]bumpy_bkg &#61; [X_train[ii][1] for ii in range(0, len(X_train)) if y_train[ii]&#61;&#61;1]training_data &#61; {"fast":{"grade":grade_sig, "bumpiness":bumpy_sig}, "slow":{"grade":grade_bkg, "bumpiness":bumpy_bkg}}grade_sig &#61; [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;0]bumpy_sig &#61; [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;0]grade_bkg &#61; [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;1]bumpy_bkg &#61; [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]&#61;&#61;1]test_data &#61; {"fast":{"grade":grade_sig, "bumpiness":bumpy_sig}, "slow":{"grade":grade_bkg, "bumpiness":bumpy_bkg}}return X_train, y_train, X_test, y_test

 

得到结果&#xff0c;正确率为92.4%

 

Adaboost的参数

n_estimators表示迭代的次数

n_estimators分别为100、1000、10000时&#xff1a;

 

正确率分别为&#xff1a;92.4%  91.6%  92%

 可以看出迭代次数越大&#xff0c;过拟合现象越严重&#xff0c;但正确率并无明显变化&#xff0c;编译时间略微增加。

 

  • AdaBoost优缺点

 优点&#xff1a;

1、可以将不同的分类算法作为弱分类器。

2、AdaBoost充分考虑的每个分类器的权重。

 

缺点&#xff1a;

1、AdaBoost迭代次数也就是弱分类器数目不太好设定。

2、数据不平衡导致分类精度下降。

3、训练比较耗时&#xff0c;

 

转:https://www.cnblogs.com/Joeric07/p/10428350.html



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • 感谢大家对IT十八掌大数据的支持,今天的作业如下:1.实践PreparedStament的CRUD操作。2.对比Statement和PreparedStatement的大批量操作耗时?(1 ... [详细]
  • 完成字符串和时间对象的转化(DateFormat)、(以及日历Calendar用法)
    DateFormat 和SimpleDateFormat示例(时间格式的书写)packagecn.date;importjava.text.DateFormat;importjav ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
author-avatar
mobiledu2502881853
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有