python机器学习实战6:利用adaBoost元算法提高分类性能
1.adaBoost元算法简介
在之前我们LZ介绍了不同的分类器,如果我们根据实际的要求对这些分类器进行组合,这种组合的结果则被称为集成算法(ensemble method)或者元算法(meta-method)。
我们这次使用的算法就是adaBoost,先给小伙伴一个直观的印象,该算法的优点是:泛化错误率低,易编码,可以应用在大部分分类器上,无参数调整。缺点是对离群点敏感,适用的数据类型:数值型和标称型数据。
自举汇聚法(bootstrap aggregating),也称为bagging方法,是在从原始数据集选择S次后得到S个新数据集的一种技术。bagging中的数据集相当于是有放回取样,比如要得到一个大小为n的新数据集,该数据集中的每个样本都是在原始数据集中随机抽样(有放回),也就是说原始数据集中的样本有部分可能就不会出现在新的数据集中,而有些样本可能会出现不止一次。
在S个数据集建立好之后,就会应用某种算法产生S个分类器,然后对每个分类器附上对应权重,加权求和后获得最后的结果。
bagging算法有很多种:例如随机森林等就自行研究
boosting是一种与bagging很类似的技术,这两种技术使用的分类器的类型都是一致的,前者是通过不同的分类器串行训练得到的,每个分类器都根据已训练出的分类器的性能来进行训练。boosting是通过集中关注被已有分类器错分的哪些数据来获得新的分类器。由于boosting分类结果是基于所有分类器的加权求和结果的,因此和bagging不太一样,bagging中的分类器的权重是相等的。boosting中的分类器权重并不相等,每个权重代表的是其对应分类器在上一轮迭代中的成功度。
adaBoost是adaptive boosting(自适应boosting)的缩写,而其想法就是如果我们能够建立一些弱分类器,这些分类器的性能比随机猜测要略好,但也不会好很多,那么如果我们把多个弱分类器构建成一个强分类器,那么结果会怎么样呢?
AdaBoost的运行过程如下:训练数据中的每个样本,并赋予其一个权重,这些权重构成了向量D。一开始这些权重都初始化相等值。首先在训练数据上训练出一个弱分类器并计算该分类器的错误率,然后在统一数据上再次训练弱分类器。在分类器的第二次训练当中,将会重新调整每个样本的权重,其中每一次分对的样本的权重将会降低,而第一次分错的样本的权重就会提高。为了从所有弱分类器中得到最终的分类结果,Adaboost为每个分类器都分配了一个权重值alpha,这些alpha值是基于每个弱分类器的错误率进行计算的。其中,错误率ϵ\epsilon的定义为:
ϵ=未正确分类的样本数目所有样本数目\epsilon=\frac{未正确分类的样本数目}{所有样本数目}
而α\alpha的计算公式如下:
α=12In(1−ϵϵ)\alpha = \frac{1}{2}In(\frac{1-\epsilon}{\epsilon})
计算出α\alpha值后,可以对权重向量D进行更新,以使得那些正确的分类的样本的权重降低而错分样本的权重升高。D的计算方法如下.
如果某个样本被正确分类,那么样本的权重更新为:
Dt+1i=Dtie−αSum(D)D^{t+1}_i = \frac{D^{t}_{i}e^{-\alpha}}{Sum(D)}
如果某个样本被错分,那么样本的权重更新为:
Dt+1i=DtieαSum(D)D^{t+1}_i = \frac{D^{t}_{i}e^{\alpha}}{Sum(D)}
在计算出D之后,AdaBoost又开始进入下一轮迭代。AdaBoost算法会不断地重复训练和调整权重的过程,直到训练错误率为0或者弱分类器的数目达到用户的指定值为止。
2.adaBoost的代码实现
#coding:utf-8#导入numpy依赖库
from numpy import *#创建简单数据集,后面会用到比较复杂的数据集
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#读取数据集的函数
def loadDataSet(fileName): #general function to parse tab -delimited floatsnumFeat = 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#单层决策树生成函数
#单层决策树仅基于单个特征来做决策def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the dataretArray = ones((shape(dataMatrix)[0],1))if threshIneq == 'lt':retArray[dataMatrix[:,dimen] <= threshVal] = -1.0else:retArray[dataMatrix[:,dimen] > threshVal] = -1.0return retArray#遍历stumpClassify()函数所有的可能输入值,并找到数据集上最佳的单层决策树
def buildStump(dataArr,classLabels,D):dataMatrix = mat(dataArr); labelMat = mat(classLabels).Tm,n = shape(dataMatrix)numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))minError = inf #init error sum, to +infinityfor i in range(n):#loop over all dimensionsrangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();stepSize = (rangeMax-rangeMin)/numStepsfor j in range(-1,int(numSteps)+1):#loop over all range in current dimensionfor inequal in ['lt', 'gt']: #go over less than and greater thanthreshVal = (rangeMin + float(j) * stepSize)predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#call stump classify with i, j, lessThanerrArr = mat(ones((m,1)))errArr[predictedVals == labelMat] = 0weightedError = 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 = weightedErrorbestClasEst = predictedVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequalreturn bestStump,minError,bestClasEst#基于单层决策树的AdaBoost训练过程,指定迭代次数numIt,DS代表的就是单层决策树
def adaBoostTrainDS(dataArr,classLabels,numIt=40):weakClassArr = []m = shape(dataArr)[0]D = mat(ones((m,1))/m) #init D to all equalaggClassEst = mat(zeros((m,1)))for i in range(numIt):bestStump,error,classEst = buildStump(dataArr,classLabels,D)#build Stump#print "D:",D.Talpha = float(0.5*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in max(error,eps) to account for error=0bestStump['alpha'] = alpha weakClassArr.append(bestStump) #store Stump Params in Array#print "classEst: ",classEst.Texpon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messyD = multiply(D,exp(expon)) #Calc New D for next iterationD = 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.TaggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))errorRate = aggErrors.sum()/mprint "total error: ",errorRateif errorRate == 0.0: breakreturn weakClassArr,aggClassEst#AdaBoost分类函数
def adaClassify(datToClass,classifierArr):dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDSm = 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 classifyaggClassEst += classifierArr[i]['alpha']*classEstprint aggClassEstreturn sign(aggClassEst)#画出ROC函数
def plotROC(predStrengths, classLabels):import matplotlib.pyplot as pltcur = (1.0,1.0) #cursorySum = 0.0 #variable to calculate AUCnumPosClas = sum(array(classLabels)==1.0)yStep = 1/float(numPosClas); xStep = 1/float(len(classLabels)-numPosClas)sortedIndicies = predStrengths.argsort()#get sorted index, it's reversefig = plt.figure()fig.clf()ax = plt.subplot(111)#loop through all the values, drawing a line segment at each pointfor 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
好久没更新这个系列了,前阵子也是各种杂事,现在收心,好好学习啦O(∩_∩)O
python机器学习实战6:利用adaBoost元算法提高分类性能相关推荐
- 《机器学习实战》学习笔记(七):利用AdaBoost 元算法提高分类性能
欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...
- 机器学习实战 -- 利用AdaBoost 元算法提高分类性能
组合相似的分类器来提高分类性能 应用AdaBoost算法 处理非均衡分类问题 元算法是对其他算法进行组合的一种方式. 基于数据集多重抽样的分类器 我们可以将不同的分类器组合起来,而这种组合结果被称为集 ...
- 机器学习算法——利用AdaBoost元算法提高分类性能(基于单层决策树构建的弱分类器)
当做出重要决定时,我们往往会听取多个专家而不只是一个人的意见.元算法正是采用这种思路,元算法是对其他算法进行组合的一种方式,本篇博文主要介绍AdaBoost元算法,该算法是机器学习工具箱中最强有力的工 ...
- 利用AdaBoost元算法提高分类性能
本篇博文涵盖如下内容: 组合相似的分类器来提高分类性能 应用AdaBoost算法 处理非均衡分类问题 元算法(meta-algorithm): 对其他算法进行组合的一种方式. 最为流行的元算法: Ad ...
- 机器学习第七章笔记——利用AdaBoost元算法提高分类性能
目录 引言 一. 基于数据集多重抽样的分类器 1.1 bagging:基于数据随机重抽样的分类器构建方法 1.2 boosting 二. 训练算法 三.基于单层决策树构建弱分类器 四.完整AdaBoo ...
- 《机器学习实战》chapter 07利用AdaBoosting元算法提高分类性能
第一部分:集成方法介绍 集成方法通过组合多个分类器的分类结果,获得了比简单分类器更好的分类结果 1.bagging,通过随机抽样的替换方式,得到了与原始数据集规模一样的数据集. 在S个数据集建好以后, ...
- 机器学习实践之集成方法(随机森林和AdaBoost元算法提高分类性能)
本文根据最近学习机器学习书籍网络文章的情况,特将一些学习思路做了归纳整理,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. (未添加文章标签,特此补上,2018.1.14记.) 一.概述 ...
- 使用 AdaBoost 元算法提高分类器性能
转自穆晨 阅读目录 前言 一种原始的元算法 - bagging (自举汇聚法) boost (提高任意给定学习算法精确度算法) vs bagging (自举汇聚法) AdaBoost 元算法的基本原理 ...
- 【机器学习实战】利用EM聚类算法对王者荣耀英雄进行聚类
目录 一.EM算法的步骤 二.EM算法的工作原理 三.在sklearn中创建GMM模型 四.工作流程 五.实战环节 1. 导包 2. 加载数据 3. 数据可视化分析 4. 特征工程 5. 数据规范化 ...
最新文章
- fckeditor编辑器上传文件出现invalid Request问题解决
- Spring-Security (学习记录四)--配置权限过滤器,采用数据库方式获取权限
- 如何成为强大的程序员?(转)
- Jquery中使用定时器setInterval和setTimeout
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 24丨找到连续区间的开始和结束数字【难度中等】​
- nagios安装配置pnp4nagios-0.6.6
- 被尘封的故事鸿蒙轩,被尘封的故事全任务通关人物存档
- 苹果内部文件曝光:iPhone SE3以外,还有大惊喜...
- 为何各家抢滩物联网?
- c#设计的简单登录界面
- SQL Server数据库log shipping 灾备(Part2 )
- 中小型网络工程设计与实现_小型网络如何实现经济可靠的设计和部署 (一)...
- Java基础——从数组到集合之间关键字的区别!!!!
- android播放器录制视频,Android播放器的录制实践
- 软件项目管理考前复习资料
- Aircrack-ng支持网卡列表(下)
- 数据挖掘-高斯混合模型(多元)算法的R实现
- 四、Oracle 视图
- 500元大洋学习SEO
- 创新彰显实力,方正璞华又获一项国家发明专利
热门文章
- 细思极恐——你真的会写Java吗?
- 网页客服系统设置自动回复消息,自动打招呼,可点击问题列表【唯一客服】...
- 1150文章中字符数统计(宁波)
- 海曼烟感设计部分原理图请大神分析下电路
- 【学习】推荐证券软件开发学习的网站及书籍
- HCIA-Datacom园区网络项目实战 华为认证实验手册 ENSP配置
- Java使用遗传算法实现智能组卷
- [原创]《让我们一起CCNA吧》 系列文章一:网际互连及思科认证考试介绍
- 计算机丢失xlive.dll怎么办,教你win7系统提示xlive.dll丢失的解决教程
- html+css+布局从入门到精通,CSS+DIV网页样式布局实战从入门到精通 中文pdf扫描版[48MB]...