声明:这篇博文是我基于一篇网络文章翻译的,并结合了自己应用中的一些心得,如果有侵权,请联系本人删除。

最近做推荐的时候,开始接触到Stacking方法,在周志华老师的西瓜书中,Stacking方法是在Bagging,Bosting方法后的模型集成方法,和投票法,简单平均法,加权平均法等方法在同一个讨论框架中。在网上查资料,也有学者认为Stacking方法是和Bagging,Bosting方法在同一个讨论框架中,我个人更加赞成周志华老师的论断,因为Stacking必须在模型差异较大,最好是不同模型,各有侧重的情况下,可能能够得到更好的集成效果,而Bagging和Bosting通常都是用的同一类模型,只是在训练样本上有所不同。

关于Stacking的学习资料有很多,下面罗列我找到的一些资料:

1. 首先要看的是Breiman的stacked regression,这是Stacking方法的提出论文;

2. Alexander K. Seewald等对stacked regression进行了改进,《How to Make Stacking Better and Faster While Also Taking Care of an Unknown Weakness》;

3. 如果对weka比较熟悉,Weka中实现了Stacking和StackingC,但是Weka默认的metaClassifier是ZeroR,不修改的话肯定试不出效果,要改成Linear Regression模型,而且要用Ridge regression选项,将Ridge的参数保持默认的值(1.0e-8)就可以了。

下面是我根据一篇博文翻译而来,这篇文章对Stacking方法的具体实现进行了详细阐述,还有代码实现,感谢原作者提供的很好的学习资料,原文地址:

http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/

Introduction
    Stacking(又叫做meta ensembling) 是利用多个模型的输出集成起来产生新模型的一种模型集成技术。由于集成后模型的平滑特性,通常集成后的模型能够在性能上优于任何一个用于集成的Base模型。并且集成的模型侧重表现好的模型,不信任(discredit)表现不好的模型。因此,stacking方法对于差别很大的基础模型,集成的有效性更佳。作者在这里提供一个简单的例子,演示stacking在具体实现时的方法。这篇文章的代码和数据可以参考网址:
 
Motivation
    假设四个人扔187个飞镖。其中150个飞镖观察是谁扔的,扔到了哪里(训练数据)。剩下的作为测试数据,知道飞镖的位置。我们的学习任务是根据飞镖的位置,猜测是谁扔的。
 

K-近邻(基础模型1)

首先我们用K-近邻模型尝试解决这个分类问题。为了选出最好的K值,我们用了5-折交叉验证和网格搜索方法检验K=(1,2,。。。。30).伪代码如下:
     1.将训练数据等分为5份。这些就是测试数据集(test folds).
     2.For K=1,2,...,10
          1) 对每一个测试集(test fold)
               a. 合并另外四个fold生成训练集合;
               b.用当前的K值,在当前的训练集合上训练一个K-近邻模型;
               c.对测试集进行预测,并评估预测结果的正确率。
          2)计算上述5个不同测试集合的平均正确率。
     3.将交叉验证得到的最好平均正确率的K值保存起来。
 
    在我们的数据集上发现K=1能够获得最好的交叉验证准确率(平均正确率67%)。用K=1,我们在所有的训练数据上训练一个模型然后对测试数据进行预测。
最终我们得到了分类准确率70%的结果。
 
支撑向量机(基础模型2)
    现在我们尝试用支撑向量机来解决预测问题。此外,我们加入了一维新的特征——DistFromCenter——用于衡量点到飞盘中心的距离,从而帮助数据能够线性可分。
用R语言的LiblinearR包,我们有两个超参数需要调试:
     type
  1. L2-正则化L2-损失支撑向量机分类(对偶问题)
  2. L2-正则化L2-损失支撑向量机分类(原始问题)
  3. L2-正则化L1-损失支撑向量机分类(对偶问题)
  4. support vector classification by Crammer and Singer
  5. L1-正则化L2-损失支撑向量机分类
 
     Cost
     正则化常数的倒数。
 
参数组合的网格我们将尝试笛卡尔乘积,也就是用5个svm的类型(types)和Cost值取(0.01,0.1, 1, 10, 100, 1000, 2000).也就是:

同样地,用交叉验证和网格搜索方法,我们找到了最好的超参数是type=4以及cost=100.又一次,我们用这些参数在所有训练数据上训练模型,并在

测试数据上做测试。交叉验证的准确率为61%,测试数据集上78%的准确率。
 
模型叠加(Meta Ensembling, 元集成)
    让我们来看一下每个模型对问题给出的分类边界,这个分类问题中一共有四个类别:Bob, Sue, Mark和Kate。

    正如我们所料,SVM将Bob和Sue之间的投掷点分得不错,但是把Kate和Mark之间的投掷点分得很差。当然考察KNN能够得到类似的结论,KNN将Kate和Mark分得很好,但是将Bob和Sue的投掷点分得很差。也就是说,模型叠加有可能取得更好的效果。这里的启示:我们做Stacking之前也应该评估一下模型之间的差异性,如果是差异很大的模型(不同的模型各有所长),Stacking就能够取得很大的效果。
否则,效果提升可能就会很小。
(具体做法是画一个图:横轴是列表的位置,从1......n,表示样本根据得分排序后,列表总共的序。纵轴是docID,且只画label大于0的样本。一个用火柴棍,一个用点。
如果两个模型的结果上,棍的顶点和点重合的很多,就说明模型的差异不大,A模型排得好的,B模型也排得好,只是整体性能有差异,那么就选最好的模型就可以了。
如果不是,那么Stacking就值得做。)
 
以上述分类问题为例,Stacking的具体步骤是:
  1. 将训练数据分为5份,叫做test fold
  1. 定义一个数据集叫做train_meta,和训练数据集有相同的原始Id和fold id,加上两个空的列M1和M2.同样地,生成一个测试集叫做test_meta,和测试集合有相同的原始Id,加上两列,M1和M2.

  1. 对于每一个交叉验证集
    {Fold1, Fold2, ..., Fold5}
 
    3.1 将另外的4个CV集合合并用作训练CV集合;

          3.2 对于每一个Base模型

          M1: K近邻模型(K=1)
          M2:SVM(type=4, cost=1000)
 
            3.2.1 用training fold训练Base模型,并对test fold进行预测。将这些预测值保存在train_meta中用作stacking model的feature。

 
  1. 用所有的训练数据训练Base模型,并对测试数据进行预测。将这些预测值保存在test_meta中。

  1. 训练一个新的模型,S(也就是stacking 模型),用M1和M2当作特征,当然,也可以原来数据中的其他特征也用上。
S:Logistic Regression
 
  1. 用stacked model S对test_meta做预测。
 
    这里我们用了Base模型的预测值作为stacked模型的特征,因此stacked模型能够知道每一个Base模型在哪些样本上表现得好,哪些样本上表现不好。此外,还有一点要注意,train_meta中每一个样本的预测值都不依赖自身产生(否则就会过拟合,理论上,这里用留一法的效果会最好。)
 
    对于test_meta的stacked特征,我们有另外一种生成方式。用交叉验证得到的5个Base模型分别对test_meta数据打分,最后5个得分平均得到最后的M1和M2,这样做的好处是节省时间,因为我们不需要用所有的训练数据训练Base模型,但是这样做的弊端是基础模型在测试数据上预测的准确度要差一些。
 
Stacked模型的超参数调整
    我们应该如何调整stacked模型的超参数呢?对于base模型,我们能够用交叉验证+网格搜索确定超参数。对于stacked模型,如果我们也用相同的数据切分方法进行超参数的调整,就会有问题。当然,换成别的数据切分方法也同样有问题。那么是什么问题呢?
 
    假设我们用之前的数据划分,用{fold2, fold3, fold4, fold5}训练staked模型S,然后在fold1上评估效果,那么问题就来了,fold2,fold3,fold4,fold5的stacked特征都是fold1参与产生的。我们用fold1参与生成特征又在fold1上验证,就产生了过拟合。最终可能导致stacked模型的超参数,在测试集上的效果可能很不好。
实际应用中,这个问题其实无法避免,但是我们应该知道这个问题的存在。
 
Stacking Model的模型选择和特征选择
    我们如何知道用什么模型作为stacker,除了stacked特征,应该选择哪些原始特征用到stacked模型的训练中呢?在作者的眼中,stacked模型和stacked特征的选择都更像是艺术而不是科学。
 
Stacking实践
    原作者通常会在Kaggle机器学习竞赛中用到stacking方法。在实际的Business中,stacking方法要增加许多复杂性来换取一点点性能提升。不过还好,stacking方法通常能够获得比单独的模型更好的性能,而且不用考虑模型的选择。就是计算量大了点儿。
 
 
 
 
 
 
 
 
 

