模型融合及 python 实现
“如果你没有什么好的思路的话,那么就模型融合吧!”
Stacking 利器(mlxtend 库):
在 KDD CUP、Kaggle、天池等数据挖掘比赛中,常常用到集成学习。使用了集成学习后,模型的效果往往有很大的进步。
本文将介绍常见的集成学习方法,包括但不限于:
集成学习为什么有效
Voting
Linear Blending
Stacking
Bagging
随机森林
集成学习
如果硬要把集成学习进一步分类,可以分为两类,一种是把强分类器进行强强联合,使得融合后的模型效果更强,称为模型融合。另一种是将弱分类器通过学习算法集成起来变为很强的分类器,称为机器学习元算法。
这里我们把用来进行融合的学习器称为个体学习器。
模型融合的代表有:投票法 (Voting)、线性混合 (Linear Blending)、Stacking。
而机器学习元算法又可以根据个体学习器之间是否存在依赖关系分为两类,称为 Bagging 和 Boosting:
Bagging: 个体学习器不存在依赖关系,可同时对样本随机采样并行化生成个体学习器。代表作为随机森林 (Random Forest)
Boosting: 个体学习器存在依赖关系, 基于前面模型的训练结果误差生成新的模型,必须串行化生成。代表的算法有:Adaboost、GBDT、XGBoost
模型融合
上面提到,模型融合是把强分类器进行强强联合,变得更强。
在进行模型融合的时候,也不是说随意的融合就能达到好的效果。进行融合时,所需的集成个体(就是用来集成的模型)应该好而不同。好指的是个体学习器的性能要好,不同指的是个体模型的类别不同。
这里举个西瓜书的例子,在介绍例子之前,首先提前介绍简单投票法,以分类问题为例,就是每个分类器对样例进行投票,哪个类别得到的票数最多的就是融合后模型的结果。
在上面的例子中,采用的就是简单的投票法。中间的图 b 各个模型输出都一样,因此没有什么效果。第三个图 c 每个分类器的精度只有 33%,融合后反而更糟。也就是说,想要模型融合有效果,个体学习器要有一定的准确率,并且要有多样性,学习器之间具有差异,即” 好而不同 “。
如何做到好而不同呢?可以由下面几个方面:
针对输入数据:使用采样的方法得到不同的样本(比如 bagging 方法采用自助法进行抽样)
针对特征:对特征进行抽样
针对算法本身:
个体学习器
来自不
同的模型集合
个体学习器
来自于同一个模型集合的
不同超参数
,例如学习率η不同
算法本身具有随机性,例如用不同的随机种子来得到不同的模型
针对输出:对输出表示进行操纵以增强多样性
如将多分类转化为多个二分类任务来训练单模型
将分类输出转化为回归输出等
投票和平均 Voting and Average
分类
对于分类任务来说,可以使用投票的方法:
简单投票法:
即各个分类器输出其预测的类别,取最高票对应的类别作为结果。若有多个类别都是最高票,那么随机选取一个。
加权投票法:
和上面的简单投票法类似,不过多了权重αi,这样可以区分分类器的重要程度,通常
此外,个体学习器可能产生不同的
的值,比如类标记和类概率。
类标记
,若 hi 将样本
x
预测为类别
取值为 1,否则为 0。使用类标记的投票亦称 “硬投票”。(其实就是多分类的输出),使用类标记的称为
硬投票
类概率
,即输出类别为
的概率。使用类概率的投票称为
软投票
。
对应 sklearn 中的 VotingClassifier 中 voting 参数设为 soft。
PS:使用类概率进行结合往往比直接基于类标记的效果好,即使分类器估计出的概率值一般都不太准确。
回归
对于回归任务来说,采用的为平均法 (Average):
简单平均:
加权平均:
首先我们回顾两个概念:
holdout 和交叉验证是两个常用的评估分类器预测准确率的技术,它们均是在给定数据集中随机取样划分数据。 holdout:将所给定的数据集随机划分成两个独立部分:一个作为训练数据集,而另一个作为测试数据集,通常训练数据集包含初始数据集中的三分之二的数据,而其余的三分之一则作为测试数据集的内容。利用训练集数据学习获得一个分类器