AdaBoost入门【附代码】

AdaBoost入门

  博主前段时间学习了AdaBoost,写这篇博客一方面是为了加深自己的理解及记忆,另一方面是给初学者以启发,同时也便于大家一起交流学习。

1.背景知识

1.1弱学习器与强学习器

  弱学习器常指泛化性能略优于随机猜测的学习器,例如在二分类问题上精度略高于50%的分类器。强学习器常指泛化性能比较好的学习器。

1.2集成学习

  集成学习通过构建并结合多个个体学习器(基学习器\组件学习器)来完成学习任务。一般而言,通常所说的集成学习中的多个学习器都是同质(同种类型)的"弱学习器",将这些弱学习器基于某种策略集成后获得一个精度较好的"强学习器"。

1.3两大类集成学习方法

  根据个体学习器的生成方式,目前的集成学习方法大致可分为两类,即:个体学习器之间存在强依赖关系,必须串行生成的序列化方法,代表是Boosting;以及个体学习器之间不存在强依赖关系,可同时生成的并行化方法,代表是Bagging和随机森林。

1.4Bagging

  给定包含m个样本的数据集,使用自助采样法采样出T个含m个训练样本的采样集。然后基于每个采样集训练出一个基学习器,得到T个基学习器。当新数据到来时,输入T个基学习器会得到T个结果,最后若是分类任务则使用简单投票法,若是回归任务则使用简单平均法。

1.5Boosting

  先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本的分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的训练样本来训练下一个基学习器;如此重复进行直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权组合。

2.AdaBoost算法

    在这里插入图片描述
从上图中我们可以明显看到Boosting算法思想。

2.1AdaBoost算法流程如下

在这里插入图片描述
在这里插入图片描述

2.2AdaBoost算法细节剖析

关于错误率ε的理解:
  传统意义理解错误率: ε = 未正确分类的样本 / 所有样本数目
  此算法错误率也是这样计算的,但是由于该算法为每个数据赋予一个权值,故稍有些区别。
        在这里插入图片描述
  举个例子,在以前没有权重时(其实是平局权重时),一共10个点时,对应每个点的权重都是0.1,分错1个,错误率就加0.1;分错3个,错误率就是0.3。现在,每个点的权重不一样了,还是10个点,权重依次是[0.01,0.01,0.01,0.01,0.01,0.01, 0.01,0.01,0.01,0.91],如果分错了第1一个点,那么错误率是0.01,如果分错了第3个点,那么错误率是0.01,要是分错了最后一个点,那么错误率就是0.91。
关于每轮训练弱学习器的训练集:
  采用自助采样法生成训练集,即有放回抽样。
关于每轮权值更新:
  每次更新是对初始样本集的权重更新,被基分类器误分类样本的权值
增大,而被正确分类样本的权值减小;
在这里插入图片描述

2.3算法优缺点

2.3.1算法优点
  1. 很好的利用弱分类器进行级联;
  2. 可以将不同的分类算法作为弱分类器;
  3. AdaBoost具有很高的精度;
  4. 相对于bagging算法和Random Forest 算法,AdaBoost充分考虑了每个分类器的权重;
2.3.2算法缺点
  1. 弱分类器的数目不太好设定,可通过交叉验证确定;
  2. 对异常样本敏感;
  3. 训练比较耗时;

3.实验研究

  使用交叉验证确定超参数(弱分类器数目T)的最优值及强分类器与弱分类器结果比较。
  数据集大小为 770 * 9,1~8列为描述属性,第9列为label属性(取值为{1,-1})。
在这里插入图片描述
  弱分类器为决策树桩,即单层决策树。
  在这里插入图片描述

3.1弱分类器与强分类器结果对比

弱分类器的准确率
          在这里插入图片描述
强分类器的准确率
在这里插入图片描述

3.2使用交叉验证确定弱分类器数目的最优解

    for T in range(1, 51):
        axis_x.append(T)
        accCount = 0.0
        # 对每个 T 使用 5-折交叉验证
        for k in range(5):
            index = []
            # 筛选训练集索引
            for i in range(5):
                if i != k:
                    index.append(i)
            x_train = np.concatenate((x_split[index[0]], x_split[index[1]], x_split[index[2]], x_split[index[3]]), 0)
            y_train = np.concatenate((y_split[index[0]], y_split[index[1]], y_split[index[2]], y_split[index[3]]), 0)
            x_test = x_split[k]
            y_test = y_split[k]

            # prepare test and train data
            x_train = x_train.transpose()
            x_test = x_test.transpose()

            # train
            ada = AdaBoost(x_train, y_train)
            ada.train(T)

            # predict
            y_pred = ada.pred(x_test)
            acc = accuracy_score(y_test, y_pred)

在这里插入图片描述
我们可以看出,当弱分类器数目为16的时候,分类的结果较好。

4.总结与致谢

  阅读到这里,这篇博客就要结束了,感谢大家阅读,有任何问题可在下方评论,欢迎大家交流,如需转载,请注明出处,谢谢!
  最后附上完整代码链接:http://download.csdn.net/download/qq_35874169/12062570,无下载积分的可私信博主发邮箱。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值