初始的想法就是,结合不同的分类算法来给出综合的结果,会比较准确一些 
称为ensemble methods or meta-algorithms,集成方法或元算法

集成方法有很多种,可以是不同算法之间的,也可以是同一个算法但不同参数设置之间的,也可以是将数据集分成多分给不同的分类器之间的 
总的来说,有3个维度可以进行集成,算法,算法参数和数据集

下面简单介绍两种比较流行的元算法思路,

1. Building classifiers from randomly resampled data: bagging

bagging又称为bootstrap aggregating 
想法比较简单,对大小为n的训练集做n次放回随机抽样,形成新的大小仍然为n的训练集 
因为是放回随机抽样,新的训练集中可能有重复,某些训练集中的样本中新的训练集中也会没有 
用这个方法,产生s个新的训练集,对同一个分类算法可以产生s个不同参数的分类器 
使用时,让s个分类器,多数投票表决来决定最终的分类结果

比较典型的bagging算法,如随机森林(random forest) 
首先采用bootstrap取样,用产生新的训练集生成决策树,并且用在新训练集中没有抽样到样本作为测试集 
如果有S个新的训练集,就会产生S个决策树,所以称为森林 
所谓随机,首先新训练集是随机抽样产生的 
再者,在训练决策树的时候,每个树节点会随机选择m个特征(m<<M总特征数) 
参考,http://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97

2. Boosting

下面主要介绍Boosting中最流行的AdaBoost算法,这里主要介绍实现,理论参考前一篇

我们使用单层决策树,即decision stump 决策树桩作为弱分类器 
所谓decision stump,就是只对一个特征做一次划分的单节点的决策树

这个弱分类器足够简单,但是如果直接使用,基本没用, 
比如对于底下这个很简单的训练集,用一个decision stump都无法完全正确分类,试着在x轴或y轴上做一次划分

虽然无法完全正确分类,但是我们需要找到误差最小的那个decision stump 
方法很简单,在x和y的取值范围内,以一定的步长,遍历比较误差

先实现stump分类, 
dataMatrix,一行表示一个训练样本,每列表示一个特征 
dimen,表示哪个特征 
threshVal,阀值 
threshIneq,对于decision stump,只存在less than或greater than

def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):retArray = ones((shape(dataMatrix)[0],1))if threshIneq == 'lt': #lt,less thanretArray[dataMatrix[:,dimen] <= threshVal] = -1.0 #boolean indexingelse:retArray[dataMatrix[:,dimen] > threshVal] = -1.0return retArray

所以给定上面的参数,就是可以判断每个样本的分类是1或-1

下面给出求解最优stump分类器的算法, 
参数中有个D向量,表示样本weight 
因为这里是要找到加权样本误差最小的stump分类器

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  #inf,python中表示无穷大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']:    #尝试划分的方向,less than或greater thanthreshVal = (rangeMin + float(j) * stepSize)predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal) #进行stump分类errArr = mat(ones((m,1)))  #初始化误差为1errArr[predictedVals == labelMat] = 0  #计算误差,将分对的误差设为0weightedError = D.T*errArr   #计算加权误差if weightedError < minError: #如果小于minError,说明我们找到更优的stump分类器minError = weightedErrorbestClasEst = predictedVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequalreturn bestStump,minError,bestClasEst

好,现在可以给出AdaBoost算法的源码,

def adaBoostTrainDS(dataArr,classLabels,numIt=40):weakClassArr = []m = shape(dataArr)[0]  #样本数D = mat(ones((m,1))/m)   #初始化样本weight,所有样本权值相等为1/maggClassEst = mat(zeros((m,1))) #累积分类结果  for i in range(numIt):  #生成多少个弱分类器bestStump,error,classEst = buildStump(dataArr,classLabels,D) #计算最优的stump分类器print "D:",D.Talpha = float(0.5*log((1.0-error)/max(error,1e-16))) #1.计算该分类器的权值bestStump['alpha'] = alphaweakClassArr.append(bestStump)print "classEst: ",classEst.Texpon = multiply(-1*alpha*mat(classLabels).T,classEst)D = multiply(D,exp(expon))   #2.更新样本权值D = D/D.sum()aggClassEst += alpha*classEst   #3.更新累积分类结果print "aggClassEst: ",aggClassEst.TaggErrors = multiply(sign(aggClassEst) !=   #计算累积分类误差mat(classLabels).T,ones((m,1)))errorRate = aggErrors.sum()/mprint "total error: ",errorRate,"\n"if errorRate == 0.0: break   #4.误差为0,算法结束return weakClassArr

其中,

1. 计算分类器权值的公式为,

max(error,1e-16),这个是为了防止error为0

2. 更新样本权值的公式为,

即判断正确时,减小权值,而错误时,增大权值

