入门认知
集成学习:集成多个学习器来完成学习任务。主要分为两类:Bagging和Boosting。
Bagging:自举汇聚法,从样本种随机取出n个样本作为训练样本,用完放回,这样进行k次得到K个训练集(这K个训练集中的样本可能有相同的,也可能相互之间完全不一样),这样使用K个训练器(可以一样,也可以不同)得到K个结果,最后对着K个结果进行投票,那种结果票数最多就认为最终结果是什么。(当然也可以是取均值)
Boosting:使用全部样本进行训练,每一轮的训练都是基于上一次的,所以目标是找到一个函数来拟合上一轮训练的残差。当残差足够小或者达到最大迭代次数时终止。
两者的区别:
样本选择上:Bagging是取出n个,用完放回去,不同的分类器用的样本可能是不同的。而Boosting是整个样本,并且迭代过程中都是一样的样本。
样例权重上:Bagging权重都一样,而Boosting根据错误率改变权重,错误率大的权重大。
顺序:Bagging是并行计算的,各个分类器是独立的。Boosting是顺序的,需要在前一轮模型的结果上进行。
总的来说Bagging是降低variance而boost是降低bias。理由看链接https://www.zhihu.com/question/26760839/answer/40337791
AdaBoost是一种流行的boosting类集成学习算法:
算法流程:
看完上面流程,结合Boosting的思路,应该就能对Adaboost差不多懂了。但是具体权重公式的推导还要在往下看看。
上面提到的指数损失函数可以在看看以下总结:https://www.cnblogs.com/shixiangwan/p/7953591.html
代码
1 def adaBoostTrainDS(dataArr, classLabels, numIt = 40): 2 weakClassArr = [] 3 m = np.shape(dataArr)[0] 4 D = np.mat(np.ones((m, 1)) / m) #初始化权重 5 aggClassEst = np.mat(np.zeros((m,1))) 6 for i in range(numIt): 7 bestStump, error, classEst = buildStump(dataArr, classLabels, D) #构建单层决策树 8 print("D:",D.T) 9 alpha = float(0.5 * np.log((1.0 - error) / max(error, 1e-16))) #计算弱学习算法权重alpha,使error不等于0,因为分母不能为0 10 bestStump['alpha'] = alpha #存储弱学习算法权重 11 weakClassArr.append(bestStump) #存储单层决策树 12 print("classEst: ", classEst.T) 13 expon = np.multiply(-1 * alpha * np.mat(classLabels).T, classEst) #计算e的指数项 14 D = np.multiply(D, np.exp(expon)) 15 D = D / D.sum() #根据样本权重公式,更新样本权重 16 #计算AdaBoost误差,当误差为0的时候,退出循环 17 aggClassEst += alpha * classEst 18 print("aggClassEst: ", aggClassEst.T) 19 aggErrors = np.multiply(np.sign(aggClassEst) != np.mat(classLabels).T, np.ones((m,1))) #计算误差 20 errorRate = aggErrors.sum() / m 21 print("total error: ", errorRate) 22 if errorRate == 0.0: break #误差为0,退出循环 23 return weakClassArr, aggClassEst
参考: