《机器学习实战》7:Adaboost
来源:互联网 发布:matlab计算矩阵行列式 编辑:程序博客网 时间:2024/05/02 02:25
已经有三个月的时间没有写博文了,书倒是一直在看。实战看完了,看大数据,大数据看的差不多了,最近开始看《统计学习方法》,就是没有很好的记录下来,惭愧......
之前的几章都讲的是具体的分类器,这一章的Adaboost是一种组合算法。也就是依赖于原有的分类器,进行了战术上的提升,用比较基础的分类器(弱分类器)构建出一个强分类器。在思想是是一种集集体智慧的策略,即“三个臭皮匠赛过诸葛亮”。
定义:说到boosting算法,就不得提一提bagging算法,他们两个都是把一些弱分类器组合起来来进行分类的方法,统称为集成方法(ensemble method)。类似于投资,“不把鸡蛋放在一个篮子”,虽然每个弱分类器分类的不那么准确,但是如果把多个弱分类器组合起来可以得到相当不错的结果,另外要说的是集成方法还可以组合不同的分类器,而Adaboost和boosting算法的每个弱分类器的类型都一样的。他们两个不同的地方是:boosting的每个弱分类器组合起来的权重不一样,本节的Adaboost就是一个例子,而bagging的每个弱分类器的组合权重是相等,代表的例子就是random forest。Random forest的每个弱分类器是决策树,输出的类别有多个决策树分类的类别的众数决定。
简单的说,Adaboost就是不断的对同样的数据使用同一个分类器进行分类,直到所有的数据都分类完毕,或是达到迭代的次数为止。这是一个串行训练的过程,在每个迭代过程中,分类器和数值的权重都不一样,下次的权重会依赖于当前分类器的分类结果。
具体算法:
(1)分类器的系数(权重)和分类器的错误率相关,具体如下:
(2)数据的权值:对于分类器分类正确的数据减小它的权值,相反对于分类器分错的数据增大它的权值,这样使得我们在下次的分类过程中更加关注那些被分错的数据,具体的公式如下:
以上我们就概括了Adaboost的整个算法,接下来我们就要选择一个分类器,进行Adaboost的实现。
弱分类器:单层决策树
其实就是一个单节点的决策树。构造单层决策树,这部分的构造的思路和前面的决策树是一样的,只是这里的评价体系不是熵而是加权的错误率,这里的加权是通过数据的权重D来实现的,每一次build权重都会因上一次分类结果不同而不同。
单层决策树的伪代码:
将minError设置为无穷大
对数据集中的每一个属性
对每个步长(第二层循环):
对每个不等号:
建立一棵单层决策树并利用加权数据集对其进行测试
如果错误率低于minError,则将当前的决策树设为最佳单层决策树
返回最佳单层决策树
下面进行代码的实现,首先建立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接下来按照伪代码实现单层决策树:
def buildStump(dataArr,classLables,D): dataMatrix=mat(dataArr) #.T表示转置 labelMat=classLables.T #m表示数据集个数,n表示属性个数 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']: threshValue=(rangeMin+float(j)*stepSize) predictVals=stumpClassify(dataMatrix,i,threshValue,inequal) #计算误差,初始化错误矩阵为1,如果判断正确则设置为0 errArr=mat(ones((m,1))) # print predictVals==labelMat errArr[predictVals==labelMat]=0 weightedError=D.T*errArr print "split: dim %d, thresh %.2f, thresh inequal: %s, the weighted error: %.3f" \ %(i, threshValue, inequal, weightedError) if weightedError < minError: minError = weightedError bestClassEst = predictVals.copy() bestStump['dim']=i bestStump['thresh']=threshValue bestStump['ineq']=inequal return bestStump,minError,bestClassEst;测试代码:
...................
这样我们就找到了一个弱分类器,有了这个弱分类器,接下来我们只需要根据公式构建Adaboost即可。
伪代码如下:
对每次迭代:
利用buildStump找到最佳的单层决策树
将最佳单层决策树加入数组
计算分类器系数alpha
计算新的权重D
更新累计类别估计值
如果错误率为0.0,跳出循环
继续编辑代码如下:
#numIt表示循环次数def adaBoostTrainDS(dataArr, classLabels, numIt = 40): #用于存放弱分类器的数组 weakClassArr = [] #数据个数 m = shape(dataArr)[0] #权重初始化为相等值1/m D = mat(ones((m,1))/m) aggClassEst = mat(zeros((m,1))) for i in range(numIt): bestStump, error, classEst = buildStump(dataArr, classLabels, D) print "D:", D.T #计算alpha alpha = float(0.5*log((1.0-error)/max(error,1e-16))) bestStump['alpha']=alpha weakClassArr.append(bestStump) print "classEst: ", classEst.T #这里需要说明一下,对于classLabels表示数据应该属于哪一类,classEst表示预测的分类结果,两者都为-1,1的list #如果分对了,两者相乘结果为1,相反为-1.正好符合提到的公式 expon = multiply(-1*alpha*mat(classLabels).T, classEst) D = multiply(D, exp(expon)) D = D/D.sum() 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测试程序得到如下结果:
从上面的结果可以看出,如果对某个数据分错了,adaboost在下一次分类中会增加分错数据的权重,直到所有的数据都分类正确为止。
下面我们看一下完整的分类器:
这样我们就完成了整个算法的实现。
- 《机器学习实战》7:Adaboost
- 机器学习实战--adaboost
- 机器学习实战----AdaBoost
- 机器学习实战 adaBoost
- 机器学习实战笔记7(Adaboost)
- 机器学习实战-7AdaBoost提升算法
- 机器学习实战第7章-Adaboost
- 机器学习实战之adaboost
- 《机器学习实战》之Adaboost
- python机器学习实战:Adaboost
- Python学习-机器学习实战-ch07 AdaBoost
- 机器学习实战-Adaboost(自适应boosting)
- 机器学习实战(6)--AdaBoost
- AdaBoost算法理解基于机器学习实战
- 机器学习实战【8】(AdaBoost)
- 机器学习实战——AdaBoost
- 机器学习实战-AdaBoost-python代码
- 机器实战之AdaBoost
- C# 结构体—struct
- Android Studio中support版本错误问题的处理
- 第17周项目2—传地址的方法
- 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片
- sql TNS:protocol adapter error
- 《机器学习实战》7:Adaboost
- 网格布局GridLayout
- Maven by Example 3.1. Introduction
- 基于51单片机的多任务多进程
- C# Active Directory通过objectGUID获取DirectoryEntry对象
- C#去除HTML标签
- 第17周 项目2-引用作参数(2)
- plupload上传插件绑定事件的两种方法
- Win7/win8下Cocos2dx-3.X游戏引擎的环境搭建