补充:


转自:https://zhuanlan.zhihu.com/p/25836678

我理解的Kaggle比赛中提高成绩主要有3个地方

  1. 特征工程
  2. 调参
  3. 模型融合

之前每次打比赛都只做了前两部分,最后的模型融合就是简单的加权平均,对于进阶的Stacking方法一直没尝试,这几天摸索了一下还是把Stacking方法给弄懂了。(本文重点讲解Stacking,Bagging和Boosting有很多权威的好教程,所以不详细介绍)最早的Stacking思想早些年就有论文发表,但是应用Stacking方法到比赛中的相关文章还是少之甚少,这有两篇https://mlwave.com/kaggle-ensembling-guide/、HUMAN ENSEMBLE LEARNING讲的很棒,但是之前因为理解不到位,有几处卡住了。在@Wille 的文章如何在 Kaggle 首战中进入前 10%中Stacking只是作为一部分提到。因此决定自己写一篇关于模型融合的文章。本文不涉及到各个算法原理层次的深度,目的在于从宏观上帮助理解这几个模型融合方法。

一、Voting

模型融合其实也没有想象的那么高大上,从最简单的Voting说起,这也可以说是一种模型融合。假设对于一个二分类问题,有3个基础模型,那么就采取投票制的方法,投票多者确定为最终的分类。

二、Averaging

对于回归问题,一个简单直接的思路是取平均。稍稍改进的方法是进行加权平均。权值可以用排序的方法确定,举个例子,比如A、B、C三种基本模型,模型效果进行排名,假设排名分别是1,2,3,那么给这三个模型赋予的权值分别是3/6、2/6、1/6
这两种方法看似简单,其实后面的高级算法也可以说是基于此而产生的,Bagging或者Boosting都是一种把许多弱分类器这样融合成强分类器的思想。

三、Bagging

Bagging就是采用有放回的方式进行抽样,用抽样的样本建立子模型,对子模型进行训练,这个过程重复多次,最后进行融合。大概分为这样两步:

  1. 重复K次

    • 放回地重复抽样建模
    • 训练子模型
  2. 模型融合

    • 分类问题:voting
    • 回归问题:average

Bagging算法不用我们自己实现,随机森林就是基于Bagging算法的一个典型例子,采用的基分类器是决策树。R和python都集成好了,直接调用。

四、Boosting

Bagging算法可以并行处理,而Boosting的思想是一种迭代的方法,每一次训练的时候都更加关心分类错误的样例,给这些分类错误的样例增加更大的权重,下一次迭代的目标就是能够更容易辨别出上一轮分类错误的样例。最终将这些弱分类器进行加权相加。引用加州大学欧文分校Alex Ihler教授的两页 PPT

同样地,基于Boosting思想的有AdaBoost、GBDT等,在R和python也都是集成好了直接调用。

PS:理解了这两点,面试的时候关于Bagging、Boosting的区别就可以说上来一些,问Randomfroest和AdaBoost的区别也可以从这方面入手回答。也算是留一个小问题,随机森林、Adaboost、GBDT、XGBoost的区别是什么?

五、Stacking

Stacking方法其实弄懂之后应该是比Boosting要简单的,毕竟小几十行代码可以写出一个Stacking算法。我先从一种“错误”但是容易懂的Stacking方法讲起。
Stacking模型本质上是一种分层的结构,这里简单起见,只分析二级Stacking.假设我们有3个基模型M1、M2、M3。

1. 基模型M1,对训练集train训练,然后用于预测train和test的标签列,分别是P1,T1

对于M2和M3,重复相同的工作,这样也得到P2,T2,P3,T3。

2. 分别把P1,P2,P3以及T1,T2,T3合并,得到一个新的训练集和测试集train2,test2.


3. 再用第二层的模型M4训练train2,预测test2,得到最终的标签列。

Stacking本质上就是这么直接的思路,但是这样肯定是不行的,问题在于P1的得到是有问题的,用整个训练集训练的模型反过来去预测训练集的标签,毫无疑问过拟合是非常非常严重的,因此现在的问题变成了如何在解决过拟合的前提下得到P1、P2、P3,这就变成了熟悉的节奏——K折交叉验证。我们以2折交叉验证得到P1为例,假设训练集为4行3列

将其划分为2部分

用traina训练模型M1,然后在trainb上进行预测得到preb3和pred4

在trainb上训练模型M1,然后在traina上进行预测得到pred1和pred2

然后把两个预测集进行拼接

对于测试集T1的得到,有两种方法。注意到刚刚是2折交叉验证,M1相当于训练了2次,所以一种方法是每一次训练M1,可以直接对整个test进行预测,这样2折交叉验证后测试集相当于预测了2次,然后对这两列求平均得到T1。
或者直接对测试集只用M1预测一次直接得到T1。
P1、T1得到之后,P2、T2、P3、T3也就是同样的方法。理解了2折交叉验证,对于K折的情况也就理解也就非常顺利了。所以最终的代码是两层循环,第一层循环控制基模型的数目,每一个基模型要这样去得到P1,T1,第二层循环控制的是交叉验证的次数K,对每一个基模型,会训练K次最后拼接得到P1,取平均得到T1。这下再把@Wille博文中的那张图片放出来就很容易看懂了。


该图是一个基模型得到P1和T1的过程,采用的是5折交叉验证,所以循环了5次,拼接得到P1,测试集预测了5次,取平均得到T1。而这仅仅只是第二层输入的一列/一个特征,并不是整个训练集。再分析作者的代码也就很清楚了。也就是刚刚提到的两层循环。

python实现

用了一个泰坦尼克号的尝试了一下代码,从头到尾都是可以运行的。代码放在 Github ,针对其中一段关键的稍作分析

def get_oof(clf, x_train, y_train, x_test):oof_train = np.zeros((ntrain,))  oof_test = np.zeros((ntest,))oof_test_skf = np.empty((NFOLDS, ntest))  #NFOLDS行,ntest列的二维arrayfor i, (train_index, test_index) in enumerate(kf): #循环NFOLDS次x_tr = x_train[train_index]y_tr = y_train[train_index]x_te = x_train[test_index]clf.fit(x_tr, y_tr)oof_train[test_index] = clf.predict(x_te)oof_test_skf[i, :] = clf.predict(x_test)  #固定行填充,循环一次,填充一行oof_test[:] = oof_test_skf.mean(axis=0)  #axis=0,按列求平均,最后保留一行return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)  #转置,从一行变为一列

这里只实现了针对一个基模型做K折交叉验证,因为P1和T1都是多行一列的结构,这里是先存储为一行多列,最后进行转置。
但是Stacking方法其实在R中也有集成好的可以调用。

caretEnsemble包下的caretStack()方法

关键代码如下:

algorithmList <- c('lda', 'rpart', 'glm', 'knn', 'svmRadial')
stackControl <- trainControl(method="repeatedcv", number=10, repeats=3, savePredictions=TRUE, classProbs=TRUE)
stack.glm <- caretStack(models, method="glm", metric="Accuracy", trControl=stackControl)

有一篇 博文 讲的比较详细

h2o包的h2o.stack()方法

关键代码如下:

