机器学习算法-Adaboost

本章内容

  • 组合类似的分类器来提高分类性能
  • 应用AdaBoost算法
  • 处理非均衡分类问题

主题:利用AdaBoost元算法提高分类性能

1.基于数据集多重抽样的分类器

- AdaBoost
长处 泛化错误率低,易编码,能够应用在大部分分类器上,无需參数调整
缺点 对离群点敏感
适合数据类型 数值型和标称型数据

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

自举汇聚法(bootstrap aggregating),也称为bagging方法,是从原始数据集选择S次后得到S个新数据集的一种技术。

新数据集和原始数据集的大小相等。每一个数据集都是通过在原始数据集中随机选择一个本来进行替换而得到的。

在S个数据集建好之后,将某个学习算法分别作用域每一个数据集得到了S个分类器。当我们对新数据进行分类时,就能够应用S个分类器进行分类。与此同一时候,选择分类器投票结果最多的类别作为最后的分类结果。

有一些比較先进的bagging方法,如随机森林(RF)。

boosting是一种与bagging非常类似的技术。

不论是boosting还是bagging其中。当使用的多个分类器的类型都是一致的。可是在前者其中,不同的分类器是通过串行训练而获得的。每一个新分类器都依据已训练出的分类器的性能来进行训练。boosting是通过训练集中关注被已有分类器错分的那些数据来获得新的分类器。

boosting方法有多个版本号,当前最流行便属于AdaBoost

AdaBoost的一般流程

(1)收集数据:能够使用不论什么方法;

(2)准备数据:依赖于所使用的若分类器类型;

(3)分析数据:能够使用随意方法

(4)训练算法:AdaBoost的大部分时间都用在训练上,分类器将多次在同一数据集上训练若分类器。

(5)測试算法:计算分类的错误率;

(6)使用算法:同SVM一样,AdaBoost预測的两个类别中的一个。假设想要把它应用到多个类的场合,那么就像多类SVM中的做法一样对AdaBoost进行改动。

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

AdaBoost是adaptive boosting(自适应boosting)的缩写,其执行过程:训练集中的每一个样本,赋予其一个权重,这些权重构成向量D。一開始,这些权重都初试化成相等值。首先在训练数据上训练处一个若分类器并计算该分类器的错误率,然后在同一数据集上再次训练若分类器。在分类器的第二次训练其中,将会又一次调整每一个样本的权重。其中第一次分队的样本的权重值将会减少。而第一次分错的样本的权重将会提高。

为了从全部分类器中得到终于的分类结果,AdaBoost为每一个分类器都分配了一个权重值alpha,这些alpha值是基于每一个分类器的错误率进行计算的。其中错误率定义为

?=为正确分类的样本数目所有样本数目

alpha计算公式

α=12ln(1???)

计算出alpha值之后,能够对权重向量D进行更新,使得正确分类的样本的权重值减少而分错的样本权重值升高,D的计算方法例如以下

假设某个样本被正确分类。更新该样本权重值为:

D(t+1)i=D(t)ie?αSum(D)

假设某个样本被错误分类,更新该样本的权重值为:

D(t+1)i=D(t)ieαSum(D)

计算出D后,AdaBoost接着開始下一轮的迭代。AdaBoost算法会不断地反复训练和调整权重的过程,知道训练错误率为0或者若分类器的数目达到用户指定值为止。

在建立完整的AdaBoost算法之前,须要通过一些代码建立若分类器及保存数据集的权重。

算法描写叙述:

3.基于单层决策树构建若分类器

单层决策树是一种简单的决策树。首先构建一个简单的数据集,建立一个adaboost.py文件并增加下列代码:

def loadSimpData():
    datMat = 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

导入数据

>>> import adaboost
>>> datMat,classLabels=adaboost.loadSimpData()

附:自适应数据载入函数

def loadDataSet(fileName):      #general function to parse tab -delimited floats
    numFeat = len(open(fileName).readline().split(‘\t‘)) #get number of fields
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr =[]
        curLine = line.strip().split(‘\t‘)
        for i in range(numFeat-1):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1]))
    return dataMat,labelMat

以下两个函数,一个用于測试是否某个值小于或者大于我们正在測试的阈值,一个会在一个加权数据集中循环,并找到具有最低错误率的单层决策树。

伪代码例如以下:

