1.引言
假设我们有好几个模型的结果,如何把他们全部利用起来呢?
最简单的方法就是大家一起投票,一人一票,票高者得胜。
但是这时候问题来了,在这些模型中,有的模型效果比较好,有的模型效果比较差,如果好模型数量相对差模型比较少,那么投票结果也就不那么合理了。
(就好比一个专家和一堆小学生去投票一个专业问答知识)
于是,有人提出了对模型结果的加权投票,但是这又面临了一个问题,那就是这个权重需要手动调整,有时人为的决定权重可能并不准确,
所以有人进一步提出了让模型学习这个加权过程。
2.Blending
blending的方法:
学习一个两步的模型,第一步的模型学习原始特征到真实类标的映射,第二步的模型学习多个模型预测结果到真实类标的映射。
blending的过程:
1,将原始训练集分割为验证集和训练集。
2,利用分割后的训练集训练(使用训练集类标,学习出原始特征->类标的模型),并对验证集预测(这里没有用到验证集类标)。
3,多个分类器都做步骤2,并将对验证集的预测结果拼接,形成下一步的特征。
4,利用3中拼接后的结果(即不同分类器验证集的结果),去训练预测验证集对应的类标(真实的验证集类标在这里用到,学习出多个模型预测结果->类标的模型)。
5,这样,我们就得到了两层模型,当我们需要进行预测时,首先将测试集经过2中的模型得到测试结果,再将多个测试结果拼接后送入4中的模型,从而得到最终结果。
3.Stacking
stacking的方法:
与blending类似,都是学习两个映射模型,不同的是,stacking利用了K折交叉验证,相对于blending使用了更多数据,但是也有一定的数据泄露。
stacking的过程:
1,将原始数据分为k份,使用k-1份训练,1份做验证,重复k次,将k次验证集的结果拼接(这里实际上是学了k个映射模型,我们把这个k个映射模型分别对各自验证集的预测结果拼接)
2,和blending类似,这里将不同模型的结果拼到一起,然后直接训练第二层的模型,可以看出,这里在训练第二层模型时,相比于blending使用了更多的数据。
3,当需要预测时,首先通过第一层的k个映射模型,然后对这k个映射模型的结果取平均作为下一层模型的输入,然后我们使用第二层的映射模型映射出最终的结果。
4.blending对比stacking(参考)
Blending的优点在于:
1.比stacking简单(因为不用进行k次的交叉验证来获得stacker feature)
2.避开了一个信息泄露问题:generlizers和stacker使用了不一样的数据集
3.在团队建模过程中,不需要给队友分享自己的随机种子
而缺点在于:
1.使用了很少的数据(是划分hold-out作为测试集,并非cv)
2.blender可能会过拟合(其实大概率是第一点导致的)
3.stacking使用多次的CV会比较稳健