入门认知

集成学习:集成多个学习器来完成学习任务。主要分为两类: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

参考:

https://www.cnblogs.com/ScorpioLu/p/8295990.html

 https://cuijiahua.com/blog/2017/11/ml_10_adaboost.html

01-20 01:01