集成学习-stacking算法

众所周知,集成学习算法,它将多个弱分类器集成起来,以达到较高的分类准确率。常见的集成学习方法:boosting bagging stacking今天主要讲stacking.Stacking的基本思想将个体学习器结合在一起的时候使用的方法叫做结合策略。对于分类问题,我们可以使用投票法来选择输出最多的类。对于回归问题,我们可以将分类器输出的结果求平均值。…

大家好,又见面了,我是你们的朋友全栈君。

众所周知,集成学习算法,它将多个弱分类器集成起来,以达到较高的分类准确率。

常见的集成学习方法:

  • boosting
  • bagging
  • stacking

今天主要讲stacking.

Stacking 的基本思想

        将个体学习器结合在一起的时候使用的方法叫做结合策略。对于分类问题,我们可以使用投票法来选择输出最多的类。对于回归问题,我们可以将分类器输出的结果求平均值。

       上面说的投票法和平均法都是很有效的结合策略,还有一种结合策略是使用另外一个机器学习算法来将个体机器学习器的结果结合在一起,这个方法就是Stacking。

       在stacking方法中,我们把个体学习器叫做初级学习器,用于结合的学习器叫做次级学习器或元学习器(meta-learner),次级学习器用于训练的数据叫做次级训练集。次级训练集是在训练集上用初级学习器得到的。

stacking学习算法。

集成学习-stacking算法

过程1-3 是训练出来个体学习器,也就是初级学习器。

过程5-9 是 使用训练出来的个体学习器来得预测的结果,这个预测的结果当做次级学习器的训练集。

过程11 是用初级学习器预测的结果训练出次级学习器,得到我们最后训练的模型。

如果想要预测一个数据的输出,只需要把这条数据用初级学习器预测,然后将预测后的结果用次级学习器预测便可。

                                                                                                            ——来自周志华老师《机器学习》

集成学习-stacking算法

Stacking的实现

  最先想到的方法是这样的,

  •   用数据集D来训练h1,h2,h3…,
  •   用这些训练出来的初级学习器在数据集D上面进行预测得到次级训练集。
  •   用次级训练集来训练次级学习器。

  但是这样的实现是有很大的缺陷的。在原始数据集D上面训练的模型,然后用这些模型再D上面再进行预测得到的次级训练集肯定是非常好的。会出现过拟合的现象。

Stacking是模型融合的一个重要的方法,几乎每个数据科学竞赛的前几名都会使用,接下来我主要是介绍stacking的原理。

相信大家看很多stacking的资料都会看到下面的这个图:

集成学习-stacking算法

这个图很形象,他具体是这样做的(交叉验证):

首先我们将训练集使用kfold切分为k分,每一分包括一个验证集和测试集,每次取其中k-1分训练,另外的1分用来验证,stacking是这样做的。

比如对于集成的第一个模型,clf1,我们使用kfold交叉验证,那么可以得到k个clf1模型,模型的类型是一样的,但是模型里面学到的参数不一样,因为他们的训练集是不一样的,对与每一折的训练,我们还有一个验证集啊,那么我们用训练得到的模型在验证集合上做一次预测,你想,因为这个时候我们的验证集是不是只有1分,也就是只有train_set_number/k个样本(train_set_number表示训练样本的个数),但是这只是一折啊,我们还有k折,每一折我们都会在验证集上预测,所以最终对于clf1在验证集上得到是不是train_set_number个结果,不用担心是没有重复的,因为你是kflod。

是不是每一折的验证集样本都不会相同,也就是没有哪个样本同时出现在两个验证集上,这样下来,我们就得到第一级的结果,也是train_set_number个结果。

