机器学习模型融合方法综述
最近我发现读者群里很多同学都对算法竞赛产生了兴趣,不少人已经开始自发组队,准备打榜Kaggle了。于是我邀请了Kaggle Master贝塔同学,对竞赛中常用的模型融合方法做了一个总体介绍。看完你会对机器学习的模型融合策略有更系统清晰的了解。以下是原文:
我理解的Kaggle比赛中提高成绩主要有3个地方:1)特征工程,2)调参,3)模型融合。
之前每次打比赛我都只做了前两部分,最后的模型融合就是简单的加权平均,对于进阶的Stacking方法一直没尝试,最近摸索了一下还是把Stacking方法给弄懂了。下面我重点讲解Stacking,Bagging和Boosting有很多权威的好教程,所以不详细介绍。
最早的Stacking思想早些年就有论文发表,但是应用Stacking方法到比赛中的相关文章还是少之甚少。本文不涉及到各个算法原理层次的深度,目的在于从宏观上帮助理解这几个模型融合方法。
一、Voting
模型融合其实也没有想象的那么高大上,从最简单的Voting说起,这也可以说是一种模型融合。
假设对于一个二分类问题,有3个基础模型,那么就采取投票制的方法,投票多者确定为最终的分类。
二、Averaging
对于回归问题,一个简单直接的思路是取平均。稍稍改进的方法是进行加权平均,权值可以用排序的方法确定。
举个例子,比如A、B、C三种基本模型,模型效果进行排名,假设排名分别是1,2,3,那么给这三个模型赋予的权值分别是3/6、2/6、1/6
这两种方法看似简单,其实后面的高级算法也可以说是基于此而产生的,Bagging或者Boosting都是一种把许多弱分类器这样融合成强分类器的思想。
三、Bagging
Bagging就是采用有放回的方式进行抽样,用抽样的样本建立子模型,对子模型进行训练,这个过程重复多次,最后进行融合。大概分为这样两步:
1.重复K次
1)有放回地重复抽样建模
1)训练子模型
2.模型融合
1)分类问题:voting
2)回归问题: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部分:
用train_a训练模型M1,然后在train_b上进行预测得到preb3和pred4:
在train_b上训练模型M1,然后在train_a上进行预测得到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。
该图是一个基模型得到P1和T1的过程,采用的是5折交叉验证,所以循环了5次,拼接得到P1,测试集预测了5次,取平均得到T1。而这仅仅只是第二层输入的一列/一个特征,并不是整个训练集。
Python实现
用了一个泰坦尼克号的尝试了一下代码,从头到尾都是可以运行的。针对其中一段关键的稍作分析:
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分享的图片总结一下一起交流想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定o要备注信息才能通过)- END -NLP 预训练家族再思考
2021-12-22EMNLP 2021 | 百度:多语言预训练模型ERNIE-M
2021-12-17浅谈 NLP 细粒度情感分析(ABSA)
2021-12-13请回答2022!了不起的程序员
2021-12-19
机器学习模型融合方法综述相关推荐
- 独家 | 机器学习模型应用方法综述
作者:Julien Kervizic 翻译:陈之炎 校对:李海明 本文约5700字,建议阅读10+分钟. 本文整理比较模型部署到生产中使用的不同部署模型方式.生命周期管理方法及数据存储格式. Mant ...
- 机器学习方法_机器学习模型应用方法综述
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 数据派THU(id:DatapiTHU) 作者:Julien Kervizic 翻译:陈之炎 ...
- 【机器学习】集成学习与模型融合方法举例
[机器学习]集成学习与模型融合方法举例 文章目录 1 概述1.1 什么是集成学习 2 CrossValidation 交叉验证 3 stacking 4 Voting投票器 5 Bagging 1 概 ...
- python 导入模型h20_【机器学习】模型融合方法概述
我理解的Kaggle比赛中提高成绩主要有3个地方 特征工程 调参 模型融合 之前每次打比赛都只做了前两部分,最后的模型融合就是简单的加权平均,对于进阶的Stacking方法一直没尝试,这几天摸索了一下 ...
- 【机器学习】模型融合方法概述
补充: 转自:https://zhuanlan.zhihu.com/p/25836678 我理解的Kaggle比赛中提高成绩主要有3个地方 特征工程 调参 模型融合 之前每次打比赛都只做了前两部分,最 ...
- 模型融合方法最全总结!
本文是模型融合的经验方法总结.包含了投票法.平均法.排序法.Stacking 和 Blending. 一.背景 之前有段时间打数据挖掘类比赛,看到很多选手用模型融合的技巧,特别是比赛后期的时候,很多选 ...
- R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型、构建融合(集成)预测模型、使用融合模型进行预测推理
R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型.构建融合(集成)预测模型.自定义融合模型的trainControl参数.method参数.评估指标参数 ...
- 文献记录(part60)--高维模型选择方法综述
学习笔记,仅供参考,有错必纠 关键词:高维数据;模型选择;惩罚因子;降维;调整参数 文章目录 高维模型选择方法综述 摘要 引言 惩罚因子模型选择法 LASSO方法及其推广 LASSO方法 两步法LAS ...
- 帮推|基于深度学习的图像融合方法综述
基于深度学习的图像融合方法综述 博主朋友关于图像融合的综述论文基于深度学习的图像融合方法综述已被<中国图象图形学报>正式接收! 极力推荐想要入门图像融合领域的小伙伴下载学习,此外希望在图像 ...
最新文章
- NB-IoT与LoRa,两马领跑物联网竞赛,谁将最终胜出?
- python面向对象重新梳理
- SpringBoot中在除controller以外注入service-过滤器中注入
- 前端开发从项目中获得什么_我如何获得副项目的前10个客户以及从他们那里学到的东西...
- flask mysql 版本_flask 数据库字段类型
- IDEA用maven创建springMVC项目和配置
- extern作用详解
- 电气工程类中文核心期刊
- 终端安全防护技术研究(四)
- Google Hack
- 结对编程_我从结对编程面试中学到的东西
- Linux下的图片编辑软件
- EVB_MX+ TencentOS tiny物联网开发板首次使用记录路灯调试(1)
- 鼠标点桌面计算机图标闪,用鼠标点击桌面图标老闪动是怎么回事?
- PMP快速通过经验分享
- linux 挂载以及初始化硬盘
- 2019美和易思第十一期班主任选拔培训(贵州+重庆区域)拉开帷幕
- 百度云提速方法 免费+非破解+不下载软件
- 7-3 学习打卡(12.19)
- 时差 频差 双星定位 matlab,双星时差频差无源定位系统定位算法工程指标分析