机器学习实战—利用AdaBoost元算法提高分类性能

元算法:是对其他算法进行组合的一种方式。

一、基于数据集多重抽样的分类器

将不同的分类器组合起来,这种组合结果被称为集成方法或者元算法。

集成方法的形式:
1.不同算法的集成;
2.同一算法在不同设置下的集成;
3.数据集不同部分分配给不同分类器之后的集成;
本文介绍的两种集成算法都是基于同一分类器多个不同样本实例的方法。

1.1 bagging:基于数据随机重抽样的分类器构建方法

也称为自举汇聚法,是从原始数据集选择S次后得到的S个数据集的一种技术,新数据集和原始数据集大小相等。允许新数据集中可以有重复值,而原始数据集中的某些值在新数据集合中则不会出现。
S个数据集建好之后,将S个数据集分别输入到S某个学习算法中就得到了S个弱分类器,最终集成的分类器结果由投票机制对多个弱分类器所得结果进行分类。

1.2 boosting

boosting和bagging类似,两者使用的多个弱分类器的类型都是一致的,但是boosting的不同弱分器是通过串行训练得到的,每个弱分类器都根据已经训练出的分类器的性能来进行训练,这里的性能指的是弱分类器的预测结果的加权值,以此实现各个弱分类器与强分类器之间的连通。boosting算法关注的是被以训练好的弱分类器分错的样本实例,在此基础上获得串行分类器数组中的下一分类器。boosting集成后的强分类器结果是由各个弱分类器分类结果的加权和,所以boosting和bagging其实是有明显的不同点的。

boosting和bagging的不同:
1.bagging中各个弱分类器的权重值alpha是相等的;但是boosting中各个弱分类器的权重值alpha是不相等的,错误率低的弱分类器其对最终结果的影响程度大(该弱分类器的权重值alpha值较大)。
2.bagging集成算法的最终分类结果是对各个弱分类器所得的分类结果投票选出分类可能性大的分类;而boosting集成方法的最终分类结果是对于每个弱分类器分类结果的加权和。

二、训练算法:基于错误提升分类器的性能

使用多个弱分类器和多个样本实例构建一个强分类器,弱分类器一般指其分类效果仅仅比随机分类好一点点的分类器,而强分类器的分类效果则要好很多,其错误率会很低。

在正式介绍AdaBoost算法前,先说明以下在AdaBoost中使用的弱分类器,也就是单层决策树,每个决策树节点就是根据数据集中的一个特征的一个阈值进行分类,所以决策树节点分类器很显然是一个二分类器,在AdaBoost中我们使用的弱分类器就是这样的单节点决策树分类器,通过串行训练出多个分类器,这些弱分类器逻辑上处于同一层,通过不同的alpha值集成为一个强分类器,其形式如下:
这里写图片描述
注:图中输入样本的不同长短代表了该样本的不同权重。

AdaBoost是boosting方法中较为流行的一个版本,其运行过程如下:
1.初始情况下对训练集中的每个样本赋予相同的权重值,这些权重值构成了样本权重向量D(假设样本数量为n,则初始向量D中的每一个值都是1/n)。
2.将这些数据应用在一个分类算法上(这里为单层决策树算法),获得第一个弱分类器,并计算该弱分类器的错误率alpha。计算公式如下:
这里写图片描述
其中的错误率可通过以下公式计算得到:
这里写图片描述
3.第一个弱分类器训练结束后,需要迭代的训练后续弱分类器,由于后面的分类器是基于已经训练出的分类器的性能来进行训练的,所以此处需要重新调整每个样本的权重,将弱分类器分错的样本权重增大,将分类正确的样本权重降低。样本权重向量D更新公式为:
这里写图片描述
其中h(x)表示分类器算法函数,其值也就是该分类其的预测结果,yi是该样本实例的真实标签值,所以该公式表明当分类器对样本分类正确时对其样本权重值进行降低,而在分类器对样本分类错误时对该样本权重值进行增加。
4.1~3步骤是在一定的迭代周期中循环进行的,当迭代停止,算法训练出n个弱分类器,利用集成方法获得集成分类器对预测样本的最终分类(最终分类结果为各个弱分类器分类结果的权重和,这个和是个浮点数,通过sign()函数获得其分类值)。

三、基于单层决策树构建弱分类器

单层决策树,就是仅仅基于单个特征来做决策。通过使用多个单层决策树来构建一个能够对数据进行完全正确分类的分类器。

首先,创建一个简单数据集:

import numpy as np
import matplotlib.pyplot as plt

#创建数据集和标签集函数
def simpleDataLoad():
    dataMat = np.matrix([[1., 2.1],
               [2., 1.1],
               [1.3, 1.],
               [1., 1.],
               [2., 1.]])
    classLabels = [1.0, 1.0, -1.0, -1.0, 1.0]
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值