然后在每一折上,我们在测试集上做一次预测,那么k个clf1模型预测k次得到了k个结果,也就是每一个样本预测结果有k个,我们就取一下平均,看到是取平均,这样取完平均以后每一个样本在clf1模型上就得到一个预测结果。这只是一个模型的过程,因为我们需要集成很多个模型,那么我重复n个模型,做法和上面是一样的,假设我们有n个模型,那么请问我们stacking第一层出来,在验证集上得到的结果特征是什么维度?应该就是训练样本的个数行(train_set_number),列数就是n吧,因为n个模型啊,这就是我们对第一层结果的一个特征堆叠方法,这样第一层出来的结果又可以作为特征训练第二层,第二层任然可以使用stacking多个模型,或者直接接一个模型用于训练,然后直接预测。那么同样,对于测试集第一层出来的维度是不是(test_set_number,n),也就是测试集样本的行数,这样是不是可以用第二层训练的模型在这个上面预测,得到我们最后的结果。这个就是stacking的整个过程。

然后我们看一段stacking的代码:

集成学习-stacking算法

构造stacking类

事实上还可以构造一个stacking的类,它拥有fit和predict方法

集成学习-stacking算法

参考:

https://www.cnblogs.com/jiaxin359/p/8559029.html

https://zhuanlan.zhihu.com/p/32896968

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128248.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 编程小白的博客日记[通俗易懂]

    编程小白的博客日记[通俗易懂]编程小白的博客日记2018-11-9星期五晴最近放假,一天下来好像什么都没干,不过今天去看了《毒液》,还是非常好看的,最皮我毒液!今天在网上看到一篇文章,是关于在python中使用you-get来下载网上的视频和音乐之类的,先打开cmd安装you-get,之后再打开一个cmd,输入you-get-o地址,然后就能下载视频了,不过如果这个视频在原…

  • ExecuteNonQuery()_sql存储过程返回值

    ExecuteNonQuery()_sql存储过程返回值本文实例讲述了C#中ExecuteNonQuery()返回值注意点。对于C#数据库程序设计有一定的借鉴价值。分享给大家供大家参考之用。具体分析如下:首先,在查询某个表中是否有数据的时候,我们通常用ExecuteNonQuery(),并通过判断值是否大于0来判断数据的存在与否。结果与我所设想的很不一致,调试时才发现,其执行后返回的结果是-1,对此我很是不理解,回头查了下资料,如下显示:SqlComm…

  • JVM调优工具「建议收藏」

    JVM调优工具「建议收藏」JVM调优工具Jconsole:jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。JProfiler:商业软件,需要付费。功能强大。VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。如何调优观察内存释放情况、集合类检查、对象树上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能堆信息查…

  • 关于libsvm的PCA和 网格寻优「建议收藏」

    关于libsvm的PCA和 网格寻优「建议收藏」这篇博客写的很乱,只是先大致记录一下,后期行得通再慢慢补充。之前稍微整理了libsvm的内容,但是还有很多没搞懂,最近因为论文思路卡住了,所以又反过来弄libsvm因为看人家的论文,偏应用的方面,流程都非常完整,特征提取以后,一般有降维,有参数寻优,所以就很想实现这些功能,因为对比实验真的一点也写不下去了,头大…而且svm的工具箱非常的成熟了,除了常用的libsvm工具包,还有Libsvm-FarutoUltimate的工具包,这是一个基于libsvm的工具箱,增加了许多实用的功能:降维、参数寻优、可

  • Promise的含义和用法「建议收藏」

    Promise的含义和用法「建议收藏」含义Promise是异步编程的一种解决方案。Promise对象有以下2个特点:1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其…

  • 第一天来到新公司的volg (ETL开发工程师)[通俗易懂]

    第一天来到新公司的volg (ETL开发工程师)[通俗易懂]第一天来到新公司的volg(ETL开发工程师)新的改变首先自我介绍一下,我是一名刚刚大学毕业的程序猿,在大学完了两年,到最后大三一年才开始认真的去学习编程的各种知识,开源框架,看视频代码。现在是大数据时代,我也想跟着潮流,所以我第一份工作就选择了ETL开发,为以后大数据开发做基础铺垫,毕竟现在大数据开发都没公司直接招实习生或刚刚毕业的人。新的工作先说一下今天来公司吧,上午大概就是9点到…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号