nfolds <- 5
glm1 <- h2o.glm(x = x, y = y, family = family,training_frame = train,nfolds = nfolds,fold_assignment = "Modulo",keep_cross_validation_predictions = TRUE)
gbm1 <- h2o.gbm(x = x, y = y, distribution = "bernoulli",training_frame = train,seed = 1,nfolds = nfolds,fold_assignment = "Modulo",keep_cross_validation_predictions = TRUE)
rf1 <- h2o.randomForest(x = x, y = y, # distribution not used for RFtraining_frame = train,seed = 1,nfolds = nfolds,fold_assignment = "Modulo",keep_cross_validation_predictions = TRUE)
dl1 <- h2o.deeplearning(x = x, y = y, distribution = "bernoulli",training_frame = train,nfolds = nfolds,fold_assignment = "Modulo",keep_cross_validation_predictions = TRUE)
models <- list(glm1, gbm1, rf1, dl1)
metalearner <- "h2o.glm.wrapper"
stack <- h2o.stack(models = models,response_frame = train[,y],metalearner = metalearner,seed = 1,keep_levelone_data = TRUE)
# Compute test set performance:
perf <- h2o.ensemble_performance(stack, newdata = test)

详情见 h2o的Github网站
最后放一张H2O分享的图片总结一下

【机器学习】模型融合方法概述相关推荐

  1. python 导入模型h20_【机器学习】模型融合方法概述

    我理解的Kaggle比赛中提高成绩主要有3个地方 特征工程 调参 模型融合 之前每次打比赛都只做了前两部分,最后的模型融合就是简单的加权平均,对于进阶的Stacking方法一直没尝试,这几天摸索了一下 ...

  2. 机器学习模型融合方法综述

    最近我发现读者群里很多同学都对算法竞赛产生了兴趣,不少人已经开始自发组队,准备打榜Kaggle了.于是我邀请了Kaggle Master贝塔同学,对竞赛中常用的模型融合方法做了一个总体介绍.看完你会对 ...

  3. 【机器学习】集成学习与模型融合方法举例

    [机器学习]集成学习与模型融合方法举例 文章目录 1 概述1.1 什么是集成学习 2 CrossValidation 交叉验证 3 stacking 4 Voting投票器 5 Bagging 1 概 ...

  4. 模型融合方法最全总结!

    本文是模型融合的经验方法总结.包含了投票法.平均法.排序法.Stacking 和 Blending. 一.背景 之前有段时间打数据挖掘类比赛,看到很多选手用模型融合的技巧,特别是比赛后期的时候,很多选 ...

  5. R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型、构建融合(集成)预测模型、使用融合模型进行预测推理

    R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型.构建融合(集成)预测模型.自定义融合模型的trainControl参数.method参数.评估指标参数 ...

  6. 深度学习核心技术精讲100篇(十)-机器学习模型融合之Kaggle如何通过Stacking提升模型性能

    前言 之前的文章中谈到了机器学习项目中,要想使得使得机器学习模型进一步提升,我们必须使用到模型融合的技巧,今天我们就来谈谈模型融合中比较常见的一种方法--stacking.翻译成中文叫做模型堆叠,接下 ...

  7. 推荐系统系列教程之十四:经典模型融合方法----线性模型和树模型的组合拳

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十三期,今天按约推出第十四期:经典模型融合办法----线性模型和树模型的组合拳.希望朋友们多点"在看", ...

  8. 【机器学习】机器学习模型迭代方法(Python)

    一.模型迭代方法 机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种: 1.全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全 ...

  9. kaggle点赞最多的 泰坦尼克号数据竞赛模型融合方法(附代码)

    听说很多大佬都是从kaggle上获取的知识, 加工整理成一套属于自己的竞赛体系 今年7月份我开始参加大数据竞赛, 现在差不多有10场比赛了, 都是结构化比赛. 小的比赛还能进Top名次, 大点的比赛就 ...

最新文章

  1. 用python计算贷款_Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例...
  2. linux-centerOs6.8安装nginx与配置
  3. 第三课——MFC编程
  4. 史上最全亚历山大大帝名言
  5. Win32 设备管理(2)
  6. 2020年的UI设计师需要会什么软件
  7. 11、classmethod和staticmethod
  8. Codeforces 1029B. Creating the Contest 动态规划O(nlogn)解法 及 单调队列O(n)解法
  9. JS等比例缩小图片尺寸
  10. Luogu4587[FJOI2016] 神秘数
  11. 表达式求值——数据结构严蔚敏C语言版栈数据结构课后练习
  12. MATLAB自带的遗传算法工具箱(GADS)
  13. 电视android怎么连接手机助手下载,投屏助手app下载 投屏助手(手机投屏到电视) for Android v2.0 安卓版 下载-脚本之家...
  14. 微信小程序 弹出确定取消框
  15. python将png图片透明背景转换为白色
  16. exchange协议发送邮件
  17. 基于ZFC公理系统的无穷小微积分学
  18. dalsa工业相机8k参数_dalsa线阵相机Linea系列2K4K8K
  19. 1155芯片组H61/H67/P67/Z68的区别一览表
  20. Interwine China 2009广州国际名酒展

热门文章

  1. 远程服务器ip地址可以更改吗,Web远程管理服务器端的IP地址如何进行设置?
  2. 【内存卡数据恢复】恢复删除文件
  3. 8虚拟机字节码执行引擎
  4. 【虚拟人快讯】超写实虚拟人青鸟发布,脑白金推出数字人形象
  5. 视觉机器学习20讲-MATLAB源码示例(14)-字典学习算法
  6. Makefile学习笔记06|编译动态链接库
  7. tomcat的一些问题
  8. 一、运维岗网络面试题收集
  9. Scratch少儿编程案例-坦克大战-多武器-多关卡-多Boss
  10. 【AI大模型】国产360大模型智脑大模型介绍