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

最近做推荐的时候,开始接触到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. Android的UI调优

    对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿. 在理想情况下,全部的测量.布局和绘制的时间最好在16ms以内,这样才能保证屏幕运行的顺畅性. ...

  2. jquery移出select指定option

    $("#selectLine option[value!='']").remove();

  3. Android 音乐播放

    android简单音乐播放控制代码 这个几个月业余时间一直在做一个android项目,里面涉及到了音乐播放功能.很简单那种,播放.暂停.上一曲.下一曲.音量调节等. 音乐播放主要使用的对象是Media ...

  4. 怎样用DOS命令创建txt文本文档

    单击运行, 打开命令提示符. 例如在D盘创建文本文档,那么就先进入D盘,在后面写 D: 于是就进入了D盘怎样用DOS命令创建txt文本文档 然后在后面写命令 copy con 文件名.txt ,然后回 ...

  5. jquery取出所有包含class='engineer_val'的值

    $(".engineer_val").each(function(){ //jquery取出所有包含class='engineer_val'的值 $(); });

  6. 【Android Developers Training】 91. 解决云储存冲突

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

  7. android app调试没问题,但打包签名的apk,运行时出现闪退怎么办?

    在用Eclipse编写Android app时,有时调试时没有问题,但一经打包签名,运行就出现闪退,还报错说找不到某某类.一开始以为是混淆导致的,后来我没有混淆竟然也还是这个问题.无奈只得网上寻找解决 ...

  8. MaintainableCSS 《可维护性 CSS》 --- ID 篇

    ID 从语法上讲,当只有一个实例时,我们应该使用一个ID.当有多个时,我们应该使用一个 class. 但是,ID 作用的优先级高于 class ,在我们想覆盖一个样式的时候,这就会导致问题. 为了演示 ...

  9. Android Studio 运行java程序

    当我们装了Android Studio 学习安卓开发的时候,难免会要学习java,这时候,难道在重新装一个编译器吗?不需要,我们直接用 Android Studio 就可以. 1.新建一个空项目,选择 ...

  10. Java IO学习笔记(四)打印流

    1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStre ...