热门标签 | 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



推荐阅读
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Highcharts翻译系列之二十:曲线图例子(二)
    Highcharts翻译系列之二十:曲线图例子(二)代码 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • skia~setDIBitsToDevice~Windows
    问题:skia是一个图形库,本身没有在设备上作图的能力,可以通过提供的SkView类,参考实现对不同平台设备上作画。SkOsWindow_Win.cpp:onPaint方法中提供了 ... [详细]
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社区 版权所有