Stacking是一种通用的通过训练学习器来结合个体学习器的方法,堆叠泛化是一种在集成学习中对数据从纵向进行划分的技术,一般称为SG技术,其一般用于最小化一个或多个泛化器的泛化误差率。
基本思想为:数据划分的纵向上有两层学习器,把Level 0的Base-learner学习器的输出,作为Level 1学习器的输入,Level 1的学习器又被称为Meta-learner或者Generalizer。
Stacking Generalization首次由Wolpert1于1992年提出,并且他认为这类似于对交叉验证(cross-validation),通过“胜者全得”(Winner takes all)的方式来集成的方法。
Wolpert根据泛化器数量的多寡将其分为两种训练模式–多泛化器和单泛化器
多泛化器:
两个泛化器 G1、G2,一个学习数据集L,将L分成两份-{ L-(x,y)}和(x,y),提出一个问题q。
1. 使用{ L-(x,y)}训练G1、G2,然后分别对得到的模型输入x,得到输出g1、g2,将{(g1,g2),y}放入新数据集L’将L做其他划分,得到更多数据并加入L’。
2. 使用完整L训练G1、G2,分别输入q,得到新的对(g1’,g2’)
3. 使用L’训练新的泛化器G3,对模型输入(g1’,g2’),输出即为最终结果。
单泛化器
泛化器G,其他数据如上
1. 使用{ L-(x,y)}训练G,对模型输入x,得g。记x距离集合{ L-(x,y)}最近距离的向量(可选最近的几个向量,取均值)为δ。将{(x,δ),(g-y)}加入新集合L’,将L做其他划分,得到更多数据并加入L’。
2. 使用完整L训练G,输入q,得到输出g’,取q距离L最近向量δ’,得向量对(g’,δ’)。
3. 使用L’训练新的泛化器G’,输入(g’,δ’)。输出为G的猜测误差,将估计误差与2中的输出g’相加即得到最终结果。
策略执行过程2:
方法应用:
堆叠通常能获得比任何单个的训练模型更好的性能。它已被成功地用于监督学习任务(包括回归、分类等)和无监督学习(密度估计),也可以用来估计装袋错误率。有报道表明,它的表现超过了贝叶斯模型平均。堆叠泛化方法在Kaggle等数据比赛中也被广泛使用,能够有效提高模型的性能。比如在Netflix比赛中,有选手通过采用混合(blending)的方法获得奖金,这种方法也被认为是堆叠的一种形式。
拓展—Bias-Variance平衡
Stacking的基因就是Ensemble中Aggregation方法进一步泛化的结果, 是通过Meta-Learner来取代Bagging和Boosting的Voting/Averaging来综合降低Bias和Variance的方法。
参考: