内容简介:俗话说,三个臭皮匠顶个诸葛亮,在机器学习中,也有这一说法,这就是集成学习。集成学习就是将多个学习器组合到一起,使他们共同完成机器学习的相关任务。集成学习可以分为三个大类,bagging、boosting和stacking,这三类集成学习是应用最广的集成算法,下面将简要的介绍下集成学习。
源 / 顶级程序员 文 / 数据挖掘机
俗话说,三个臭皮匠顶个诸葛亮,在机器学习中,也有这一说法,这就是集成学习。集成学习就是将多个学习器组合到一起,使他们共同完成机器学习的相关任务。集成学习可以分为三个大类,bagging、boosting和stacking,这三类集成学习是应用最广的集成算法,下面将简要的介绍下集成学习。
1、Bagging集成学习
Bagging集成学习是指从训练集中并行的并且有放回的采样多个子训练集,然后在每个子训练集上分别训练出一个基模型,最后对于测试样本,将用这多个基模型分别进行预测,全部的预测结果进行投票或者是平均法产生最终的预测输出。对于集成学习而言,最终的输出结果是由多个基学习器产生的输出结果通过一定策略产生的,一般是投票法或者是平均法,常见的策略一般有以下几种。
l 简单平均法,一般用于预测结果为数值,将多个基学习器的结果平均后作为最终结果
l 加权平均法,同样多用于预测结果为数值,但每个基学习器的输出结果可以乘上对应的权重再进行平均
l 绝对多数投票法,即哪个标记投票数目越多就选择哪个标记作为最终标记。
l 加权投票法,即每个基学习器都赋予一个权重,将权重和预测正确的标记进行相乘后选择结果最大的基学习器的输出作为最终预测结果
Bagging集成学习最常见的算法就是随机森林,下面一张图可以很好的描述bagging算法(图片来源于网络):
2、Boosting集成学习
Boosting集成学习又称为提升方法,该方法是一个多次遍历训练数据集构建基学习器并对数据集中每个样本的权重进行调整的以增加分错样本权重的集成算法,通过多次遍历训练集构建基学习器并计算出基学习器的错误率后,可以做两件事,一是起初所有样本的权重都是一样的,假如有n个样本,则每个样本权重为1/n,通过错误率可以通过公式计算每个样本新的权重,二是通过错误率也可以评估该基学习器的性能,同样可以把基学习器前面加上权重。最终多个基学习器可以通过线性叠加来计算最终输出。下图可以较好描述该算法(图片来源网络):
3、Stacking集成学习
Stacking集成学习理解上面较Bagging和Boosting来说要难一些,因为它的组合策略与上面的差别很大,如果较为宽松的理解可以如下去概括:
Stacking集成学习就是利用样本数为m的原始训练数据集训练出多个初级学习器,初级学习器的数目可以自定,记为T,用T个初级学习器对原始训练数据集里面的每一个样本分别进行预测产生与初级学习器数目一致的预测结果T个,然后把这T个预测结果的结果值作为特征,该样本真实的标签作为分类结果组成一个新的数据集,然后用元学习器或者是次级学习器对这个新的数据集进行训练产生的次级分类器就是我们最终要训练的分类器,最终进行预测时就分为两步,一是先用初级学习器产生T个预测值,然后把这个T个预测值组成的训练集作为输入,次级学习器作为新模型,产生的最终结果就是最终预测结果。算法如下:
简单来说就分四步:
1、(过程1-3),训练T个初级学习器
2、(过程4-10),T个初级学习器对每个样本进行预测产生预测结果组成的新训练集
3、(过程11),用次级学习器算法对新训练集进行训练产生次级学习器
4、(输出),先用初级学习器预测结果并组成新测试集,再用次级学习器产生最终预测结果
集成学习的基本分类已经介绍完了,下面将讲一下集成学习里面比较具备代表性的AdaBoost算法,算法的流程如下:
算法可以分成以下几个部分:
1、 输入为m个训练样本D,最终分类结果为-1和+1,初始化训练样本的权重,每个样本的权重均为1/m,确定要训练的基学习器的数目T
2、 使用样本集D训练每一个学习器,并记录每一个学习器训练过程中产生或者是测试产生的错误率,t表示第t个分类器的错误率
3、 利用错误率计算参数,表示该学习器的权重,分类器的错误率越高则该权重越小
4、 更新训练集样本的权重,按照如上公式进行计算,更新后,分错的样本将增大权重使其受到更多的关注,分对的样本将减小权重使其关注度降低
5、 当经过多次训练得到最终的T个学习器后,将其按照如上公式进行线性加和构成最终的分类器
算法的步骤讲完以后,下面将用一个小例子来使用AdaBoost算法进行预测。
如上图,x和y分别表示每个样本和对应的标签值,共计有十个样本,下面将按照上面算法的几个部分来构造最终的学习器。
1、 初始化训练样本的权值分布,共计有10个样本,故每个样本的权重为1/10=0.1,确定基学习器的数目为3
2、 使用上面的训练数据训练三个分类器,假如这三个分类器算法均为从x中寻找一个分割点来划分数据集从而使得分割点两侧的标签分别为-1和+1,则很明显,分类器G1可以取1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5、9.5为分割点,这9个分割点左右两侧分别可以全部给值-1、+1或+1、-1,会发现,选2.5错误率低,则基分类器1为:
计算后,当x<2.5 时,左侧为1,均分类正确,当x>2.5时,左侧均为-1,序号7、8、9三个分类错误,故错误率为0.3,可以计算系数,该值为=1/2*log((1-0.3)/0.3)=0.4236,然后更新权值分布:
首先计算Z值:
Z = 0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(-0.4236))+0.1*np.exp((1)*(0.4236))+0.1*np.exp((1)*(0.4236))+0.1*np.exp((1)*(0.4236))= 0.916515然后,计算第一个样本的权重:
(0.1/Z)*np.exp(-0.4236)=0.07143
按照上面的方法,即可计算出所有样本的权重,于是得到更新后的权重=(0.07143,0.07143,0.07143, 0.07143,0.07143,0.07143,0.16667,0.16667,0.16667,0.007143)
所以,
3、 重复上面几步,用作为新权重计算新的误差率,可以发现第二、第三个分类器分别为:
到现在,利用AdaBoost算法构建的模型就完成了,整个过程可以认为是不断迭代计算错误率、分类器权重和样本权重的过程,算法并不复杂,但是计算过程中一定要细心,这样最终生成的模型也保证不会出错。
-END-
原创声明:本文为「顶级程序员」原创文章,转载请联系后台。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 集成学习算法(Ensemble Method)浅析
- Python机器学习:通过scikit-learn实现集成算法
- Google开源基于AutoML的预测算法集成学习工具AdaNet
- 持续集成:数据库集成及快速构建
- ShareSDK集成及集成后遇到的一些问题【原创】
- 持续集成与持续部署宝典Part 3:创建集成环境
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。