专栏首页Python编程和深度学习机器学习系列(六)Adaboost

机器学习系列(六)Adaboost

机器学习系列(六)Adaboost 前面我们已经介绍了几种不同的分类器,每种分类器都各有优缺点,我们可以借助集成学习的方法将不同的分类器组合起来,将多个弱可学习分类器集成组合成一个强可学习分类器。 集成方法有几种形式: 1) 不同算法的集成 2) 相同算法的不同设置的集成 3) 不同分类器处理不同数据集部分的集成 集成方法主要包括Bagging和Boosting两种方法,

内容目录

1 Bagging方法:2 Boosting方法:3 Bagging和Boosting的区别4 AdaBoost基本原理介绍5 AdaBoost优点和缺点5 Python代码

1 Bagging方法:

自举汇聚法(bootstap aggregating),通过对训练数据进行有放回的采样(自举采样bootstap sampling),弱学习器之间没有依赖关系。 算法步骤: 1) 在训练数据集中采用自举采样方法提取n个训练样本,经过k次提取之后得到k个训练集,每个训练集中有n个样本,由于是有放回的采样,所以有的样本会被多次取到,有的样本可能从来没有被取到。 2) K个训练集经过弱学习器得到k个学习模型 3) 对k个模型的预测结果采用投票的方式得到最终的分类结果,如果是回归模型,可以取平均值或加权平均值。 Bagging方法最流行的是随机森林(random forest),是由Bagging方法和决策树结合。

2 Boosting方法:

Boosting方法的思想是采用重赋权(re-weighting)法迭代地训练弱学习器, 算法步骤: 1) 首先给每个样本赋予一个初始权重值1/m,m为样本数量 2) 开始训练第一个弱学习器,根据该弱学习器的错误率更新权重,给错误率高的训练样本的权重值变高,在下一次学习中得到更多重视 3) 依次训练之后多每个弱学习器,并不断迭代更新权重 4) 对最终的k个弱学习器结果进行整合 Boosting方法最流行的是Adaboost

3 Bagging和Boosting的区别

1)样本选择: Bagging:每次训练的数据集是有放回选取的,它们之间是相互独立的。 Boosting:每次训练的的数据集不变,但每个样例在学习器中的权重发生变化。而权值是根据上一轮的学习结果进行更新。 2)样本权重: Bagging:使用均匀取样,每个样本的权重相同。 Boosting:每个样本的权重不同,根据错误率不断调整样本的权值,错误率越高则权重越大。 3)预测结果权重: Bagging:所有预测结果的权重相等。 Boosting:每个弱学习器都有不同的权重,对于分类误差小的分类器会有更大的权重。 4)计算方式: Bagging:各个学习器可以并行生成,互不影响。 Boosting:各个学习器只能顺序生成,因为后一个模型参数需要基于前一轮模型的结果进行调整

4 AdaBoost基本原理介绍

AdaBoost(Adaptive boosting)是基于Boosting思想的迭代算法,输入样本为

,详细的算法描述如下:

1 初始化所有训练数据的权重分布:

2 迭代训练弱学习器,并不断更新权重,第m个弱学习器的样本权重为Dm,输出值为{-1,1}, 2.1 计算弱分类器在训练集上的分类错误率,值越小其在最终分类器的作用越大

的取值为0时表示分类正确,取值为1表示分类错误。

2.2计算弱学习器的权重系数,当错误率降低的时候权重系数会增大,错误率越小,对最终的预测影响就越大。

2.3更新训练数据集的样本权重,

式中,Zm是规范化因子,将Wmi的值规范化到0-1之间,使得

。对于二分类算法,弱分类器

的输出值为{-1,1},类别标签yi的取值为{-1,1},如果样本被正确分类,

取值较小,相反如果样本分类错误,

取值较大,则权重变高,在之后的训练过程中会得到更多的重视。

3 多个弱学习器的结合 Adaboost对于弱学习器的结合策略是加权平均,

那么最终的分类器为:

5 AdaBoost优点和缺点

优点 (1)算法集成了众多机器学习算法构建的弱分类器,不容易发生过拟合; (2)相对于bagging算法和Random Forest算法,AdaBoost充分考虑的每个分类器的权重,可以取得较高的准确性; (3)AdaBoost的训练参数很少,不需要调节太多的参数。 缺点 (1)由于AdaBoost是集成学习方法,其迭代次数基于弱分类器数目,因此迭代次数难以设定,可以使用交叉验证来进行确定。 (2)由于需要迭代所有分类器,因此训练比较耗时。 (3)对异常样本噪声敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性,同时数据正负样本不均衡也会导致实际准确性下降。 Adaboost分类器结构

5 Python代码

一个简单实例,来自飘涯,

#-*- conding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn.ensemble import AdaBoostClassifier#adaboost引入方法
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles#造数据
## 设置属性防止中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
## 创建数据
X1, y1 = make_gaussian_quantiles(cov=2.,
                                 n_samples=200, n_features=2,
                                 n_classes=2, random_state=1)#创建符合高斯分布的数据集
