bagging集成和stacking集成(理论篇)机器学习你会遇到的“坑”
数学准备:
- 假设空间:从样本空间X到标记空间Y的所有可能映射组成的集合。
- 自助采样(bootstrap):从给定集合中有放回地随机挑选样本,直到采样出与原本数据规模相同的数据集。大约会有
- 比例的样本不会出现在采样中。
集成的动机
在一个传统的机器学习任务中,面对不同的数据会采用不同的模型。
面对回归任务,我们可能会采用简单的线性回归,以保证模型的可解释性,但随着特征的增多,简单线性回归往往会出现多重共线性的问题。我们接下来会尝试多项式回归来解决数据的微弱的非线性倾向,但这样的回归方式也并不能处理复杂的非线性关系,而且随着特征的增多,多项式会变得非常臃肿,即便采用了岭回归和LASSO,以及弹性网,仍然无法有效解决高维空间的特征间复杂的非线性组合。我们可以继续尝试添加kernel的岭回归和支持向量机,但kernel的选取需要对数据的先验形式做出假设,参数的增多需要不断地去调试参数。如果你厌倦了这一方式,那么还可以尝试种下一棵决策树,但决策树(以及高斯过程)这样的非参数模型天然有着比参数模型更高的过拟合风险。
同样,面对分类任务,我们可以考虑朴素贝叶斯的方法,它面对属性值离散的数据就会变成一个计数工作。但它假设太过简单,从理论上来讲无法胜任特征之间存在相关性的数据(虽然在实践中,性能还不错),如果我们想进一步地提高性能,那么就可以考虑广义线性模型中而来的logistic回归,它具备概率的框架,还具备很好的解释性,但对于特征空间线性不可分的数据往往会无能为力,我们就可以想到kernel function的作用正是通过升维将线性不可分的数据变得线性可分,所以我们还会尝试添加kernel的支持向量机,但支持向量机参数较多难以调优,且解释性比较差。接下来,我们为了非线性和解释性,还会采用多变量决策树的办法,但决策树面对多个输出结果且特征间存在复杂关系时,泛化性能也会不佳。
可以看出,没有任何一个模型可以胜任全部的机器学习任务。我们就会很自然的想到,面对同一个任务,可不可以将不同的模型结合起来,来达到想要的效果?比如,学习器A在某些样本上预测失误,但学习器B却可以将这些样本预测对,就好像面对很多科目的考试,数学成绩好的人去做数学卷子,语文好的人去做语文试题,如果只用一个人去做全部的试卷,那么考试分数都会很低,但把他们结合在一起,就有望达到我们想要的效果。
从数学的角度来说,每个模型都对应着不同的假设空间,而结合不同的模型会将假设空间扩大。这就是所谓的集成学习(ensemble learning),我们将不同的模型结合起来,而模型要满足一个最基本的条件,即集成学习中的每一个学习器尽可能的不同,因为两个数学成绩好的人去考试,无法优化语文成绩。为了获得差异较大的模型,主要有三种方法:
- 改变算法,对于同样的数据,可以采用不同的算法去构建模型。
- 改变数据,在相同的算法下,通过进入模型的数据不同来改变最终的模型。
- 改变参数,在相同的算法,相同的数据下,通过改变参数来改变的最终的模型。
注意,获得差异化的模型是集成学习的核心问题,没有之一,我们会在后面看到,这是集成学习性能提升的主要来源。而根据差异化模型的结合策略,又可以将集成学习的主要分为三类:
- bagging
- boosting
- stacking
在这里,我主要讲解对初学者更加友好的bagging和stacking,而如何更好的获得差异化模型会贯穿其中。
Bagging集成
集成学习中,比较好理解应当是Bagging集成方法。为了保证模型的差异性,每个模型的训练数据都是从样本中自助采样而来,同时为了获得最后的输出结果,bagging方法采用投票法,将投票的结果作为最终的输出。与KNN的机制相似,回归任务采取加权平均,分类任务采取加权投票法。
如图,我们有三个基学习器,接受自助采样而来的数据,训练完毕后,将每个结果融合。
自助采样法会导致某些样本未被学习器使用,为了充分的利用数据,以及分集测试的需要,我们会把未被使用的数据做测试集,以此来确定过拟合以及减小过拟合风险。
随机森林(Randomforest)
随机森林可能是bagging集成中最著名的算法,它以决策树作为基学习器,仍然采用自助采样法训练基学习器:
模型的差异化除了靠随机采样所产生的数据扰动,还会添加特征扰动。传统的决策树会对于每棵树上的节点划分,我们会在当前节点上数据所具备的全部属性中通过信息增益或者gini指数的办法来挑出一个最佳属性,作为生成下一节点的划分属性。但随机森林为了增大模型的差异性,还会随机选择一个特征子集,这个子集可以是少部分特征的集合,也可以由特征组合而来(聪明的读者马上会想到,这正是我们前面所讲解的特征选择和降维的另一用处)。这样,每一个基学习器的性能其实都比不上单棵决策树,但组合起来,却会让随机森林的表现远远优于普通的决策树。
Stacking集成
Stacking的想法比bagging更为简单,曾经有人把boosting叫做串行集成方法,bagging叫做并行的集成方法,事实上stacking也是串行的集成。所谓stack,就像程序中的调用栈,堆叠起来层层调用。
首先我们会像bagging方法一样,训练出不同的基学习器,然后并不直接对这些基学习器的输出做加权平均,而是将上一步基学习器应用到数据上,将数据的输出作为下一层学习器的输入。从某种意义上,上一层的学习器是一个新数据的生成器,将原有的数据映射到另一个特征空间,也可以看成是上一层的学习器是对样本做了特征提取。
比如,对数据利用朴素贝叶斯的办法,朴素贝叶斯模型会输出样本属于不同类别的后验概率,有n个类别,就会产生n个后验概率,然后将上一层的该样本的后验概率作为数据的特征,target保持不变,作为新数据,放入下一层的学习器。
读芯君开扒
课堂TIPS
• bagging集成的后续处理,加权平均的权重可以从训练数据中得到,我们可以指定误差占比越小的基学习器权重更大。同时,采取多少基学习器,采取怎样的基学习器会成为集成学习实践过程的中的重点。在实践过程中,可以将数量作为超参数来处理,但基学习器的类型一般要靠对数据的认识和经验处理。
• 我们经常看见决策树作为基学习器,原因不在于决策树本身足够好,而是决策树本身对数据扰动,特征扰动的影响更大,也就是说,我们可以很轻易地制造出决策树的性能差异,而性能差异正是集成学习的核心问题。
• 不同类型的基学习器的输出可能并不一致,比如决策树会输出类别标记,而朴素贝叶斯会输出后验概率,不同的基学习器的结合要注意把输出结果进行转换可以处理的类型。
• stacking集成需要注意,千万不要在上一层学习器用来训练的数据上继续生成数据,而是应该利用其未接触的数据生成新数据,因为多层的学习器反复地利用同一段数据,就相当于一个复杂的模型应用在了少量数据上,有着极高的过拟合风险。
留言 点赞 发个朋友圈
我们一起探讨AI落地的最后一公里
作者:唐僧不用海飞丝
如需转载,请后台留言,遵守转载规范