模型融合(集成)
参考博客:Kaggle Ensembling Guide (https_mlwave.com)
模型集成是融合多个训练好的模型,基于某种方式实现测试数据的多模型融合,这样来使最终的结果能够“取长补短”,融合各个模型的学习能力,提高最终模型的泛化能力。模型集成方法主要应用在几个模型差异性较大,相关性较小上。
常用的model ensemble方法有:投票(voting), 平均(averaging), 堆叠(Stacking),非交叉堆叠(Blending),其中投票法和平均法是通过对结果进行整合,stacking和blending是对模型进行融合。
目录
1.投票法
当三个模型相关性比较大时,如下:
model1:1111111100 = 80% 准确率
model2:1111111100 = 80% 准确率
model3:1011111100 = 70% 准确率
第一列111,投票为1;第二列110,投屏为1;第三列111投票为1;…
最终三个模型融合投票后到:1111111100=80%,最终的准去率还是80%,并没有提升。
当三个模型相关性小时,如下:
model1:1111111100 = 80% 准确率
model2:0111011101 = 70% 准确率
model3:1000101111 = 60% 准确率
第一列101,投票为1;第二列110,投屏为1;第三列110,投票为1;…
最终三个模型融合投票后到:1111111101=90%,准确率得到提升。
投票法在大预测时比较有意义,比如多分类任务。
2.加权表决融合
多数表决的融合方式默认了所有模型的重要度是一样的,但通常情况下我们会更重视表现较好的模型而需要赋予更大的权值。在加权表决的情况下,表现较差的模型只能通过与其他模型获得一样的结果来增强自己的说服力。
Model | Public Accuracy Score |
---|---|
GradientBoostingMachine | 0.65057 |
RandomForest Gini | 0.75107 |
RandomForest Entropy | 0.75222 |
ExtraTrees Entropy | 0.75524 |
ExtraTrees Gini (Best) | 0.75571 |
Voting Ensemble (Democracy) | 0.75337 |
Voting Ensemble (3*Best vs. Rest) | 0.75667 |
可以看到加权表决融合比平均表决融合准确率有提升。
3.对结果取平均
但如果对结果取平均,可以在一定程度上减轻过拟合现象。可以算作减轻过拟合的一种方法。
用随机权重初始化5个感知器,并通过平均值组合它们的预测,所得到的结果也有所提升。
Model | Public AUC Score |
---|---|
Perceptron | 0.95288 |
Random Perceptron | 0.95092 |
Random Perceptron | 0.95128 |
Random Perceptron | 0.95118 |
Random Perceptron | 0.95072 |
Bagged Perceptrons | 0.95427 |
4.等级平均
当平均多个不同模型的输出时,可能会出现一些问题。并不是所有的预测都是经过完美校准的:当预测低概率或高概率时,它们可能会过度自信或信心不足。或者预测在一定范围内杂乱无章。
可能会出现以下情况:将以下四个模型融合,结果进行平均,对准确率不会有任何提升。
Id Prediction
1 0.57
2 0.04
3 0.96
4 0.99
所以采用一种等级平均方法:即将预测转化为等级,然后对等级进行平均。
Id, Rank, Prediction
1, 1, 0.35000056
2, 0, 0.35000002
3, 2, 0.35000098
4, 3, 0.35000111
归一化等级
Id, Prediction
1, 0.33
2, 0.0
3, 0.66
4, 1.0
使用了多个Vowpal Wabbit模型和一个 GLMNet模型进行融合,对比平均和等级平均两种方法。
Model | Public | Private |
---|---|---|
Vowpal Wabbit A | 0.60764 | 0.59962 |
Vowpal Wabbit B | 0.60737 | 0.59957 |
Vowpal Wabbit C | 0.60757 | 0.59954 |
GLMNet | 0.60433 | 0.59665 |
Average Bag | 0.60795 | 0.60031 |
Rank average Bag | 0.61027 | 0.60187 |
5.Stacking
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。
简单来说:数据集有Train和Test,模型对一层有5个基模型,第二层自己去构造(通常为线性模型LR)。
1.将Train划分5个小train,分别为train1,train2,train3,train4,train5。
将5个train进行组合有:
(1)训练集:train2,train3,train4,train5。预测集:train1
(2)训练集:train1,train3,train4,train5。预测集:train2
(3)训练集:train1,train2,train4,train5。预测集:train3
(4)训练集:train1,train2,train3,train5。预测集:train4
(5)训练集:train1,train2,train3,train4。预测集:train5
2.将(1),(2),(3),(4),(5)分别去训练、预测基模型1,得到5个预测结果,将这5个结果称作:元特征集1
将(1),(2),(3),(4),(5)分别去训练、预测基模型2,得到5个预测结果,将这5个结果称作:元特征集2
将(1),(2),(3),(4),(5)分别去训练、预测基模型3,得到5个预测结果,将这5个结果称作:元特征集3
将(1),(2),(3),(4),(5)分别去训练、预测基模型4,得到5个预测结果,将这5个结果称作:元特征集4
将(1),(2),(3),(4),(5)分别去训练、预测基模型5,得到5个预测结果,将这5个结果称作:元特征集5
3.将5个元特征集进行拼接得到完整的元特征集,将完整元特征集作为第二层模型的训练集。
4.对于Test,在每次基模型训练好时预测,再将预测值做均值处理,得到新Test,作为第二层的Test。
更通俗的解释:
1.首先将所有数据集生成测试集和训练集(假如训练集为10000,测试集为2500行),那么上层会进行5折交叉检验,使用训练集中的8000条作为喂养集,剩余2000行作为验证集。
2.每次验证相当于使用了8000条数据训练出一个模型,使用模型对验证集进行验证得到2000条数据,并对测试集进行预测,得到2500条数据,这样经过5次交叉检验,可以得到5×2000条验证集的结果(相当于每条数据的预测结果),5×2500条测试集的预测结果。
3.接下来会将验证集的52000条预测结果拼接成10000行长的矩阵,标记为A1,而对于52500行的测试集的预测结果进行加权平均,得到一个2500一列的矩阵,标记为B1。
4.上面得到一个基模型在数据集上的预测结果A1、B1,这样当我们对3个基模型进行集成的话,相于得到了A1、A2、A3、B1、B2、B3六个矩阵。
5.之后我们会将A1、A2、A3并列在一起成10000行3列的矩阵作为training data,B1、B2、B3合并在一起成2500行3列的矩阵作为testing data,让下层学习器基于这样的数据进行再训练。
6.再训练是基于每个基础模型的预测结果作为特征(三个特征),次学习器会学习训练如果往这样的基学习的预测结果上赋予权重w,来使得最后的预测最为准确。
需要注意的是,在生成第二层特征的时候,各个基模型要采用 相同的K-fold,这样得到的元特征的每一折(对应于之前的K折划分)都将不会泄露进该折数据的目标值信息 ,从而尽可能的降低过拟合的风险。
6.Blending
Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,Blending用90%的数据做基学习器的训练,而10%留出集用作训练元学习器,这样基学习器和元学习是用不同数据集来训练的,把Stacking流程中的K-Fold CV 改成 HoldOut CV。
相比于Stacking,Blending能有效防止信息泄露,但也正因为如此,元学习器只用了较小部分的数据集进行训练,且容易对留出集过拟合。如果数据量有限,个人更偏好于Stacking。