机器学习实战之adaboost
来源:互联网 发布:java vs python 编辑:程序博客网 时间:2024/05/16 17:58
1.概念定义
(1)元算法(meta-algorithm)/集成方法(ensemble method): 是对其他算法进行组合的一种方式.有多种集成方式:
- 不同算法的集成;
- 同一算法在不同设置下的集成
- 数据集不同部分分配给不同分类器之后的集成
(2)单层决策树(decision stump ): 是一个只有一个节点的决策树;仅仅基于单个特征来做决策.只有一个分裂过程.例如大于5的为类型1,小于5的类型为-1;
2. 几种集成算法
(1)bagging,自举汇聚法(bootstrap aggregating):
- 是从原始数据集中选择s次得到s个新数据集的一种方法,新数据集和原始数据集大小一样,每个数据集都是通过在原始数据集中随机选择一个样本组合而成的,这属于有放回的采样,这一特点使得原始数据集中可以有重复的值,且原始数据集中的有些值在新数据集中不出现.
- 得到s个数据集之后,使用某个学习算法(例如决策树等等)分别作用于每个数据集得到s个分类器.
- 当进行分类时,应用这s个分类器分别对新数据进行分类,选择分类器分类结果中最多的类别作为最后的分类结果.
(2)boosting
- 不同的分类器是通过串行训练得到的,而bagging是并行的,不同分类器是相互独立的;每个新分类器都根据已训练出的分类器的性能来进行训练.boosting通过关注被已有分类器错分类的那些数据来获得新的分类器.
- boosting的分类结果是基于所有分类器的加权求和结果的,bagging中分类器权重都是一样的,boosting中的分类器权重不相等,每个权重代表其对应分类器在上一轮迭代中的正确分类率.
3.adaboost(adaptive boosting)
(1)一般流程
- 准备数据:依赖于选择的弱分类器,本次将选择单层决策树,这种分类器可以处理任何数据类型;作为弱分类器,简单分类器的效果更好.
- 训练算法:adaboost的大部分时间使用在训练上,分类器将多次在同一数据集上训练若分类器;
- 测试算法:计算错分类的概率
- 使用场所:adaboost预测属于两个类别中的哪一个.若要将其使用在多分类场合,要做一定的修改.
(2)运行过程
- 训练数据中的每个样本,并赋予其一个权重,权重向量为W,权重初始化为相等值;即1/所有的样本数
- 首先在训练数据上训练出一个弱分类器并计算其分类的错误率,错误率=未正确分类的样本数/所有样本数
- 继续在同一数据集上训练另一个弱分类器,在第二次训练之前,将会调整每个训练样本的权重值,其中第一次分对的样本的权重会降低,第一次分错的样本权重会提高.
- 为了将所有的弱分类器组合得到最终的分类器,adaboost为每个弱分类器分配了一个权重值alpha,这些alpha值基于每个弱分类器的错误率计算的, alpha=1/2*ln((1-错误率)/错误率)
- 根据alpha值对每个样本的权重进行修改:修改规则是正确分类的权重降低,错分类的权重增加
- 更新样本权重之后,开始第二次训练.不断重复训练的调整权重的过程,直到训练错误率为0或者弱分类器的数目达到用户的指定值为止.
(3)代码实现
- 单层决策树生成
<span style="font-size:14px;">def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):returnArray = ones((shape(dataMatrix)[0],1))if threshIneq == 'lessthan':returnArray[dataMatrix[:,dimen] <= threshVal] = -1.0else:returnArray[dataMatrix[:,dimen] > threshVal] = -1.0return returnArray</span>
下面的函数产生当前权重向量下最适合数据集的单层决策树;输入训练样本数据集以及其对应的类别标签,D是样本权重向量.
<span style="font-size:14px;">def buildStump(dataArr,classLabels,D):dataMatrix = mat(dataArr); labelMatrix = mat(classLabels).Tm,n = shape(dataMatrix)numSteps = 10.0;bestStump ={}bestClasEst = mat(zeros((m,1)))minError = inffor 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 ['lessthan','greaterthan']:threshVal = rangeMin + float(j) * stepSizepredictVals = stumpClassify(dataMatrix,i,threshVal,inequal)errArr = mat(ones((m,1)))errArr[predictVals == labelMatrix] = 0weightedError = D.T * errArr #根据权重向量计算错误分类误差if weightedError < minError:minError = weightedErrorbestClasEst = predictVals.copy()bestStump['dim'] = ibestStump['thresh'] = threshValbestStump['ineq'] = inequalreturn bestStump,minError,bestClasEst </span>
- adaboost训练算法
实现伪代码如下:
对每次迭代:
利用buildStump()函数找到基于当前样本权重向量D下的最佳决策单层决策树
将最佳单层决策树加入到单层决策树数组
计算alpha
计算新的样本权重向量D
更新集成的类别估计值(已有的弱分类器分类结果的叠加)
如果错误率等于0,则退出循环
实现代码:
<span style="font-size:14px;">def adaBoostTrain(dataArr,classLabels,numIter = 40):weakClassifier = [] #存储每个弱分类器的信息m,n = shape(dataArr)#initialize the weight of every sampleW = mat(ones((m,1))/m)aggClassEst = mat(zeros((m,1))) #累计类别的估计值,将已有的弱分类器的反而类结果乘以它们对应的权重加起来,构成最后的分类器for i in range(numIter):bestStump,error,classEst = buildStump(dataArr,classLabels,W)#print "W:" , W.Talpha = float(0.5*log((1.0-error)/max(error,1e-16))) #分母不只是error,是为了确保在没有错误时不睡发生除0溢出.故取其和一个很小值的最大值,防止errro为0的情况发生bestStump['alpha'] = alphaweakClassifier.append(bestStump)#print "classEst: ",classEst.Texpon = multiply(-1*alpha*mat(classLabels).T,classEst) W = multiply(W,exp(expon))W = W/W.sum()aggClassEst += alpha*classEst#print "aggClassEst: ", aggClassEst.TaggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1))) #sign是为了得到二值分类结果errorRate = aggErrors.sum()/mprint "the error is : ",errorRate,"\n"if errorRate == 0.0:breakreturn weakClassifier</span>
- adaboost分类函数
所有弱分类器的加权求和就是最后的结果.输入为待分类的特征向量以及训练得到的弱分类器的数组集合.
<span style="font-size:14px;">def adaClassify(dataToClass,classifier):dataMatrix = mat(dataToClass)m = shape(dataMatrix)[0]aggClassEst = mat(zeros((m,1)))for i in range(len(classifier)):classEst = stumpClassify(dataMatrix,classifier[i]['dim'],classifier[i]['thresh'],classifier[i]['ineq'])aggClassEst += classifier[i]['alpha'] * classEst #弱分类器的加权结果求和print aggClassEstreturn sign(aggClassEst) #得到二值分类结果</span>
0 0
- 机器学习实战之adaboost
- 《机器学习实战》之Adaboost
- 机器学习实战--adaboost
- 机器学习实战----AdaBoost
- 机器学习实战 adaBoost
- 机器实战之AdaBoost
- 《机器学习实战》7:Adaboost
- python机器学习实战:Adaboost
- 机器学习之AdaBoost
- 机器学习 之 Adaboost
- 机器学习之Adaboost
- 机器学习之白话与实战adaboost元算法
- Python学习-机器学习实战-ch07 AdaBoost
- 【机器学习算法】之Adaboost
- 机器学习之Adaboost算法
- 机器学习实战笔记7(Adaboost)
- 机器学习实战-Adaboost(自适应boosting)
- 机器学习实战(6)--AdaBoost
- 1051. 复数乘法 (15)
- Learning Gulp
- windows下安装python出现2503错误的解决办法
- 重载重写区别
- 【BZOJ3302】[Shoi2005]树的双中心【DFS】【TreeDP】
- 机器学习实战之adaboost
- JsonObject 简介
- CentOS6.5安装卸载MySql
- Java集合框架里ArrayList Vector和LinkedList的区别
- Spring实战-注入Bean属性(二)
- 项目系统-菜鸟程序员第一篇-成长记录
- Innodb MVCC的实现分析
- 动态链接库 初识dll
- css3中的变形(transform)、过渡(transtion)、动画(animation)