如果需要完整代码可以关注下方公众号,后台回复“代码”即可获取,阿光期待着您的光临~
文章目录
- 一、集成学习
- 二、AdaBoost算法
- 1.Boosting提升方法
- 2.AdaBoost算法思想
- 3.AdaBoost原理解释
- 4.构造损失函数,求解参数
- 5.前向分步算法
2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。
一、集成学习
我们平常使用的大多数模型都为单模型方式,有时单模型方式可能会造成误判或者过拟合的现象,所以我们就像能不能有一种方式可以融合多个模型,这就产生了集成学习的概念。
集成学习通过构建多个分类器来完成学习任务,有时被称为多分类器系统,它是基于多个分类器共同完成模型的生成,集成学习一般情况为模型内部集成了多个小的模型,有时也叫做个体学习器,举个例子,我们的决策树是一个过拟合非常严重的模型,所以只使用一棵树进行拟合数据不太靠谱,所以我们考虑使用多颗树进行建模,模型的最终结果参考多颗树模型的结果。
集成学习有种3个臭皮匠顶个诸葛亮的感觉,比如对于一个复杂的事情,如果我们只听取一个人的意见往往可能做出错误的判断,所以我们需要参考多个人的意见。
一般情况下集成学习内部的学习器都为弱学习器,所谓的弱学习器就是单独进行建模的准确率不是特别高,但是要高于盲猜,强学习器就是一般不适用集成学习,就自己建模也会产生很好的拟合效果,但是大多数情况下,我们集成学习内部使用的是弱学习器,而不是强学习器,这是因为强学习器往往会产生过拟合的现象,如果又是集成学习,多个强学习器共同作用,那么过拟合则为更加严重,所以我们使用弱学习器作为基分类器,我们希望的是每个基分类器能够学习到数据的不同特征,术业有专攻。
比如我们组建一支队伍时,我们希望每个队员都可以有自己较为厉害的能力,而不是每个人都掌握相同的能力,我们的集成学习算法也是如此,我们希望每个基分类器能够学习数据不同特征,然后进行组合这些分类器,然后就可以产生一个强分类器来拟合整个数据集。
如果集成模型要获得好的性能,需要我们每个个体学习器应该有各自的特点,即多样性。
现在目前的集成学习方法大概分为两类:
- Boosting:个体学习器之间存在强依赖关系、必须串行生成的序列化方法,典型算法:AdaBoost、GBDT
- Bagging:个体学习器不存在强依赖关系、可同时生成的并行化方法,典型算法:随机森林
本篇着重讲解采用Boosting提升方法的AdaBoost。
二、AdaBoost算法
1.Boosting提升方法
对于分类问题而言,我们的集成学习方式采用了多个基学习器,我们会使用这些基学习器先去拟合数据,然后组合这些弱分类器,构成一个强分类器,然而在学习基学习器的过程中,我们希望每个基学习器尽可能不同,如果每个基学习器学习的模型相似,那么我们的集成学习就没什么意义了,所以我们要让每个基学习器尽可能学习到不同的数据。
那么对于Boosting提升算法就会衍生两个问题:
一是如何训练不同的分类器,二是如何组合这些弱分类器组成强分类器。
对于第一个问题,提升算法采用的是更改数据权值(概率分布),你比如说我们使用第一个基学习器学习样本时,肯定会有分错的样本数据,所以我们会加大分错样本的权重,降低分类正确的样本权重,然后让下个分类器学习时更加注重上次分类错误的数据,我们的提升方法就是妙在这里,能够不断修正分类错误样本的权值,使我们的模型能够根据分类重点重视分类错误的数据,其实适当增大样本的概率和增多该样本的数量效果一样,错误样本概率越大,我们后面的模型就会越重视它,而如果错误样本越多,那么我们学习器学习更多的数据都是上次分错的样本,其实本质是一样的。
对于第二个问题,如何组合这些弱分类器进而组成一个强分类器,Boosting一般采用加权多数表决的方式,它会线性组合按照一定的权重组合多个弱分类器,误差率小的弱分类器的权重会很大,使其在总的表决中起较大的作用。
2.AdaBoost算法思想
假设我们数据为二分类,类别为+1,-1,AdaBoost的设计思想就是从每轮的训练数据中学习一个基学习器,最终将这些弱分类器组合为一个强分类器。
算法流程:
1.初始化每个样本的权重,第一次训练时每个样本的权重相同都为
2.对m=1,2,3,…,m ,m对应弱分类器个数
(a)使用带有权重的训练集去训练弱分类器
(b)计算 弱分类器在训练集上的误差率
(c)计算 弱分类器的权重
(d)根据分类正确和分类错误样本更新样本权重
3.由弱分类器线性组合为一个强分类器
3.AdaBoost原理解释
上面我们大体概括了AdaBoost整个算法流程,接下来我们具体讲解每部为什么这么做。
首先针对于第一步我们初始化了整个样本权重,由于这是第一个学习器需要学的,所以我们不需要修正权重,只需要让每个样本权重相等即可,即使用
第二步是要训练m个基学习器,训练每个基学习器的大概流程为:
1.训练基学习器
2.计算该学习器在训练数据上的误差,用于确定模型线性组合的权重
3.根据误差率计算模型线性组合的权重
4.更新新的学习器需要训练的样本权重,增大上一个学习器分错的样本权重
首先训练基学习器就不用多说了,使用不同的基学习器学习方式不同,和个体学习一样。
我们可以看到计算误差的式子为:
我们就是计算分类错误样本的概率,也就是分类错误样本所对应的权重,我们知道一个模型的误差率越小,该模型的可信程度越大,他们两个成负相关的关系,所以我们定义该分类器的权重为:
由该式我们可以看到,模型的误差率越大,模型的权重
对于上面我们训练好了第一个基学习器,而对于该学习器来说,我们肯定会有分类错误的样本的,所以我们希望更新样本的权重,用于下一个学习器进行训练,我们要使第一个分类器分类错误的样本数据的权重增大,分类正确的适当减小。
我们先不看分母,他为一个常数,用于规范化的,看指数括号内的 :
而我们的权重 为大于0的数,所以分类正确时指数函数的幂数为小于0的数,
函数当x小于0时,y小于1,所以此时的
小于1,那么对应该样本之前的权重
而如果分类错误的话,对应的y大于1,所以此时新的样本权重会被放大。
分母上除以 是为了更新完每个样本的权重后,保持每个样本权重之和为1。
训练好m个分类器后,我们获得了这m个分类器和相对应的权重,之后我们就可以使用线性组合的方式将多个弱分类器组成一个强分类器。
这里还有个注意的地方就是,我们每次更新样本的权重之和为1,而这些若分类器的权重之和是不为1的。
4.构造损失函数,求解参数
针对于整个模型的算法流程已经设计好了,接下来的问题就是如何求出每个弱分类器的参数,以及各个的权重,我们第一时间就是想到首先构造一个模型整体的损失函数,其次使用优化方法对该损失函数进行求解,一般对于连续值使用均方误差作为损失函数,对于分类问题使用交叉熵,然后优化方法使用梯度下降法进行求解各个参数,但是AdaBoost算法没有使用该方法,原因如下:
如果要构造损失函数,一般形式为:
其中的
所以我们考虑使用一种新的方式进行优化:前向分布算法。
5.前向分步算法
上面说过使用梯度下降单次迭代需要优化的参数太多不容易优化,所以我们想每次优化的参数能不能减少一点,一次不优化那么多的参数,显然可以,正巧我们的AdaBoost算法是串行模型组合,所以我们考虑能不能一个一个学习器模型进行学习,而不是直接学习总的损失函数。
因为AdaBoost是加法模型,所以我们能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,这样就可以简化优化的复杂程度,每次优化的参数就可以少很多。
我们每一步只需要优化如下的损失函数:
算法流程:
1.初始化
2.对m=1,2,…,M
(a)极小化损失函数
(b)更新模型
3.得到加法模型
其实这个算法的意思就是首先定义 为0,然后训练第一个分类器,然后求解第一个模型的最优参数,然后将这个弱分类器模型更新到整个模型
这样,前向分步算法将同时求解从 到M所有参数
的优化问题简化为逐次求解各个
写在最后
一键三连”哦!!!