模型融合

作者: ZAK_ML | 来源:发表于2019-07-04 14:37 被阅读0次

    1.Voting

            投票法针对分类模型,多个模型的分类结果进行投票,少数服从多数。除了公平投票外,还可以给投票设置权重,分类器效果越好权重越高,分类器效果越差,权重越低。

    2.Averaging

    回归问题:直接取平均值作为最终的预测值,也可以使用加权平均。

    分类问题:直接将模型的预测概率做平均,也可以使用加权平均。

    可以把所有模型预测的结果作为新的特征,再通过线性回归计算出权重

    3.Ranking

    Ranking融合适合排序评估指标,对auc比较有效。具体公式如下:

            其中,n表示模型个数,表示该样本在第i个模型的权重,所有权重相同表示平均融合,表示该样本在第i个模型中的升序排名。

    4.Bagging

            采用有放回的方式抽取训练子集来训练每个基模型,最后所有基模型进行融合,分类问题进行投票,回归问题进行平均。除了构建不同的训练子集,也可以构建不同的特征和参数保证基模型的差异性,最后再进行融合。参考随机森林。

    5.Boosting

            Boosting算法是一种迭代算法。每轮迭代中会在训练集上产生一个新的分类器,然后使用该分类器对所有样本进行分类,以评估每个样本的重要性。具体来说,算法会为每个训练样本赋予一个权值。每次用训练完的新分类器标注各个样本,若某个样本点已被分类正确,则将其权值降低,并以该权重进行下一次数据的抽样(抽中的概率减小);若样本点未被正确分类,则提高其权值,并以该权重进行下一次数据的抽样(抽中的概率增大)。权值越高的样本在下一次训练中所占的比重越大,也就是说越难区分的样本在训练过程中会变得越来越重要。 整个迭代过程直到错误率足够小或达到一定次数才停止。 参考adaboost,gbdt,xgboost。

          (1)Bagging + 决策树 = 随机森林

          (2)AdaBoost + 决策树 = 提升树

          (3)Gradient Boosting + 决策树 = GBDT

    Bagging和Boosting算法的区别: 

          (1)bagging的训练集是随机的,各训练集是独立的;而boosting训练集的选择不是独立的,每一次选择的训练集都依赖于上一次学习的结果。

       (2)bagging的每个预测函数都没有权重;而boosting根据每一次训练的训练误差得到该次预测函数的权重。

          (3)bagging的各个预测函数可以并行生成;而boosting只能顺序生成。

    bagging、boosting的对比: Bagging主要在优化variance(即模型的鲁棒性),boosting主要在优化bias(即模型的精确性)

    bagging: Bagging 是 Bootstrap Aggregating 的简称,意思就是再取样 (Bootstrap) 然后在每个样本上训练出来的模型取平均,所以是降低模型的 variance。

    由于,所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。另一方面,若各子模型独立,则有,此时可以显著降低variance。

    Boosting: boosting从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数(指数函数),boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。

    具体关于优化角度的认识查看:为什么说bagging是减少variance,而boosting是减少bias? - 知乎

    如何理解bagging是减少variance,而boosting是减少bias?

    6.Stacking

    本文以Kaggle的Titanic(泰坦尼克预测)入门比赛来讲解stacking的应用(两层!)。

    数据的行数:train.csv有890行,也就是890个人,test.csv有418行(418个人)。

    而数据的列数就看你保留了多少个feature了,因人而异。我自己的train保留了 7+1(1是预测列)。

    在网上为数不多的stacking内容里,相信你早看过了这张图:

    这张图,如果你能一下子就能看懂,那就OK。

    如果一下子看不懂,就麻烦了,在接下来的一段时间内,你就会卧槽卧槽地持续懵逼......

    因为这张图极具‘误导性’。(注意!我没说这图是错的,尽管它就是错的!!!但是在网上为数不多教学里有张无码图就不错啦,感恩吧,我这个小弱鸡)。

    我把图改了一下:

    对于每一轮的 5-fold,Model 1都要做满5次的训练和预测。

    Titanic 栗子:

    Train Data有890行。(请对应图中的上层部分)

    每1次的fold,都会生成 713行 小train, 178行 小test。我们用Model 1来训练 713行的小train,然后预测 178行 小test。预测的结果是长度为 178 的预测值。

    这样的动作走5次! 长度为178 的预测值 X 5 = 890 预测值,刚好和Train data长度吻合。这个890预测值是Model 1产生的,我们先存着,因为,一会让它将是第二层模型的训练来源。

    重点:这一步产生的预测值我们可以转成 890 X 1 (890 行,1列),记作 P1 (大写P)

    接着说 Test Data 有 418 行。(请对应图中的下层部分,对对对,绿绿的那些框框)

    每1次的fold,713行 小train训练出来的Model 1要去预测我们全部的Test Data(全部!因为Test Data没有加入5-fold,所以每次都是全部!)。此时,Model 1的预测结果是长度为418的预测值。

    这样的动作走5次!我们可以得到一个 5 X 418 的预测值矩阵。然后我们根据行来就平均值,最后得到一个 1 X 418 的平均预测值。

    重点:这一步产生的预测值我们可以转成 418 X 1 (418行,1列),记作 p1 (小写p)

    走到这里,你的第一层的Model 1完成了它的使命。

    第一层还会有其他Model的,比如Model 2,同样的走一遍, 我们有可以得到 890 X 1 (P2) 和 418 X 1 (p2) 列预测值。

    这样吧,假设你第一层有3个模型,这样你就会得到:

    来自5-fold的预测值矩阵 890 X 3,(P1,P2, P3) 和 来自Test Data预测值矩阵 418 X 3, (p1, p2, p3)。

    -----------------------------------------

    到第二层了..................

    来自5-fold的预测值矩阵 890 X 3 作为你的Train Data,训练第二层的模型

    来自Test Data预测值矩阵 418 X 3 就是你的Test Data,用训练好的模型来预测他们吧。

    ---------------------------------------

    最后 ,放出一张Python的Code,在网上为数不多的stacking内容里, 这个几行的code你也早就看过了吧,我之前一直卡在这里,现在加上一点点注解,希望对你有帮助:

    Blending方法: Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如说10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。

    相关文章

      网友评论

        本文标题:模型融合

        本文链接:https://www.haomeiwen.com/subject/yqtrhctx.html