因为在做比赛用到这方面的知识,应用是最大的动力,下面是自己的一点总结, 将从两方面展开:
(1)最懒的融合---直接对几个模型的结果(即提交文件)进行融合。有下面几种方法可以尝试:
· 投票法。例如得到了a、b、c、d、e五个模型对一个样本的分类结果,那么可以采取投票法,如果超过半数的模型的结果是正例,则我们得出结论该样本是正例。提高分类准确率方面,少数服从多数有很重要的作用。
为什么投票法可以减少错误的概率?
假设每个模型的结果发生错误的概率都是0.4,则三个(刚超过半数的模型个数)发生错误的概率为0.4^3*0.6^2*10=0.23,比单个模型的错误率要低。
· 加权投票,模型预测结果表现越好,其权重越高,话语权最高。例如a模型的表现最好,权重设置为3,其他模型为1。那么什么情况下,权重低的模型能说了算呢?就是当它们的投票加权值超过a模型时,这里即全体弱模型的结果均一致且和a模型的结果相反时。
· 平均法。例如可以对a、b、c、d、e对每个样本的预测为正例的概率进行平均作为最终的该样本为正例的概率。
这里可以用皮尔逊相关系数来计算模型之间的相关系数。尽量选择相关系数较低的模型。
· 排名平均法。(需要进一步了解)
· 交集法。求几个模型预测结果中正例的交集,然后再从每个模型预测结果中的非交集部分根据正例概率排名选择剩余样本。姑且称之为交集法。
(2)勤劳的融合--- blending/stacking
· Stacking:使用大量基分类器,然后使用另一种分类器来融合它们的预测,旨在降低泛化误差。假设用到三个模型,分别为model1,model2,model3.
a.首先将数据分为训练集和测试集。
b.对每个模型:
将训练集分成五折,以下过程不重复地走5遍:【用其中4折训练该model,其中1折用于预测。】分别得到该model在5个预测集上的预测结果,合并为一份,即每个模型得到的new feature数据集。(因为5个预测集不相交,所以new feature中包含了所有的training data中的样本)。
在测试集上,以下过程走5遍:【用训练集其中的4折训练中得到的model对testdata进行预测,得到测试集上的预测结果predict】,求平均。
c, 把三个模型生成的new feature进行列合并作为第二层的训练集。
d, 把三个模型生成的predict进行列合并,作为第二层的测试集。
e, 用第二层的模型进行训练和预测。
示意图如下:
更多内容借鉴:https://blog.csdn.net/qq_39422642/article/details/78566763
· Blending:
对训练集的处理:和stacking中用训练集五折中的一折作为预测集相比,Blending拿出训练集的一部分作为holdout集,第二阶段的model4就基于第一阶段模型对留出集的预测值进行拟合。
代码案例借鉴:https://github.com/emanuele/kaggle_pbr/blob/master/blend.py