模型融合-Kaggle Ensembling Guide

本文主要是参考 Kaggle Ensembling Guide 所写的读后感,原文网址详见:https://mlwave.com/kaggle-ensembling-guide/


首先,我们讲到的模型融合的方式主要有三种:

  1. bagging (随机森林模型是基于bagging融合的代表)
  2. boosting (GBDT和XGboost模型是基于boosting融合的代表)
  3. stacking

此三种方法主要是从模型的角度讲解如何进行集成学习(ensembling learning),但是我们参加kaggle、天池类的比赛,常说的模型融合方法不是指这些,主要指的是一些将不同结果融合以提高分数的技巧。

下面我对常用的模型融合技巧进行介绍

voting(投票法)

  • 此方法比较简单,就是我们常见的投票机制,少数服从多数,针对分类模型使用。
  • 下面这个例子简单明了的说明了,为什么不相关的分类器投票融合效果会增加。假设我们有单个正确率为70%的三个互不相关的分类器。然后我们进行投票:

    全部正确: 0.7 * 0.7 * 0.7 = 0.3429
    两个正确: 0.7 * 0.7 * 0.3 + 0.7 * 0.3 * 0.7 + 0.3 * 0.7 * 0.7 = 0.4409
    一个正确: 0.3 * 0.3 * 0.7 + 0.3 * 0.7 * 0.3 + 0.7 * 0.3 * 0.3 = 0.189
    全部争取: 0.3 * 0.3 * 0.3 = 0.027
    可以发现我们投票后产生的正确率大约为78%(0.3429 + 0.4409 = 0.7838)

  • 从上面的例子也可以看出用来投票的基分类器基本是越多越好的。
  • 同时基分类器越不相关融合效果越好,这也是比较容易理解,大家彼此都一样了,融合当然不会有效果了。
  • 除了公平的进行投票外,我们也可以设置投票的权重,越好的分类器权重越高。形象的理解就是说一些相对弱的分类器只有联合的足够多才能够打败一个好的分类器从而影响最后结果。

Averaging (平均法)

  • 此方法显然是针对回归问题设计的。就是对多个结果求平均值。
  • 平均法存在问题就是如果不同回归方法的预测结果波动幅度相差比较大,那么波动小的回归结果在融合时候起的作用就比较小。因此我们可以进行 Rank Averaging 将回归的值进行排序,然后利用均匀分布进行打分。
    小例子如下:
    Id,Prediction
    1,0.35000056
    2,0.35000002
    3,0.35000098
    4,0.35000111

    先将结果排序:
    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

Stacked Generalization & Blending

  • 如上图所示,简单来讲此方法就是我们将不同基模型预测的结果作为参数再训练一个 stacker 模型作为它们的融合。
  • 下面我们介绍 Stacked Generalization 的基本流程。假设我们作一个 2-fold stacking
    1. 将测试集分为两部分:train_a和train_b
    2. 将基模型在训练集train_a上训练并在训练集train_b上预测
    3. 同样将基模型在训练集train_b上训练并在训练集train_a上预测
    4. 将基模型在所有训练集上训练在测试集上预测
    5. 利用第一阶段在训练集train_a和train_b的预测训练我们的stacker模型。
  • 我们对测试集进行基模型预测产生特征时,既可以像上述一样让基模型在所有训练集上训练一遍,然后对测试集进行一次预测,也可以利用基模型在 k-fold 产生的模型对测试集进行预测然后取平均。
  • Blending 方法跟 Stacked Generalization 类似,只不过它不再进行 k-fold 多次训练,而是将数据集分为两部分一部分进行基模型训练,另一部分进行 stacker 模型训练。
  • 在此基础上有一篇文章 Feature weighted linear stacking 想法很好,在此文中,基模型在 stacking 的时候不再使用同一的系数,而是根据数据元特征(最初的特征)来设计基模型的系数。想想是很合理的,直观上讲,不同模型对不同样本的预测能力是不一样的,我们应该根据原样本特征自适应的选择基模型当然是最好不过了。文章详见:https://arxiv.org/pdf/0911.0460.pdf

最后

我只是比较简短的介绍了 Kaggle Ensembling Guide 这篇文章的主要内容,里面还有许多细节没有介绍,像一些利用融合方法提高 kaggle 成绩代码的实例、还有一些脚本代码、还有作者讲的无监督的 stacking 和在线的 stacking 以及作者如何设计自动的 stacking 从而节省大量时间,推荐大家有时间可以读一下原文。

你可能感兴趣的:(机器学习)