机器学习之AdaBoost元算法(七)

主要内容:
● 组合相似的分类器来提高分类器性能
● 应用AdaBoost算法
● 处理非均衡问题分类问题

打个比方, 做重要决定的时候, 大家可能会汲取多个专家而不是一个人的意见。机器学习处理处理问题的时候,也是如此,这就是元算法的思路。
元算法是对其他算法进行组合的一种方式。

7.1 基于数据集多重抽样的分类器
前面介绍了五种不同的算法,各有优缺点。我们可以将不同的分类器组合起来,这种组合结果被称之为集成方法或者元算法。 使用集成方法可以有很多形式,可以是不同算法的集成,也可以是同一算法在不同的设置下的集成, 还可以是数据集不同部分分配给不同分类器之后的集成。


AdaBoost
优点:泛化错误率低,可以应用到大部分分类器上,无参数调整。
缺点:对离群点敏感
适用数据类型:数值型和标称型数据。

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

自举汇聚法,或称bagging方法 。 是在原始数据集中选择S次后得到S个新数据集的一种技术。新数据集和原始数据集的大小相等。

7.1.2 boosting
boosting是通过集中关注被已有的分类器错分的那些数据来获得新的分类器。
boosting有多个版本,我们现在只讨论AdaBoost。


AdaBoost的一般流程:
(1)收集数据:可以使用任意方法
(2)准备数据:依赖于所使用的弱分类器类型,本次使用的是单层决策树,这种分类器可以处理任何数据类型。还可以使用任意分类器作为弱分类器。其中,kNN,决策树,朴素贝叶斯,logistic回归,支持向量机任一分类器都可以充当分类器。作为弱分类器,简单分类器的效果会更好。
(3)分析数据:可以使用任意方法
(4)训练算法:AdaBoost的大部分时间都在训练上,分类器将多次在同一数据集上训练弱分类器。
(5)测试算法:计算分类的错误率
(6)使用算法:同SVM一样,AdaBoost预测两个类别中的一个。如果想把它应用到多个类别的场合,那么就要像多类SVM中的做法一样,对AdaBoost代码进行修改。

7.2 训练算法:基于错误提升分类器的性能
能不能用弱分类器和多个实例来构建一个强分类器。
在二分类的情况下弱分类的错误率会高于50% ,而强分类器的错误率会低很多。

AdaBoost(adaptive boosting :自适应)的缩写。运行过程如下:
1. 训练数据中的每个样本,赋予一个权重,这些权重构成了向量D。
2. 一开始,这些权重都初始化成相等值,首先在训练数据上训练出一个弱分类器的并计算该分类器的错误率,然后在同一数据集上再次训练弱分类器。
3.在分类器第二次训练当中,将会重新调整每个样本的权重,其中第一次分对的样本的权重会降低,而第一次分错的样本的权重将会提高。
4.为了从所有弱分类器中得到最终的分类结果,AdaBoost为每个分类器都配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误率进行计算的。
其中,错误率 ε 定义为:

ε = 未正确分类的样本数目 / 所有的样本数目

其中,alpha的公式如下

a = ln(1-ε\ε) * 1\2

AdaBoost算法的流程图如下:

这里写图片描述

计算出alpha 之后,可以对权重向量D进行更新,使得正确分类的样本权重降低而错分样本的权重升高。
如果某个样本被正确分类,那么该样本的权重更改为:

这里写图片描述

计算出D之后,AdaBoost算法会进行下一次迭代。算法不断重复训练和调整权重的过程,直到训练错误率为0或者弱分类的数目达到用户的指定值为止。

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

单层决策树(decision stump,也称之为决策树桩)是一种简单的决策树。这个单层决策树仅基于单个特征的来做决策。

我们将使用多套代码来构建单层决策树:
1.第一个函数将用于测试是否有某个值小于或者大于我们正在测试的阈值。
2.第二个函数在一个加权平均数据集中循环,并找到具有最低错误率的单层决策树。

import numpy as np

def loadSimpData():
    datMat = 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]
    return datMat, classLabels

第二个函数的伪代码如下:

"""
将最小错误率minError设为 +inf 大
对数据集中的每一个特征(第一层循环):
    对每个步长(第二层循环):
        对每个不等号(第三层循环):
            建立一棵单层决策树并利用加权数据集对它进行测试
            如果错误率地域minError,则将当前的单层决策树设为最佳单位决策树
返回最佳单层决策树
"""

#=========================================================================
# 单层决策树生成函数
def stumpClassify(dataMatrix, dimen, threshVal, threshIneq):
    retArray = np.ones((np.shape(dataMatrix)[0],1))
    if threshIneq == 'lt':
        retArray[dataMatrix[:, dimen] <= threshVal] = -1.0
    else:
        retArray[dataMatrix[:, dimen] > threshVal] = 1.0
    return retArray

def buildStump(dataArr, classLabels, D):
    dataMatrix = np.mat(dataArr); labelMat = np.mat(classLabels).T
    m, n = np.shape(dataMatrix)                    
    numSteps = 10.0; bestStump = {}; bestClasEst = np.mat(np.zeros((m, 1)))
    minError = inf
    for i in range(n):
        rangeMin = dataMatrix[:, i].min();rangeMax = dataMatrix[:, 1].max()
        stepSize = (rangeMax - rangeMin)/numSteps
        for j in range(-1, int(numSteps) + 1):
            for inequal in ['lt', 'gt']:
                threshVal = (rangeMin + float(j) * stepSize)
                predictedVals = stumpClassify(dataMatrix, i, threshVa
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值