机器学习(13)——adaboostAdaboost

前言:下面介绍另外一种集成算法思想—boosting,提升学习(Boosting)是一种机器学习技术,可以用于回归和分类的问题,它 每一步产生弱预测模型(如决策树),并加权累加到总模型中;如果每一步的弱预 测模型的生成都是依据损失函数的梯度方式的,那么就称为梯度提升(Gradient boosting); 提升技术的意义:如果一个问题存在弱预测模型,那么可以通过提升技术的办法 得到一个强预测模型; 常见的模型有: Adaboost Gradient Boosting(GBT/GBDT/GBRT)

Adaboost

Adaptive Boosting是一种迭代算法。每轮迭代中会在训练集上产生一个新的学 习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性 (Informative)。换句话来讲就是,算法会为每个样本赋予一个权重,每次用训练 好的学习器标注/预测各个样本,如果某个样本点被预测的越正确,则将其权重 降低;否则提高样本的权重。权重越高的样本在下一个迭代训练中所占的比重就 越大,也就是说越难区分的样本在训练过程中会变得越重要; 整个迭代过程直到错误率足够小或者达到一定的迭代次数为止。 注意:是给样本增加权重,样本加权的过程可以如下图所示:

image.png

算法原理

Adaboost算法将基分类器的线性组合作为强分类器,同时给分类误差率较小的 基本分类器以大的权值,给分类误差率较大的基分类器以小的权重值;构建的线 性组合为:

最终分类器是在线性组合的基础上进行Sign函数转换:

为什么进行转化呢?因为得到的线性组合是个连续的值,必须进行转化才能进行分类操作。

Sign函数如下图所示:

为了使得预测的结果尽量可能正确,则写出损失函数,损失函数为当预测失败的时候I函数加一,损失函数如下:

构建的学习器如下:

带入上述损失函数公式,求得最终损失函数为:

为了使损失函数最小,对上述式子进行化简,然后分别对其未知变量求偏导,可以解的未知变量,也就是前面所说的权重,求解过程如下:

最终解得:

其中参数e为第k轮的误差

构建模型的最终结果如图所示:

image.png

构建adaboost模型的过程如下:

  1. 假设训练数据集T={(X1,Y1),(X2,Y2)....(Xn,Yn)}
  2. 初始化训练数据权重分布

一般情况下刚开始的样本权重都是一样的

  1. 使用具有权值分布Dm的训练数据集学习,得到基本分类器
  2. 计算Gm(x)在训练集上的分类误差
  3. 根据误差e计算Gm(x)模型的权重系数αm
  4. 从新获得权重训练数据集的权值分布

其中Zm为为规范引子也就是归一化引子

  1. 构建基本分类器的线性组合
  1. 得到最终分类器

小结

主要是理解两个权重,分类器权重和样本权重

(1)根据误差率计算的权重系数αm是分类器的权重

(2)样本的权重是根据已经求得的αm,做一个归一化之后更新每个样本的权重,目的是使得划分错误的数据的权重增大。 下面以一个简单示例

#-*- 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()

结果如下:

image.png

先总结一下Bagging、Boosting的区别

  1. 样本选择:Bagging算法是有放回的随机采样;Boosting算法是每一轮训练集不变,只是训练集中 的每个样例在分类器中的权重发生变化,而权重根据上一轮的分类结果进行调整;
  2. 样例权重:Bagging使用随机抽样,样例的权重;Boosting根据错误率不断的调整样例的权重值, 错误率越大则权重越大;
  3. 预测函数:Bagging所有预测模型的权重相等;Boosting算法对于误差小的分类器具有更大的权重。
  4. 并行计算:Bagging算法可以并行生成各个基模型;Boosting理论上只能顺序生产,因为后一个模 型需要前一个模型的结果;
  5. Bagging是减少模型的variance(方差);Boosting是减少模型的Bias(偏度)。
  6. Bagging里每个分类模型都是强分类器,因为降低的是方差,方差过高需要降低是过拟合; Boosting里每个分类模型都是弱分类器,因为降低的是偏度,偏度过高是欠拟合。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉life

SLIC 超像素分割详解(三):应用

看过上面的介绍后,我们应该思考一下:分割好的超像素有什么用?怎么用?用到哪里? 首先,超像素可以用来做跟踪,可以参考卢湖川课题组发表在IEEE TIP上的《Ro...

455100
来自专栏大数据文摘

论文Express | 谷歌大脑:基于元学习的无监督学习更新规则

19230
来自专栏计算机视觉战队

CNN的全面解析(带你简单轻松入门)

亲爱的关注者您好!真的是好久不见,上次与您相见还是8月18日的晚上,不知道35天的时间不见,你们都有了哪些成果?有了哪些成就?有了哪些offer?但是,本平台的...

33970
来自专栏计算机视觉战队

通过部分感知深度卷积网络进行人脸特征点定位

人脸特征点定位是一个非常具有挑战性的研究课题。由于纹理和形状的不同,不同人脸特征点的定位精度差异很大。但大多数现有的方法不能考虑特征点的部分位置。 为了解决这个...

32760
来自专栏人工智能

通过部分感知深度卷积网络进行人脸特征点定位

人脸特征点定位是一个非常具有挑战性的研究课题。由于纹理和形状的不同,不同人脸特征点的定位精度差异很大。但大多数现有的方法不能考虑特征点的部分位置。 为了解决这个...

226100
来自专栏null的专栏

优化算法——凸优化的概述

一、引言    在机器学习问题中,很多的算法归根到底就是在求解一个优化问题,然而我们的现实生活中也存在着很多的优化问题,例如道路上最优路径的选择,商品买卖中的最...

383100
来自专栏AI科技评论

大会 | AAAI论文:基于强化学习循环查找受关注区域的多标签图像识别

AI 科技评论按:近日,中山大学-商汤科技联合发表 AAAI2018 论文 「Recurrent Attentional Reinforcement Learn...

52060
来自专栏机器学习从入门到成神

机器学习之深入理解SVM

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

13920
来自专栏SnailTyan

YOLO,You Only Look Once论文翻译——中英文对照

You Only Look Once: Unified, Real-Time Object Detection Abstract We present YOLO...

33800
来自专栏SeanCheney的专栏

《Scikit-Learn与TensorFlow机器学习实用指南》 第4章 训练模型

在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱来处理。如果你动手练习过前几章的一些示例,就能惊奇地发现优化回归系统、改进数字图像的分类器、甚至可以零基...

12420

扫码关注云+社区

领取腾讯云代金券