集成学习
参考机器学习——集成算法。
集成算法是指构建多个学习器,然后通过一定策略结合它们来完成学习任务,常常可以表现得比单一学习更显著优越。
集成算法一般分为三类:
- bagging。并行训练多个模型,预测结果取所有模型的投票结果,或平均和。
- boosting。串行训练多个模型,每次从多个候选模型中,选取对预测提升最大的那个,加入集群。
- stacking。分两层训练,第一层训练多个模型,它们的输出作为第二层的输入。第二层训练一个分类器,对上一层的模型作综合,并输出最终结果。
bagging
直接阅读Bagging与随机森林算法原理小结即可。
用笔者的语言总结,就是训练多个弱分类器,再由它们投票预测结果。
每个分类器在训练时,对大小为m的数据集作m次可放回采样,得到训练集,并将剩余的从未被选中的数据作为验证集,可用于后剪枝操作
。
在切分训练/验证测试集时,由于每个样本都来自可放回采样,约36.8%的数据一直不会被选中。(具体计算见原文)
blending
可参考从零实现机器学习算法(七)Blending。笔者总结的算法流程如下:
- 将数据集划分为训练-验证-测试集。
- 在训练集上训练第一层的基模型。训练好后,在验证集上预测,其结果作为训练第二层时的特征集。
- 用上一步得到的特征集训练第二层。
可参考模型融合Blending的模型流程和代码实现部分。对代码的部分变量做一下解释,其训练过程如下:
- 每个基模型用训练集特征
X_d1
和标签y_d1
进行拟合。然后:- 基模型预测验证集特征
X_d2
,得到第二层的特征dataset_d1
,它将作为用于训练第二层模型。其对应的标签为y_d2
。 - 基模型预测测试集特征
X_predict
得到dataset_d2
- 基模型预测验证集特征
总结
该模型的优点是能集结多个模型的长处,但缺点是切分的验证集可能过小,导致过拟合。
该模型的思想和stacking很相似,区别在于stacking是通过交叉验证来取验证集的,而blending是直接切出一份holdout set当做验证集。
stacking
基本思想
stacking的意思是将模型堆叠成多层,上一层模型的输出作为下一层模型的输入,并将最后一层输出的结果作为最终结果。通常可以只堆叠两层,第一层训练若干个基模型,第二层训练1个分类模型。训练时,先训练第一层,取它们的输出构建第二层的数据集,再训练第二层。
stacking 的思想也很好理解,接下来我们首先看两个简单的举例:
- 以论文审稿为例,首先是三个审稿人分别对论文进行审稿,然后分别返回审稿意见给总编辑,总编辑会结合审稿人的意见给出最终的判断,即是否录用。对应于stacking,这里的三个审稿人就是第一层的基模型,其输出(审稿人意见)会作为第二层模型(总编辑)的输入,然后第二层模型会给出最终的结果。
- 下图以讲课为例。图中相当于三层stacking,A、B是第一层的基学习器,C、D是第二层的学习器,E是处于第三层的学习器。
算法过程
参考:
- 7. 集成学习(Ensemble Learning)Stacking中的文字说明
- 【机器学习基础】|交叉验证及Stacking的图片。
- Stacking算法可辅助阅读
- 详解stacking过程 基于kaggle比赛详细讲解了stacking的算法过程。
算法的训练和预测过程如下图所示,本章以该图为背景,讲解各个算法流程的操作。
1. 训练基模型
有一个样本数量为m的数据集D,分为训练集 D t r a i n D_{train} Dtrain和 D t e s t D_{test} Dtest。对 D t r a i n D_{train} Dtrain进行5-fold处理,得到5种训练-验证集划分,每种划分里训练集和验证集大小为4:1。我们会基于这5种数据集划分,为 M o d e l i Model_i Modeli训练5个学习器。
M o d e l i Model_i Modeli的每j个学习器训练好后,对验证集作预测,得到 a i , j a_{i,j} ai,j。5个学习器各自对验证集的预测结果合并,得到 A i A_i Ai。
另一方面,每个学习器在训练好后,也会对测试集作预测。第j个学习器对测试集预测得到 b i , j b_{i,j} bi,j。将5个学习器的预测结果取平均,得到 B i B_i Bi
假设Stacking的基模型有n种。本图中只是训练了 M o d e l i Model_i Modeli,这样的过程要重复n次。
2. 训练第二层
第二层通常只是LR分类器。我们取基模型的验证集输出向量 A 1 , A 2 , . . . , A n A_1,A_2, ...,A_n A1,A2,...,An横向拼接,作为第二层的特征,并让第二层拟合它。这样变相地令第二层的分类器在完整的训练集上拟合了一遍。
3. 预测
至此,第一层和第二层都已经训练完成。接下来要在测试集预测结果。我们取 B 1 , . . , B n B_1, .., B_n B1,..,Bn横向拼接,作为第二层的特征,并让第二层输出其预测结果,然后就可以计算误差和精准度分数了。
与交叉验证的对比
由于使用了k-fold的方式训练多个学习器,这段过程与交叉验证很像,那是否可以说stacking=交叉验证+二层训练?笔者认为,如果严格地认为上面做法是标准的stacking过程,那么两者不等价。其区别在于:
- 交叉验证在训练完5个学习器并计算分数后,会让模型在完整训练集重新训练一遍,再到测试集上预测结果
- 而stacking的第一层在训练完5个学习器后,会让它们分别在测试集上预测结果,并取平均值。
所以标准的stacking做法到底是怎样呢?是取第一种/第二种,还是两种皆可?笔者在youtube上有看到教程声称应该用第二种的。但国内大部分资料还是支持第一种的。
转载:https://blog.csdn.net/duoyasong5907/article/details/128275699