adaboost(自适应增强算法)

Qunar_尤雪萍 Qunar_尤雪萍     2023-02-15     708

关键词:

AdaBoost(自适应增强算法)

AdaBoost的目标是通过一个弱分类器构建一个强分类器,AdaBoost的大致运行过程:训练数据中的每一个样本,并赋予其一个权重,形成对应的权重向量 D ,一开始所有训练样本具有相同权值,然后使用弱分类器分类并计算出该分类器的错误率,然后再统一数据集上面再次训练弱分类器,在第二次训练中,将会调整每个样本的权值,其中第一次分队的样本的权重将会降低,第一次分错的样本权重将会提高。最终我们能得到一组分类器,通过,并且根据最终每个分类器的错误率为每个分类器赋予一个权重值alpha, alpha 公式如下:

α=12ln(1ϵϵ)1 ,当 alpha 得到后我们对权重向量 D 进行更新,使得正确分类的样本权值降低,错分样本权重升高,计算方法如下:如果某个样本被正确分类则权重值更改为:D(t+1)i=D(t)ieαSum(D)2,如果某个样本被错分,那么样本的权重更改为: D(t+1)i=D(t)ieαSum(D)3 ,通过不断的训练和调整权重产生新的分类器,知道训练错误率为0或者达到指定值为止。

通过单层决策树构建弱分类器

单层决策树是一种简单的决策树,不像之前的介绍的决策树,它只会做一层分裂,例如判断数值大于指定值时归类到class1,否则归类到class2。
构建一个简单的数据集:

dataMat = 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]


AdaBoost需要构建多个单层决策树,多个决策树组合起来实现正确的对数据集进行分类。
单层决策树实现:

#dimen 表示特征下标
#threshVal 表示分隔值
#threshIneq 表示分隔方式
def stumpClassify(dataMat, dimen, threshVal, threshIneq):
    retArray = ones((shape(dataMat)[0],1))
    if threshIneq == 'lt':
        for i in shape(dataMat)[0]:
            if dataMat[i][dimen] <= threshVal: retArray[i] = -1.0
    else:
        for i in shape(dataMat)[0]:
            if dataMat[i][dimen] > threshVal: retArray[i] = -1.0
    return retArray

AdaBoost算法实现:
通过下面的方法可选择出在当前权重 D <script type="math/tex" id="MathJax-Element-9">D</script>下最佳的决策分类信息,返回值分别为当前最优分类器,当前分类器的误差值,最终的分类结果。

#这里的D为每个样本的初始权重,计算方式为 D = ones((shape(dataMat)[0],1))/shape(dataMat)[0]
def buildStump(dataMat, classLabels, D):
    dataMatrix = mat(dataMat);labelMatrix=mat(classLabels).T
    m,n = shape(dataMatrix)
    numSteps = 10.0; bestStump =;bestClassEst=mat(zeros((m,1)))
    minError = inf
    #便利每个特征值
    for i in range(n):
        rangeMin = dataMatrix[:,i].min()
        rangeMax = dataMatrix[:,i].max()
        stepSize = (rangeMax - rangeMin) / numSteps
        for j in range(-1, int(numSteps) + 1):
            for inequal in ['lt', 'gt']:
                threshVal = (rangeMin + float(j) * stepSize)
                predictValue = stumpClassify(dataMatrix, i, threshVal, inequal)
                errArr = mat(ones((m,1)))
                for classIndex in range(0,m):
                    if errArr[classIndex] == labelMatrix[classIndex]:
                        errArr[classIndex]=0
                weightError = D.T * errArr
                if weightError < minError:
                    minError = weightError
                    bestClassEst = predictVals.copy()
                    bestStump['dim'] = i
                    bestStump['thresh'] = threshVal
                    bestStump['ineq'] = inequal
    return bestStump, minError, bestClassEst

    Example Result:
    >>> bestStump
    'dim': 0, 'ineq': 'lt', 'thresh': 1.3
    >>> minError
    matrix([[ 0.2]])
    >>> bestClassEst
    array([[-1.],
           [ 1.],
           [-1.],
           [-1.],
           [ 1.]])

完整AdaBost Training 算法实现:
算法输出结果为一组弱分类器,每个分类器都有对应的权重值

