pythonxuexi 2019-06-28
1.介绍
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)
2.算法逻辑
1、先通过对N个训练样本的学习得到第一个弱分类器; 2、将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器; 3、将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器 4、最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。
3.实现(参考西瓜书及机器学习实战)
#adaBoost实现 def adaBoostTrain(dataArr,classLabels,numIt=40): weakClassArr = [] m = np.shape(dataArr)[0] D = np.mat(np.ones((m,1))/m) #初始化权重,每个feature都一样 aggClassEst = np.mat(np.zeros((m,1))) #唯一的入参是迭代次数,要么error为 0跳出循环 ,要么循环次数达到numIt 的时候跳出循环 for i in range(numIt): # 决策树桩算法,也可以换成其他的算法 bestStump,error,classEst = buildStump(dataArr,classLabels,D) #print "D:",D.T alpha = float(0.5*np.log((1.0-error)/max(error,1e-16)))#计算alpha值 bestStump['alpha'] = alpha weakClassArr.append(bestStump) #print "classEst: ",classEst.T #重新计算权重 expon = np.multiply(-1*alpha*np.mat(classLabels).T,classEst) D = np.multiply(D,np.exp(expon)) D = D/D.sum() aggClassEst += alpha*classEst aggErrors = np.multiply(np.sign(aggClassEst) != np.mat(classLabels).T,np.ones((m,1))) errorRate = aggErrors.sum()/m print "total error: ",errorRate if errorRate == 0.0: break print "weakClassArr:",weakClassArr print "aggClassEst:", aggClassEst return weakClassArr,aggClassEst