Python学习-机器学习实战-ch07 AdaBoost
2016-05-25 11:23
507 查看
终于完成答辩了,抓紧最后学生时光学习
----------------------------------------------------------------------------------
这章里书中首先介绍了几个概念:
一、元算法(meta-algorithm)
元算法也叫集成方法(ensemble method),其思想是使用其他算法进行组合,也是常说的“三个臭皮匠凑成一个诸葛亮”。AdaBoost是其中最流行的元算法。使用集成方法时可以有多种形式:可以是不同算法的集成,也可以是同一算法在不同设置下的集成,还可以是数据集不同部分分配给不同分类器的集成。
集成方法主要有两种:bagging方法和boosting方法。
bagging方法
自举汇聚法(boostrap aggregating),也称bagging方法。
Bagging的策略【来源】:
- 从样本集中用Bootstrap采样选出n个样本
- 在所有属性上,对这n个样本建立分类器(CART or SVM or ...)
- 重复以上两步m次,i.e.build m个分类器(CART or SVM or ...)
- 将数据放在这m个分类器上跑,最后vote看到底分到哪一类
bagging方法是一种从原始数据及选择S次后得到S个新数据集的一种技术。新数据集和原数据集的大小相等。每个数据集都是通过在原始数据集中随机选择一个样本进行替换而得到的。(替换的方法可以是随机选择一个样本,再随机选择一个样本替换。)所以,新数据集中可以存在重复的值,同时,原始数据集的部分值在新数据集中不再出现。
bagging方法在S个数据集建好之后,将某个学习算法分别作用于每个数据集就得到了S个分类器。要对新数据进行分类时,就可以应用这S个分类器进行分类。选择分类器投票最多的类别作为分类结果。
-------【来源】--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Random forest(Breiman1999):
随机森林在bagging基础上做了修改。
- 从样本集中用Bootstrap采样选出n个样本,预建立CART
- 在树的每个节点上,从所有属性中随机选择k个属性,选择出一个最佳分割属性作为节点
- 重复以上两步m次,i.e.build m棵CART
- 这m个CART形成Random Forest
随机森林可以既可以处理属性为离散值的量,比如ID3算法,也可以处理属性为连续值的量,比如C4.5算法。
这里的random就是指
1. Bootstrap中的随机选择子样本
2. Random subspace的算法从属性集中随机选择k个属性,每个树节点分裂时,从这随机的k个属性,选择最优的
结果证明有时候Random Forest比Bagging还要好。今天微软的Kinect里面就采用了Random Forest,相关论文Real-time Human Pose Recognition in Parts from
Single Depth Images是CVPR2011的best paper。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
boosting方法
boosting方法是一种用来提高弱分类器算法准确度的方法。boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。
与bagging方法相比,后者是不同分类器是通过串行训练而获得,每个分类器都根据已训练出的分类器的性能来进行训练。boosting方法是集中关注被已有分类器误分的数据来获得新的分类器。bagging方法的分类器的权重是相等的,boosting方法的分类器权重并不相等,每个权重代表其对应分类器在上一轮迭代中的成功度。
AdaBoost方法是boosting方法中最流行的一个。
优点:泛化错误率低,易编码,可以用在大部分的分类器上,无参数调整。
缺点:对离群点敏感。
AdaBoost是adaptive boosting的缩写,基本思想是由若干个弱分类器组合而成一个强分类器。“弱”意味着该分类器的性能只比随机猜测要略好,但也不会好太多。,其方法是:给训练数据中的每个样本赋予一个权重,初始时权重都是相等的。首先在训练数据上训练从一个弱分类器并计算分类器的错误率。对样本的权重进行修改,分类正确的样本权重会降低,分类错误的样本权重会提高。对权重修改后的样本再次训练出一个分类器。每个弱分类器自身也有一个权重值,由分类器的错误率决定。在更新样本的权重后进入下一次迭代。最终的强分类器由弱分类器加权求和而成。
书中的可视化图有错误。
可视化代码如上所示。
接着开始实现adaboost,首先使用单层决策树作为弱分类器。
这是一个简单的根据阈值进行分类的函数。
一个简单版单层决策树函数。
----------------------------------------------------------------------------------
这章里书中首先介绍了几个概念:
一、元算法(meta-algorithm)
元算法也叫集成方法(ensemble method),其思想是使用其他算法进行组合,也是常说的“三个臭皮匠凑成一个诸葛亮”。AdaBoost是其中最流行的元算法。使用集成方法时可以有多种形式:可以是不同算法的集成,也可以是同一算法在不同设置下的集成,还可以是数据集不同部分分配给不同分类器的集成。
集成方法主要有两种:bagging方法和boosting方法。
bagging方法
自举汇聚法(boostrap aggregating),也称bagging方法。
Bagging的策略【来源】:
- 从样本集中用Bootstrap采样选出n个样本
- 在所有属性上,对这n个样本建立分类器(CART or SVM or ...)
- 重复以上两步m次,i.e.build m个分类器(CART or SVM or ...)
- 将数据放在这m个分类器上跑,最后vote看到底分到哪一类
bagging方法是一种从原始数据及选择S次后得到S个新数据集的一种技术。新数据集和原数据集的大小相等。每个数据集都是通过在原始数据集中随机选择一个样本进行替换而得到的。(替换的方法可以是随机选择一个样本,再随机选择一个样本替换。)所以,新数据集中可以存在重复的值,同时,原始数据集的部分值在新数据集中不再出现。
bagging方法在S个数据集建好之后,将某个学习算法分别作用于每个数据集就得到了S个分类器。要对新数据进行分类时,就可以应用这S个分类器进行分类。选择分类器投票最多的类别作为分类结果。
-------【来源】--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Random forest(Breiman1999):
随机森林在bagging基础上做了修改。
- 从样本集中用Bootstrap采样选出n个样本,预建立CART
- 在树的每个节点上,从所有属性中随机选择k个属性,选择出一个最佳分割属性作为节点
- 重复以上两步m次,i.e.build m棵CART
- 这m个CART形成Random Forest
随机森林可以既可以处理属性为离散值的量,比如ID3算法,也可以处理属性为连续值的量,比如C4.5算法。
这里的random就是指
1. Bootstrap中的随机选择子样本
2. Random subspace的算法从属性集中随机选择k个属性,每个树节点分裂时,从这随机的k个属性,选择最优的
结果证明有时候Random Forest比Bagging还要好。今天微软的Kinect里面就采用了Random Forest,相关论文Real-time Human Pose Recognition in Parts from
Single Depth Images是CVPR2011的best paper。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
boosting方法
boosting方法是一种用来提高弱分类器算法准确度的方法。boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。
与bagging方法相比,后者是不同分类器是通过串行训练而获得,每个分类器都根据已训练出的分类器的性能来进行训练。boosting方法是集中关注被已有分类器误分的数据来获得新的分类器。bagging方法的分类器的权重是相等的,boosting方法的分类器权重并不相等,每个权重代表其对应分类器在上一轮迭代中的成功度。
AdaBoost方法是boosting方法中最流行的一个。
优点:泛化错误率低,易编码,可以用在大部分的分类器上,无参数调整。
缺点:对离群点敏感。
AdaBoost是adaptive boosting的缩写,基本思想是由若干个弱分类器组合而成一个强分类器。“弱”意味着该分类器的性能只比随机猜测要略好,但也不会好太多。,其方法是:给训练数据中的每个样本赋予一个权重,初始时权重都是相等的。首先在训练数据上训练从一个弱分类器并计算分类器的错误率。对样本的权重进行修改,分类正确的样本权重会降低,分类错误的样本权重会提高。对权重修改后的样本再次训练出一个分类器。每个弱分类器自身也有一个权重值,由分类器的错误率决定。在更新样本的权重后进入下一次迭代。最终的强分类器由弱分类器加权求和而成。
def loadSimpleData(): datMat=matrix([[1.,2.1],[2.,1.1],[1.3,1.],[1.,1.],[2.,1.]]) classLabel=[1.0,1.0,-1.0,-1.0,1.0] return datMat,classLabel基础数据函数,可视化结果如下:
书中的可视化图有错误。
n=shape(dataMat)[0] xcord1=[];ycord1=[] xcord2=[];ycord2=[] for i in range(n): if int(classLabel[i])== 1: xcord1.append(dataMat[i,0]);ycord1.append(dataMat[i,1]) else: xcord2.append(dataMat[i,0]);ycord2.append(dataMat[i,1]) fig=plt.figure() ax=fig.add_subplot(111) ax.scatter(xcord1,ycord1,s=30,c='red',marker='s') ax.scatter(xcord2,ycord2,s=30,c='green') plt.show()
可视化代码如上所示。
接着开始实现adaboost,首先使用单层决策树作为弱分类器。
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq): #函数在数据与阈值比较进行分类 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): #找到数据集上最佳单层决策树,D是数据对应的权重向量 dataMatrix=mat(dataArr) labelMat=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) #根据步长设置阈值 predictedVals=stumpClassify(dataMatrix,i,threshVal,inequal) #按照阈值分类,最简单的分类方法 errArr=mat(ones((m,1))) errArr[predictedVals==labelMat]=0 #统计错误个数 weightedError=D.T*errArr #错误样本的加权求和 print("split: dim %d, thresh %.2f, thresh inequal:%s, the weighted error is %.3f" %(i,threshVal,inequal,weightedError)) if weightedError<minError: minError=weightedError bestClassEst=predictedVals.copy() bestStump['dim']=i bestStump['thresh']=threshVal bestStump['ineq']=inequal return bestStump,minError,bestClassEst
一个简单版单层决策树函数。
相关文章推荐
- Python的Twisted框架中使用Deferred对象来管理回调函数
- 《零基础学习Python》01
- Python(xy)下载地址、安装教程、使用教程
- Python:模块(二)
- python中json/simplejson 序列化/dumps 自定义类型
- 使用Python的Twisted框架构建非阻塞下载程序的实例教程
- python学习07-文件和输入输出
- python监视mysql最大连接数
- Python中matplotlib pyplot常用的一些使用方法[Python 3.x]
- python初学(0)python简介(python初学之路)
- python初学(1)字符串
- Python的Twisted框架上手前所必须了解的异步编程思想
- 老中医根治python编码问题2
- 士兵突击python/Cython
- 老中医---根治python编码问题(unicode,str等)
- python 爬虫登陆学校教务系统之验证码识别
- 01 Python概述
- Python学习 (五 面向对象编程)
- leetcode 35. Search Insert Position-二分查找|递归|非递归
- Python 面向对象 —— __slots__ 与 @property(python 下的 getter、setter 方法)