Stacked Regression的详细步骤和使用注意事项的更多相关文章

  1. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

  2. java连接mysql数据库详细步骤解析

    java连接mysql数据库详细步骤解析      第一步:下载一个JDBC驱动包,例如我用的是:mysql-connector-java-5.1.17-bin.jar      第二步:导入下载的J ...

  3. svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录

    svn更新路径,解决办法详细步骤,eclipse里面的更新方法,svn废弃位置,Windows环境,svn服务器地址换了,如何更新本地工作目录 Windows下,svn服务器IP本来是内网一台服务器上 ...

  4. OSG入门即osgEarth建立一个地球的详细步骤

    OSG入门即osgEarth建立一个地球的详细步骤 转:http://blog.csdn.net/xiaol_deng/article/details/9246291 最近在学习有关osg的知识,刚开 ...

  5. VS2012+Win7网站发布详细步骤

    VS2012+Win7网站发布详细步骤 本机环境: 本文分三个部分介绍Web项目发布的常规方法,大神级别可以略过,主要是为了方便一些初学者. 第一部分:VS2012把项目发布到文件系统. 第二部分:I ...

  6. 用grunt搭建自动化的web前端开发环境实战教程(详细步骤)

    用grunt搭建自动化的web前端开发环境实战教程(详细步骤) jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用!前端自动化, ...

  7. iOS开发之 xcode6 APP 打包提交审核详细步骤

    一. 在xcode6.1和ios10.10.1环境下实现app发布 http://blog.csdn.net/mad1989/article/details/8167529 http://jingya ...

  8. 使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程

    使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程 先列出来总体启动流程: (1)启动zookeeper集群(hadoop01.hadoop02和hadoop03这3台机 ...

  9. linux/centos下安装nginx(rpm安装和源码安装)详细步骤

    Centos下安装nginx rpm包                                                                                 ...

随机推荐

  1. qmake 提示 Failure to open file:****

    执行qmake时报错,如下图所示: 解决方法: 将***.pro文件夹的属主改为当前用户,具体操作为: 1.切换登录用户为:root 2.#chown -R ies:ies /usr/appsoft ...

  2. 将逗号分隔 的字符串转化成List

    将逗号分隔 的字符串转化成List List<String> parIdListTmp = new ArrayList<String>(); String parIdArray ...

  3. Administrator账户密码忘了怎么办

    WIN7的Administrator账户密码忘了怎么办   1.准备一个带有winpe系统的系统光盘或者U盘 2.启动电脑,按F12选择U盘或者光盘启动,进入winpe操作系统 3.找到c:\wind ...

  4. Kafka 源代码分析之log框架介绍

    这里主要介绍log管理,读写相关的类的调用关系的介绍. 在围绕log的实际处理上.有很多层的封装和调用.这里主要介绍一下调用结构和顺序. 首先从LogManager开始. 调用关系简单如下:LogMa ...

  5. 【LeetCode】125. Valid Palindrome

    题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...

  6. 【Android Developers Training】 21. 创建一个可变动的UI

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. Java程序设计模式系列之适配器模式

    理解适配器设计模式需要从生活中的场景进行联系,在生活当中有那些东西能够称为适配器呢?从字面上理解,"适配"的意思就是让一个东西和另一个东西配对,能够让他们一起工作,比如大家用的笔记 ...

  8. 如何在家自制LED灯?很简单,我来告诉你!

    首先LED分凸头.平头和凹头,当中的凹头是没无方向性. 做示宽灯这类晚间才运用的光源,用凹头就好,它没无方向性,可将整个反光碗照亮. 做转向灯等指示性的光源用,准绳上应该用凸头的,它是个聚光镜,投映的 ...

  9. Building Apps for Windows 10 on LattePanda–Jump Start

    1.引言 目前来看,LattePanda应该是最小的运行Full Windows 10系统的开发板了(注意,不是Windows 10 for Mobile,也不是Windows 10 IoT系列,而是 ...

  10. 打造属于自己的支持版本迭代的Asp.Net Web Api Route

    在目前的主流架构中,我们越来越多的看到web Api的存在,小巧,灵活,基于Http协议,使它在越来越多的微服务项目或者移动项目充当很好的service endpoint. 问题 以Asp.Net W ...