将最小错误率minError设为无穷大
对数据及中的每一个特征(第一层循环):
    对每一个步长(第二层循环):
        对每一个不等号(第三层循环):
            建立一颗单层决策树并利用加权数据集对它进行測试
            假设错误率低于minError。则将当前单层决策树设置为最佳单层决策树
返回最佳单层决策树

单层决策树生成函数代码:

def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the data
    retArray = ones((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 = mat(dataArr); labelMat = mat(classLabels).T
    m,n = shape(dataMatrix)
    numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))
    minError = inf #init error sum, to +infinity
    for i in range(n):#loop over all dimensions
        rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();
        stepSize = (rangeMax-rangeMin)/numSteps
        for j in range(-1,int(numSteps)+1):#loop over all range in current dimension
            for inequal in [‘lt‘, ‘gt‘]: #go over less than and greater than
                threshVal = (rangeMin + float(j) * stepSize)
                predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#call stump classify with i, j, lessThan
                errArr = mat(ones((m,1)))
                errArr[predictedVals == labelMat] = 0
                weightedError = D.T*errArr  #calc total error multiplied by D
                #print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError)
                if weightedError < minError:
                    minError = weightedError
                    bestClasEst = predictedVals.copy()
                    bestStump[‘dim‘] = i
                    bestStump[‘thresh‘] = threshVal
                    bestStump[‘ineq‘] = inequal
    return bestStump,minError,bestClasEst

4.AdaBoost算法的实现

整个实现的伪代码例如以下:

对每次迭代:
    利用buildStump()函数找到最佳的单层决策树
    将最佳单层决策树增加到单层决策树数据中
    计算alpha
    计算心的权重向量D
    更新累计类别预计值
    假设错误率低于0.0 则退出循环

基于单层决策树的AdaBoost训练过程

def adaBoostTrainDS(dataArr,classLabels,numIt=40):
    weakClassArr = []
    m = shape(dataArr)[0]
    D = mat(ones((m,1))/m)   #init D to all equal
    aggClassEst = mat(zeros((m,1)))
    for i in range(numIt):
        bestStump,error,classEst = buildStump(dataArr,classLabels,D)#build Stump
        #print "D:",D.T
        alpha = float(0.5*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in max(error,eps) to account for error=0
        bestStump[‘alpha‘] = alpha
        weakClassArr.append(bestStump)                  #store Stump Params in Array
        #print "classEst: ",classEst.T
        expon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messy
        D = multiply(D,exp(expon))                              #Calc New D for next iteration
        D = D/D.sum()
        #calc training error of all classifiers, if this is 0 quit for loop early (use break)
        aggClassEst += alpha*classEst
        #print "aggClassEst: ",aggClassEst.T
        aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))
        errorRate = aggErrors.sum()/m
        print "total error: ",errorRate
        if errorRate == 0.0: break
    return weakClassArr,aggClassEst

5.測试算法

拥有了多个若分类器以及其相应的alpha值,进行測试就方便了。

AdaBoost分类函数:利用训练处的多个若分类器进行分类的函数。

def adaClassify(datToClass,classifierArr):
    dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDS
    m = shape(dataMatrix)[0]
    aggClassEst = mat(zeros((m,1)))
    for i in range(len(classifierArr)):
        classEst = stumpClassify(dataMatrix,classifierArr[i][‘dim‘],                                 classifierArr[i][‘thresh‘],                                 classifierArr[i][‘ineq‘])#call stump classify
        aggClassEst += classifierArr[i][‘alpha‘]*classEst
        print aggClassEst
    return sign(aggClassEst)

6.绘制ROC曲线

ROC曲线绘制代码:

def plotROC(predStrengths, classLabels):
    import matplotlib.pyplot as plt
    cur = (1.0,1.0) #cursor
    ySum = 0.0 #variable to calculate AUC
    numPosClas = sum(array(classLabels)==1.0)
    yStep = 1/float(numPosClas); xStep = 1/float(len(classLabels)-numPosClas)
    sortedIndicies = predStrengths.argsort()#get sorted index, it‘s reverse
    fig = plt.figure()
    fig.clf()
    ax = plt.subplot(111)
    #loop through all the values, drawing a line segment at each point
    for index in sortedIndicies.tolist()[0]:
        if classLabels[index] == 1.0:
            delX = 0; delY = yStep;
        else:
            delX = xStep; delY = 0;
            ySum += cur[1]
        #draw line from cur to (cur[0]-delX,cur[1]-delY)
        ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY], c=‘b‘)
        cur = (cur[0]-delX,cur[1]-delY)
    ax.plot([0,1],[0,1],‘b--‘)
    plt.xlabel(‘False positive rate‘); plt.ylabel(‘True positive rate‘)
    plt.title(‘ROC curve for AdaBoost horse colic detection system‘)
    ax.axis([0,1,0,1])
    plt.show()
    print "the Area Under the Curve is: ",ySum*xStep

说明:文章中的代码来自机器学习实战。

References

【1】Machine Learning in Action 机器学习实战 第七章



本栏目Machine Learning持续更新中。欢迎关注:Dream_Angel_Z博客

时间: 2024-10-15 01:30:23

机器学习算法-Adaboost的相关文章

简单易学的机器学习算法——AdaBoost

一.集成方法(Ensemble Method) 集成方法主要包括Bagging和Boosting两种方法,随机森林算法是基于Bagging思想的机器学习算法,在Bagging方法中,主要通过对训练数据集进行随机采样,以重新组合成不同的数据集,利用弱学习算法对不同的新数据集进行学习,得到一系列的预测结果,对这些预测结果做平均或者投票做出最终的预测.AdaBoost算法和GBDT(Gradient Boost Decision Tree,梯度提升决策树)算法是基于Boosting思想的机器学习算法.

每日一个机器学习算法——adaboost

在网上找到一篇好文,直接粘贴过来,加上一些补充和自己的理解,算作此文. My education in the fundamentals of machine learning has mainly come from Andrew Ng’s excellent Coursera course on the topic. One thing that wasn’t covered in that course, though, was the topic of “boosting” which

机器学习---算法---Adaboost

转自:https://blog.csdn.net/px_528/article/details/72963977 写在前面说到Adaboost,公式与代码网上到处都有,<统计学习方法>里面有详细的公式原理,Github上面有很多实例,那么为什么还要写这篇文章呢?希望从一种更容易理解的角度,来为大家呈现Adaboost算法的很多关键的细节. 本文中暂时没有讨论其数学公式,一些基本公式可以参考<统计学习方法>. 基本原理Adaboost算法基本原理就是将多个弱分类器(弱分类器一般选用单

机器学习算法-梯度树提升GTB(GBRT)

Introduction 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不太理想. 模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,如randomForest.Adaboost.GBRT等,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的

【机器学习算法-python实现】Adaboost的实现(1)-单层决策树(decision stump)

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 上一节学习支持向量机,感觉公式都太难理解了,弄得我有点头大.不过这一章的Adaboost线比较起来就容易得多.Adaboost是用元算法的思想进行分类的.什么事元算法的思想呢?就是根据数据集的不同的特征在决定结果时所占的比重来划分数据集.就是要对每个特征值都构建决策树,并且赋予他们不同的权值,最后集合起来比较. 比如说我们可以通过是否有胡子和身高的高度这两个特征来来决定一个人的性别,很明显是否有胡子

机器学习算法总结(三)——集成学习(Adaboost、RandomForest)

1.集成学习概述 集成学习算法可以说是现在最火爆的机器学习算法,参加过Kaggle比赛的同学应该都领略过集成算法的强大.集成算法本身不是一个单独的机器学习算法,而是通过将基于其他的机器学习算法构建多个学习器并集成到一起.集成算法可以分为同质集成和异质集成,同质集成是值集成算法中的个体学习器都是同一类型的学习器,比如都是决策树:异质集成是集成算法中的个体学习器由不同类型的学习器组成的.(目前比较流行的集成算法都是同质算法,而且基本都是基于决策树或者神经网络的) 集成算法是由多个弱学习器组成的算法,

机器学习系列(9)_机器学习算法一览(附Python和R代码)

本文资源翻译@酒酒Angie:伊利诺伊大学香槟分校统计学同学,大四在读,即将开始计算机的研究生学习.希望认识更多喜欢大数据和机器学习的朋友,互相交流学习. 内容校正调整:寒小阳 && 龙心尘 时间:2016年4月 出处:http://blog.csdn.net/han_xiaoyang/article/details/51191386 http://blog.csdn.net/longxinchen_ml/article/details/51192086 声明:版权所有,转载请联系作者并注

【转】常见面试之机器学习算法思想简单梳理

转:http://www.chinakdd.com/article-oyU85v018dQL0Iu.html 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大. 纵观IT行业的招聘岗位,机器学习之类的岗位还是挺少的,国内

机器学习&amp;数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

http://www.cnblogs.com/tornadomeet/p/3395593.html 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大.