def adaBoostTrainDS(dataArr, classLables, numIt=40):
    #用于存储弱分类器组
    weakClassArr = []
    m = shape(dataArr)[0]
    #初始化训练数据权重值
    D = mat(ones((m,1))/m)
    aggClassEst = mat(zeros((m,1)))

    for i in range(numIt):
        bestStump, error, classEst = buildStump(dataArr, classLabels, D)
        #计算alpha值
        alpha = float(0.5*log((1.0 - error)/max(error, 1e-16)))
        bestStump['alpha'] = alpha
        weakClassArr.append(bestStump)
        #更新权重向量D,数学公式参见上面的
        #得到的 expon为一个 (m,1)的向量
        expon = multiply(-1*alpha*mat(classLabel).T, classEst)
        ##利用上面的 公式(2) 公式(3)更新 D
        D = multiply(D, exp(expon))
        D = D/D.sum()
        aggClassEst += alpha*classEst
        ##当前所有分类器组合得到的分类结果
        prediction = sign(aggClassEst)
        ##计算误差值
        aggError = ones((m,1))
        for i in range(prediction.shape()[0]):
            if prediction[i] == classLabels.T[i] :
                aggError[i] = 0
        # 上面的for 循环可以简单用下面的语句
        #aggErrors = multiply(sign(aggClassEst)!=mat(classLabels).T, ones((m,1)))

        #计算错误率
        errorRate = aggError.sum()/m
        if errorRate == 0.0: break;

    return weakClassArr

使用AdaBoost分类器进行分类目标数据

def adaClassify(dataToClass, classifierArr):
    dataMatrix = mat(dataToClass)
    m = shape(dataMatix)[0]
    ##现将测试数据的分类结果初始为0
    aggClassEst = mat(zeros((m,1)))
    for i in range(len(classifierArr)):
        classEst = stumpClassify(dataMatrix, classifierArr[i]['dim'], classifierArr[i]['thresh'], classifierArr[i]['ineq'])
        aggClassEst+= classifier[i]['alpha']*classEst


    return sign(aggClassEst)

AdaBoost 分类性能调优

不同弱分类数目会存在不同的分类错误率,但并不是说弱分类器的数量越多分类错误率越低,通常情况下,AdaBoost会达到一个稳定的测试错误率,而并不会随分类数目的增多而提高,另外一些情况下弱分类器数量当超过每一个最佳数值后,随着弱分类器数量的增加,错误率也会随之增高,这种现象称之为过拟合,因此在构造我们分类器时我们需要通过不断分类错误率和分类器数目找到一个最佳的分类器数。
这是一个分类器数目和错误率映射case:

分类器数目训练错误率(%)测试错误率(%)
10.280.27
100.230.24
500.190.21
1000.190.22
5000.160.25
10000.140.31
100000.110.33

自适应滤波:维纳滤波器——gsc算法及语音增强

...哦~  【读书笔记04】前言仍然是西蒙.赫金的《自适应滤波器原理》第四版第二章,首先看到无约束维纳滤波,接着到了一般约束条件的滤波,此处为约束扩展的维纳滤波,全文包括: 查看详情

adaboot算法学习笔记

...据集的不同部分集成Ensemble算法主要分为Bagging和Boosting,AdaBoost是Boosting算法的主要代表,是"AdaptiveBoosting"(自适应增强)的缩写,由YoavFr 查看详情

图像增强基于matlab量子遗传算法优化beta自适应图像增强含matlab源码2259期

⛄一、量子遗传算法自适应增强图像1图像增强概述图像增强就是将原来不清楚的图像变得清晰或把我们感兴趣的某些特征强调出来,以改善图像的视觉效果或便于对图像进行其他处理。图像增强技术大致可分为频域法、空域... 查看详情

r数据分析之adaboost算法

Rattle实现AdaBoost算法Boosting算法是简单有效、易使用的建模方法。AdaBoost(自适应提升算法)通常被称作世界上现成的最好分类器。Boosting算法使用其他的弱学习算法建立多个模型,对数据集中对结果影响较大的对象增加权重,一... 查看详情

