您的位置:首页 > 编程语言 > Python开发

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的缩写,基本思想是由若干个弱分类器组合而成一个强分类器。“弱”意味着该分类器的性能只比随机猜测要略好,但也不会好太多。,其方法是:给训练数据中的每个样本赋予一个权重,初始时权重都是相等的。首先在训练数据上训练从一个弱分类器并计算分类器的错误率。对样本的权重进行修改,分类正确的样本权重会降低,分类错误的样本权重会提高。对权重修改后的样本再次训练出一个分类器。每个弱分类器自身也有一个权重值,由分类器的错误率决定。在更新样本的权重后进入下一次迭代。最终的强分类器由弱分类器加权求和而成。

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


一个简单版单层决策树函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: