【机器学习】集成学习Stacking

上半部分是用一个基础模型进行5折交叉验证,如:用XGBoost作为基础模型Model1,5折交叉验证就是先拿出四折作为training data,另外一折作为testing data。注意:在stacking中此部分数据会用到整个traing set。如:假设我们整个training set包含10000行数据,testing set包含2500行数据,那么每一次交叉验证其实就是对training set进行划分,在每一次的交叉验证中training data将会是8000行,testing data是2000行。

每一次的交叉验证包含两个过程,1. 基于training data训练模型;2. 基于training data训练生成的模型对testing data进行预测。在整个第一次的交叉验证完成之后我们将会得到关于当前testing data的预测值,这将会是一个一维2000行的数据,记为a1。注意!在这部分操作完成后,我们还要对数据集原来的整个testing set进行预测,这个过程会生成2500个预测值,这部分预测值将会作为下一层模型testing data的一部分,记为b1。因为我们进行的是5折交叉验证,所以以上提及的过程将会进行五次,最终会生成针对testing set数据预测的5列2000行的数据a1,a2,a3,a4,a5,对testing set的预测会是5列2500行数据b1,b2,b3,b4,b5。

在完成对Model1的整个步骤之后,我们可以发现a1,a2,a3,a4,a5其实就是对原来整个training set的预测值,将他们拼凑起来,会形成一个10000行一列的矩阵,记为A1。而对于b1,b2,b3,b4,b5这部分数据,我们将各部分相加取平均值,得到一个2500行一列的矩阵,记为B1。

以上就是stacking中一个模型的完整流程,stacking中同一层通常包含多个模型,假设还有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,对于这四个模型,我们可以重复以上的步骤,在整个流程结束之后,我们可以得到新的A2,A3,A4,A5,B2,B3,B4,B5矩阵。

在此之后,我们把A1,A2,A3,A4,A5并列合并得到一个10000行五列的矩阵作为training data,B1,B2,B3,B4,B5并列合并得到一个2500行五列的矩阵作为testing data。让下一层的模型,基于他们进一步训练。

以上即为stacking的完整步骤!(感觉这个图更容易理解)


首先不了解的stacking的朋友可以认为它是一种集成框架,集多个不同模型的长处而产生更好的结果。和bagging相同,stacking也需要多个基分类器(base classifier),来构成差异化(diversity)。

对比bagging和stacking:

  • stacking中的各个模型(基分类器)追求的是“准而不同”。stacking中的子模型一般应该是独立准确,而不同的基学习器之间有所差异。
  • bagging中的基学习器追求的是“弱和不同”。bagging中的学习器往往是决策树,主要就是看中了决策树的不稳定性(instability)。过于准确的基学习器会使得bagging的集成失去意义。

stacking另一个比较特别的是层状结构。以常见的两层stacking为例,第一层是不同的基模型(多个),而第二层是以上一层基模型输出结果为输入数据的分类器(一个)。从某种意义上看,和神经网络的“结构相似”。为了防止过拟合,一般第二层的模型不再使用原始训练数据进行训练,而仅依赖于第一层训练器的输出结果。

stacking是否一定可以提升效果呢?是否集成后比单个基学习器要好?

  • 这个首先和你怎么做的stacking有很大关系,不是每一种stacking都有“质量保证” 。早期的很多stacking方法从实验角度看效果一般,但也不至于退步
  • 其次从理论上来看,现在比较通用stacking模型(见下图中的super learning),已经在理论上证明了集成结果应该"渐进等价"于其第一层中的最优子模型[3]。因此stacking的结果不应该有大幅度下降。
  • 不谈公式。仅从集成的思路上看,假设多个学习器之间却有不同、互相独立,且最终合并起来,那么每个单独模型的方差(variance)应该有所降低,最终结果应该提升。即使多个相似基学习器并不互相独立、甚至极端情况下完全相同,也不会恶化集成结果,最多是没有提升罢了。这个想法可以类比回归中的共线性,一般主要影响解释能力,而不是预测能力所以常常会保留不作处理。所以stacking直觉上应该也不会恶化预测能力。

那么问题来了,为什么依然有可能表现不佳?我有几个猜测:

  • 本身数据集就不大,stacking不适合极小的数据集。
  • 很有可能是代码上就出了问题,比如没有正确的使用交叉验证。
  • 个别模型因为某种不明原因现奇差,在巧合状况下决定了第二层输入的数据。
  • 第二层的模型选择问题,比如在多标签预测下和二分类下的选择应有所差别。可以参考[4]。

所以你也看出来,我们都猜不到为什么你的模型不工作,或者stacking后大幅度下降。在有限的信息下,给出一些建议

  • 观察每个子模型,移除那些明显逊色的模型。
  • 继续丰富子模型的种类。如果想不出新的模型,可以换不同参数的类似模型。
  • 如果你的数据集非常小,stacking不一定有效,没有必要坚持用stacking。
  • 重新检查基学习器的训练,可以尝试用randomized search来包括一些新的“准而不同”的模型。
  • 还有一种微乎其微的可能性,就是你的模型事实上提升了。但准确率(accuracy)不是很好的衡量标准(当数据严重不平衡的时候),你误以为效果变差。所以可以试试ROC。

给出一个比较简单的例子:你想要预测明天是否会下雨,并有相关的气象数据。你训练了十个分类器比如逻辑回归,svm,knn等。你通过stacking的方法在第一层将这十个分类器的结果作为了第二层训练器的数据,通过第二层的输出训练器得到了最终预测结果。Stacking本身不是文章的讨论重点,因此建议读者可以阅读以下科普文章了解什么是stacking:

本文的核心观点是提供一种对于stacking的理解,即与神经网络对照来看。当然,在阿萨姆:为什么做stacking之后,准确率反而降低了?中我已经说过stacking不是万能药,但往往很有效。通过与神经网络的对比,读者可以从另一个角度加深对stacking的理解。

1. Stacking是一种表示学习(representation learning)

表示学习指的是模型从原始数据中自动抽取有效特征的过程,比如深度学习就是一种表示学习的方法。关于表示学习的理解可以参考:阿萨姆:人工智能(AI)是如何处理数据的?

原始数据可能是杂乱无规律的。在stacking中,通过第一层的多个学习器后,有效的特征被学习出来了。从这个角度来看,stacking的第一层就是特征抽取的过程。上排是未经stacking的数据,下排是经过stacking(多个无监督学习算法)处理后的数据,我们显著的发现红色和蓝色的数据在下排中分界更为明显。* 数据经过了压缩处理。这个小例子说明了,有效的stacking可以对原始数据中的特征有效的抽取

2. Stacking和神经网络从某种角度看有异曲同工之妙,神经网络也可以被看作是集成学习

承接上一点,stacking的学习能力主要来自于对于特征的表示学习,这和神经网络的思路是一致的。这也是为什么我说“第一层”,“最后一层”。

而且神经网络也可以被看做是一种集成学习,主要取决于不同神经元、层对于不同特征的理解不同。从浅层到深层可以理解为一种从具体到抽象的过程。

Stacking中的第一层可以等价于神经网络中的前 n-1层,而stacking中的最终分类层可以类比于神经网络中最后的输出层。不同点在于,stacking中不同的分类器通过异质来体现对于不同特征的表示,神经网络是从同质到异质的过程且有分布式表示的特点(distributed representation)。Stacking中应该也有分布式的特点,主要表现在多个分类器的结果并非完全不同,而有很大程度的相同之处。

但同时这也提出了一个挑战,多个分类器应该尽量在保证效果好的同时尽量不同,stacking集成学习框架的对于基分类器的两个要求:

  • 差异化(diversity)要大
  • 准确性(accuracy)要高

3. Stacking的输出层为什么用逻辑回归?

如果你看懂了上面的两点,你应该可以理解stacking的有效性主要来自于特征抽取而表示学习中,如影随形的问题就是过拟合,试回想深度学习中的过拟合问题。

周志华教授也重申了stacking在使用中的过拟合问题。因为第二层的特征来自于对于第一层数据的学习,那么第二层数据中的特征中不该包括原始特征,以降低过拟合的风险举例:

  • 第二层数据特征:仅包含学习到的特征
  • 第二层数据特征:包含学习到的特征 + 原始特征

另一个例子是,stacking中一般都用交叉验证来避免过拟合,足可见这个问题的严重性。

为了降低过拟合的问题,第二层分类器应该是较为简单的分类器,广义线性如逻辑回归是一个不错的选择。在特征提取的过程中,我们已经使用了复杂的非线性变换,因此在输出层不需要复杂的分类器。这一点可以对比神经网络的激活函数或者输出层,都是很简单的函数,一点原因就是不需要复杂函数并能控制复杂度。

因此,stacking的输出层不需要过分复杂的函数,用逻辑回归还有额外的好处:

  • 配合L1正则化还可以进一步防止过拟合
  • 配合L1正则化还可以选择有效特征,从第一层的学习器中删除不必要的分类器,节省运算开销。
  • 逻辑回归的输出结果还可被理解为概率

4. Stacking是否需要多层?第一层的分类器是否越多越好?

通过以上分析,stacking的表示学习不是来自于多层堆叠的效果,而是来自于不同学习器对于不同特征的学习能力,并有效的结合起来。一般来看,2层对于stacking足够了。多层的stacking会面临更加复杂的过拟合问题,且收益有限。

第一层分类器的数量对于特征学习应该有所帮助,经验角度看越多的基分类器越好。即使有所重复和高依赖性,我们依然可以通过特征选择来处理,问题不大。

这提出了另一个stacking与深度学习不同之处:

  • stacking需要宽度,深度学习不需要
  • 深度学习需要深度,而stacking不需要

但stacking和深度学习都共同需要面临:

  • 黑箱与解释问题
  • 严重的过拟合问题

如果stacking和深度学习都是一种表示学习,如何选择?我认为和样本量有关:

  • 小样本上深度学习不具备可操作性,stacking或许可以
  • 大样本上stacking的效率理当不如深度学习,这也是一种取舍

以上内容来自:

详解Stacking - 峰峰的文章 - 知乎 

为什么做stacking之后,准确率反而降低了?

「Stacking」与「神经网络」 - 微调的文章 - 知乎 

集成算法(stacking模型面试重点)

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值