什么是使用 Adaboost(自适应提升)方法和决策树的示例

】什么是使用Adaboost(自适应提升)方法和决策树的示例【英文标题】:WhatisanexampleofusingAdaboost(AdaptiveBoosting)approachwithDecisionTrees【发布时间】:2014-11-1509:54:41【问题描述】:是否有任何好的教程来解释如何在为样本训练集构建决... 查看详情

图像增强|clahe限制对比度自适应直方图均衡化(代码片段)

...英文是ContrastLimitedAdaptiveHistogramEqualization限制对比度的自适应直方图均衡。在学习这个之前,我们要先学习一下下面的前置算法:【C 查看详情

opencv,局部自适应图像增强(localadaptivecontrastenhancement)(代码片段)

...倾向于采用“局部”方法进行处理。我们这里着重研究自适应对比度增强(ACE) 查看详情

adaboost算法和matlab实现(代码片段)

 一、AdaBoost简介    Boosting,也称为增强学习或提升法,是一种重要的集成学习技术,能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况下,为学... 查看详情

图像增强总结和代码(代码片段)

调整对比度直方图均衡化/对比度限制自适应直方图均衡化(CLAHE)/gamma变换/对数变化限制对比度自适应直方图均衡化算法原理限制对比度自适应直方图均衡化算法实现代码实现importcv2importmatplotlib.pyplotaspltimportnumpyasnpdefequalizeHist(im):... 查看详情

人脸检测——基于机器学习3adaboost算法

简介主要工作AdaBoost算法的人脸检测算法包含的主要工作:(1)通过积分图快速求得Haar特征;(2)利用AdaBoost算法从大量的特征中选择出判别能力较强的少数特征用于人脸检测分类;(3)提出一个级联结构模型,将若干个弱分... 查看详情

张雪英部分论文集

帧间自适应的压缩感知谱减去噪方法麦克风阵列下互相关函数分类的声源定位改进DSB方法的语音信号多声源定位基于噪声特性的语音增强算法关于在噪声环境下语音识别优化研究联合改进子空间的自适应小波包阈值语音增强算法... 查看详情

adaboost算法详解及python实现python机器学习系列(十八)

文章目录1.AdaBoost算法简介2.AdaBoost算法逻辑详解2.1数据2.2带权错误率2.3损失函数与确定样本权重2.3确定模型权重2.4输出模型3.AdaBoost算法的python实现1.AdaBoost算法简介Boosting是机器学习的三大框架之一,其特点是,训练过程... 查看详情

机器学习算法-adaboost

本章内容组合类似的分类器来提高分类性能应用AdaBoost算法处理非均衡分类问题主题:利用AdaBoost元算法提高分类性能1.基于数据集多重抽样的分类器-AdaBoost长处泛化错误率低,易编码,能够应用在大部分分类器上,无需參数调整... 查看详情

gbdt简述

...为强学习器的算法。这种算法中比较成熟、有代表性的是AdaBoost算法。增强算法的工作机制比较类似,先从初始训练集学习出一个基学习器,再根据 查看详情

boostingandadaboost

...型被添加到训练集被完美地预测或增加模型的最大数量。AdaBoost是第一个真正成功的用于二进制分类的增强算法。这是理解提升的最佳起点。现代增强方法建立在AdaBoost上,最显著的是随机梯度增强机。AdaBoost是用于短决策树的。... 查看详情

2019-03-02

...T个基学习器进行加权结合。Boosting族算法最著名的代表是AdaBoost,是“AdaptiveBoosting(自适应增强)”的缩写。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同... 查看详情

基于adaboost算法——世纪晟结合haar-like特征训练人脸检测识别

 AdaBoost?算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高。 系统在技术上的三个贡献:1.用简单的Haar-like矩形特征作特征,可... 查看详情

如何使用 AdaBoost 增强基于 Keras 的神经网络?

】如何使用AdaBoost增强基于Keras的神经网络?【英文标题】:HowtoboostaKerasbasedneuralnetworkusingAdaBoost?【发布时间】:2016-12-2801:39:15【问题描述】:假设我适合以下神经网络来解决二元分类问题:model=Sequential()model.add(Dense(21,input_dim=19,... 查看详情