X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5,
                                 n_samples=300, n_features=2,
                                 n_classes=2, random_state=1)

X = np.concatenate((X1, X2))
y = np.concatenate((y1, - y2 + 1))
plot_step = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                     np.arange(y_min, y_max, plot_step))
#构建adaboost模型
bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),
                         algorithm="SAMME.R",#可以不写
                         n_estimators=200)
#数据量大的时候,可以增加内部分类器的树深度,也可以不限制树深
#max_depth树深,数据量大的时候,一般范围在10——100之间
#数据量小的时候,一般可以设置树深度较小,或者n_estimators较小
#n_estimators 迭代次数或者最大弱分类器数:200次
#base_estimator:DecisionTreeClassifier 选择弱分类器,默认为CART树
#algorithm:SAMME 和SAMME.R 。运算规则,后者是优化算法,以概率调整权重,迭代速度快,
#需要能计算概率的分类器支持
#learning_rate:0<v<=1,默认为1,正则项 衰减指数
#loss:linear、‘square’exponential’。误差计算公式:一般用linear足够
bdt.fit(X, y)

#预测
Z = bdt.predict(np.c_[xx.ravel(), yy.ravel()])
#设置维度
Z = Z.reshape(xx.shape)
## 画图
plot_colors = "br"
class_names = "AB"

plt.figure(figsize=(10, 5), facecolor='w')
#局部子图
plt.subplot(121)
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
for i, n, c in zip(range(2), class_names, plot_colors):
    idx = np.where(y == i)
    plt.scatter(X[idx, 0], X[idx, 1],
                c=c, cmap=plt.cm.Paired,
                label=u"类别%s" % n)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.legend(loc='upper right')
plt.xlabel('x')
plt.ylabel('y')
plt.title(u'AdaBoost分类结果,正确率为:%.2f%%' % (bdt.score(X, y) * 100))

#获取决策函数的数值
twoclass_output = bdt.decision_function(X)
#获取范围
plot_range = (twoclass_output.min(), twoclass_output.max())
plt.subplot(122)
for i, n, c in zip(range(2), class_names, plot_colors):
#直方图
    plt.hist(twoclass_output[y == i],
             bins=20,
             range=plot_range,
             facecolor=c,
             label=u'类别 %s' % n,
             alpha=.5)
x1, x2, y1, y2 = plt.axis()
plt.axis((x1, x2, y1, y2 * 1.2))
plt.legend(loc='upper right')
plt.ylabel(u'样本数')
plt.xlabel(u'决策函数值')
plt.title(u'AdaBoost的决策值')

plt.tight_layout()
plt.subplots_adjust(wspace=0.35)
plt.show()

结果如下:

———————————————— 参考: 李航,《统计学习方法》 第八章 https://blog.csdn.net/qq_24519677/java/article/details/81910112 https://www.jianshu.com/p/b86a0863fe45

本文分享自微信公众号 - Python编程和深度学习(Python_Deeplearning),作者:Python编程和深度学习

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GAN的发展系列二(PGGAN、SinGAN)

    在前面的文章里我们已经介绍了GAN生成对抗网络的入门和一些GAN系列,在之后的专辑里会继续介绍一些比较经典的GAN。

    Minerva
  • 数字图像处理灰度变换之对数变换、伽马变换及python实现

    其中,c是一个常数,对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩...

    Minerva
  • BBN:长尾视觉识别模型(CVPR 2020)

    今天分享一篇发表在CVPR 2020上的论文:BBN: Bilateral-Branch Network with Cumulative Learning fo...

    Minerva
  • Elasticsearch倒排索引结构

    倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value...

    物流IT圈
  • 机器学习(二十五) ——adaboost算法与实现

    机器学习(二十五)——adaboost算法与实现 (原创内容,转载请注明来源,谢谢) 一、概述 当进行监督学习时,除了使用某个分类器外,还可以将各个分类器结...

    用户1327360
  • 区块链的泡沫要破了吗?纵观市场未来走向!

    近来网上流传着下面这样一幅图,将比特币与历史上的经典泡沫走势进行对比,认为比特币泡沫已经破灭,价格将一去不再回头。同样,2017年年底突然兴起的区块链热也与来时...

    区块链领域
  • SpringMVC接收数组

    后台写@RequestParam("img_array[]") String[] img_array

    試毅-思伟
  • 2.linux基础优化 1.linux系统的基础优化2.vmware克隆

    zhang_derek
  • 学点http、tch协议,不用多一点就行

    今天群里有同学分享了一个文章,文中说面试的时候,来的人连http协议是啥都不知道,就这样还要16K, 18K的,怎么说的出口,反正文笔很酸爽。 其实,我也不太...

    web前端教室
  • 学点http、tcp,几句话的事儿

    今天群里有同学分享了一个文章,文中说面试的时候,来的人连http协议是啥都不知道,就这样还要16K, 18K的,怎么说的出口,反正文笔很酸爽。

    web前端教室

扫码关注云+社区

领取腾讯云代金券