怎么使用模型融合Stacking效果没有提升反而下降?

       关于模型融合的原理以及模型融合的各种方法的文章帖子太多太多,不得不说千篇一律,然而模型融合怎么总感觉是‘别人家的模型融合’,自己模型融合效果没有提升反而下降了呢?我们说说被称为kaggle后期杀手锏的Stacking。

一、简单说下Stacking最核心的两个点,推荐以下文章了解stacking其他内容。

  • Kris Zhao:【干货】比赛后期大招之stacking技术分享
  • 峰峰:详解Stacking
  • Stacked Regression的详细步骤和使用注意事项

        1、我们知道Bagging是一种集成框架,它的基学习器追求的是“弱而不同”。bagging中的学习器往往是决策树,主要就是看中了决策树的不稳定性(instability)。过于准确的基学习器会使得bagging的集成失去意义。

            Stacking也可以认为是一种集成框架,不过有别于Bagging的是,Stacking是集百家之长,即集多个不同模型的长处而产生更好的结果。即要求各个基分类器满足:差异化(diversity)要大、准确性(accuracy)要高

           同样是集成模型,为什么两者的基学习器恰恰相反呢?

           因为Bagging的目的是提升模型的泛化能力,而Stacking追求的是更高的精确性。

        2、stacking是一种层次结构。比如两层的stacking,第一层是多个不同的基模型,而第二层是以第一层基模型输出结果为输入数据的分类器。通过第一层的多个学习器后,有效的特征被学习出来了。下图中上排是原始数据,下排是经过stacking第一层处理后的数据,我们显著的发现红色和蓝色的数据在下排中分界更为明显。

                 怎么使用模型融合Stacking效果没有提升反而下降?_第1张图片

       从这个角度来看,stacking的第一层就是特征抽取的过程。也正因为如此,stacking很容易造成过拟合问题(我个人更愿意把这种过拟合认为是第一层模型的‘偏见’)。为了降低过拟合的问题,通常会注意以下两个部分:

        a、stacking的第一层一般都用交叉验证来得到第二层的数据(集合同一模型的多种不同的偏见,而不是唯一的一种偏见),并且第二层数据中的特征一般不再包括原始特征。

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

二、关于Stacking的疑问

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

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

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

三、不一样的操作和见解

        有些dataminer认为第一层模型的结果有遗漏的信息,会在第二层加上原始特征, 以及再次使用gradient boosting tree训练, 不少情况下能够提高模型的performance。这个其实是动态平衡,第一层的特征抽取能力强的时候,第二层尽量简单(足够多的带‘偏见’的分类器合在一起就没有太大分歧)。弱的时候第二层可以适量复杂。如果第二层模型有很强的抗过拟合的能力,或许较好的捕捉遗漏的信息。(带‘偏见’的分类器不够多到足以消除分歧,那么给到第二层的数据本身就是有‘偏见’的数据,所以第二层需要结合原始数据来判断,且第二层模型复杂度也需要提高)

四、最核心的问题:怎么使用Stacking后,效果不佳?

        a、本身数据集就不大,stacking不适合极小的数据集。——没有必要坚持用stacking。

        b、第一层的模型不够准确,或有交差的模型拖后腿——观察每个子模型,移除那些明显逊色的模型。

        c、基分类器数量少——丰富基分类器的种类。如果想不出新的模型,可以换不同参数的类似模型。

        d、第一层的信息捕捉有遗漏——尝试下在第二层加入原始数据

 

 

你可能感兴趣的:(机器学习算法)