expon = multiply(-1*alpha*mat(classLabels).T,classEst) 
-alpha×classLabel×classEst,即如果分类正确,classLable=classEst,仍然得到-alpha,否则得到alpha

3. aggClassEst

因为我们最终在分类时,是用多个弱分类器的综合结果 
所以这里每生成一个弱分类器,我们就把它的分类结果加到aggClassEst上,aggClassEst += alpha*classEst

aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))

用于aggClassEst是float类型,所以先使用sign转换成1,-1,0 
然后!= mat(classLabels).T,会产生一个boolean的向量 
小技巧,这里为何要乘上一个全1的向量,因为需要把boolean类型转换为int

可以在python试下,

>>> (1 == 1) *1 
1

4.最终当所有弱分类器综合误差为0时,就不需要继续迭代了

下面看看,如何用AdaBoost算法进行分类

def adaClassify(datToClass,classifierArr):dataMatrix = mat(datToClass)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'])aggClassEst += classifierArr[i]['alpha']*classEstprint aggClassEstreturn sign(aggClassEst)
2014-08-28

Machine Learning in Action -- AdaBoost相关推荐

  1. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例

    MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 ApacheCN - 学习机器学习群[629470233] Machine Learning in ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  3. Machine Learning In Action 第二章学习笔记: kNN算法

    本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...

  4. Machine Learning in Action 读书笔记---第5章 Logistic回归

    Machine Learning in Action 读书笔记 第5章 Logistic回归 文章目录 Machine Learning in Action 读书笔记 一.Logistic回归 1.L ...

  5. Machine Learning in Action 读书笔记---第3章 决策树

    Machine Learning in Action 读书笔记 第3章 决策树 文章目录 Machine Learning in Action 读书笔记 一.决策树算法简介 1 决策树的构造 2 决策 ...

  6. Machine Learning in Action(5) SVM算法

    做机器学习的一定对支持向量机(support vector machine-SVM)颇为熟悉,因为在深度学习出现之前,SVM一直霸占着机器学习老大哥的位子.他的理论很优美,各种变种改进版本也很多,比如 ...

  7. 《Machine Learning in Action》—— 剖析支持向量机,优化SMO

    手撕机器学习系列文章就暂时更新到此吧,目前已经完成了支持向量机SVM.决策树.KNN.贝叶斯.线性回归.Logistic回归,其他算法还请允许Taoye在这里先赊个账,后期有机会有时间再给大家补上. ...

  8. Machine Learning in Action 读书笔记---第4章 基于概率论的分类方法:朴素贝叶斯

    Machine Learning in Action 读书笔记 第4章 基于概率论的分类方法:朴素贝叶斯 文章目录 Machine Learning in Action 读书笔记 一.基于贝叶斯决策理 ...

  9. 《Machine Learning in action》- (笔记)之Logistic regression(2_实战篇)

    <Machine Learning in action>,机器学习实战(笔记)之Logistic regression 使用工具 - Python3.7 - pycharm - anaco ...

最新文章

  1. java强引用弱引用_Java 的强引用、弱引用、软引用、虚引用
  2. python栈溢出_Python栈溢出【新手必学】
  3. 微服务落地,我们在考虑什么?
  4. [BZOJ] 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐
  5. AngularJS开发指南14:AngularJS的服务详解
  6. 远程过程调用(Remote Procedure Call,RPC)
  7. 软件开发过程(CMMI/RUP/XP/MSF)是与非?
  8. scrapy获取a标签的连接_python爬虫——基于scrapy框架爬取网易新闻内容
  9. 财税、管理知识,离您那么远吗?
  10. 面向.NET开发人员的Dapr——参考应用程序
  11. 毕业论文计算机附录模板,毕业论文格式是什么,附录又是什么?
  12. Vicdas实时历史数据库
  13. 用于制作服装的天然纤维简介(动植物纤维)
  14. 学英语《每日一歌》之Traveling Light
  15. 华为笔记本软件商店_华为应用市场
  16. 【算法笔记】二叉树之基础遍历
  17. 界面布局上大胆突破,关注到的细分领域
  18. 无障碍建筑设计相关术语
  19. 网页制作如何去掉下划线
  20. Android OTA升级包制作和验证

热门文章

  1. 双线一柱变色MACD指标
  2. 我和电赛的成长故事与总结#2019年全国大学生电子设计竞赛#
  3. GSEA介绍--鹏鹏原创,必是精品
  4. 如何手动结束Python的子线程和子进程
  5. dell设置从ssd启动_2. 戴尔电脑如何设置固态硬盘启动?
  6. HTML鼠标滚轮事件
  7. linux中i的英文单词,i的发音有几种
  8. 求助vmbox更新之后打不开了
  9. 七色的寒冷彩虹便冒了出来
  10. 利用批处理脚本批量删除电脑上的空文件夹