机器学习 - Ensemble Model

这里有 M1到 Mn 的n个单模,给出这n个模型预测结果分别为 pred1~ predn。我们把所有模型结果结合起来,形成单一的模型。

现在的问题是,如何组合这些单模预测结果,来提升最终集成模型的准确性、减少泛化误差。这就是Ensemble的艺术。

在现实的生产环境的数据集上训练模型,可能是一个非常具有挑战性的问题,因为可能包含许多潜在分布

某些模型可以很好地模拟这些数据的一个方面,而其他模型则可以很好地模拟另一个方面。集成算法提供了一个解决方案,我们可以训练这些模型,并作出合成预测,其中最终的准确度比每个单独的模型好(三个臭皮匠顶个诸葛亮😂)。

实例

这里我们先使用泰坦尼克号幸存的例子。

假设有3个模型,m1、m2、m3,比如m1是逻辑回归,m2是KNN,m3是SVM。我们得到了3个模型的结果,不同模型的预测结果都不太一样。

要怎么去更科学地“合成”1个结果呢?下面介绍几种不同的集成方法:

Max Voting

最简单的方法:从每个模型中获取最终结果,然后获得每个模型的最大投票权。

比如下面的3个模型,有2个模型预测结果为1,那final pred就是1(哪个结果的得票最高,就选择哪个结果,少数服从多数

<img src="https://p.pstatp.com/origin/pgc-image/ac49caca08904a6496f45aaa5329d8b4" style="zoom:67%;" />

那为什么要这么做呢?这样难道就比单模的结果更靠谱吗?

更直观的数学说明

假设有3个二进制分类器(a,b,c) ,准确率为70% 。现在将这些分类器视为伪随机数生成器,它输出“1”的概率为70% 和输出“0”的概率为30%。

对于3个分类器的多数投票,我们可以预期4个结果:

所有可能的预测情况:

All three are correct
  0.7 * 0.7 * 0.7
= 0.3429

Two are correct
  0.7 * 0.7 * 0.3
+ 0.7 * 0.3 * 0.7
+ 0.3 * 0.7 * 0.7
= 0.4409

Two are wrong
  0.3 * 0.3 * 0.7
+ 0.3 * 0.7 * 0.3
+ 0.7 * 0.3 * 0.3
= 0.189

All three are wrong
  0.3 * 0.3 * 0.3
= 0.027
  • 大多数情况下,(约44%)多数投票者纠正了一个错误;
  • 这个多数票集合的正确率平均为78% (0.3429 + 0.4409 = 0.7838);

基本模型有70% 的准确度,但集成模型有78% 的准确度!

另外,增加更多的分类器,集成效果通常也会提高。投票集成可降低错误率,并且提升低相关模型的预测,适合于多分类任务

相关性

三个高度相关的模型在没有改进的情况下产生了一个整体:

1111111100 = 80% accuracy
1111111100 = 80% accuracy
1011111100 = 70% accuracy

The majority vote ensemble produces:
1111111100 = 80% accuracy

现在再来看看,有3个表现较差,但高度不相关的模型:

1111111100 = 80% accuracy
0111011101 = 70% accuracy
1000101111 = 60% accuracy

The majority vote ensemble produces:
1111111101 = 90% accuracy

如果集合模型之间较低的相关性,似乎可以提升纠错能力。

Averaging

平均法适用范围就更广了,分类、回归任务都可以使用,在不同的度量下也适用(AUC、平方误差或对数损失)。

平均预测通常可以减少overfit。理想情况下,希望类之间平滑地分割,而单个模型的预测可能有点粗糙了。

上图中,绿线从噪声数据中学习,而黑线有更好的分割效果。平均多条不同的绿线会更接近黑线。

构建机器学习模型的目标不是去理解训练数据,而是很好地概括新的数据,也就是模型要在测试集有较好的泛化能力。

同样有3个模型,最终预测的结果取均值(很好理解,不多讲了)

Weighted Averaging

有平均法,自然而然就会有加权平均。如果一个模型表现好,就给更高的权重,相反,则权重更低。

还是有3个模型,根据模型在验证集上的R方大小排序,权重等于排序大小。

M2的效果最差,权重等于1;M1、M3效果最好,权重都等于2。

模型结果进行加权平均:

Rank averaging

上面的方法是加权平均,会发现给模型的权重是人为根据验证集上的评估指标的排序给的(比如M1、M3都给了权重2)。

现在介绍的方法,是对加权平均的一点改动。

  1. 根据不同模型在验证集上的表现进行排序;

  1. 根据排序,计算权重(R-square / Rank),这里相当于做了标准化处理

  1. 模型结果加权求和;


参考链接

  1. https://medium.com/weightsand...
  2. https://mlwave.com/kaggle-ens...

欢迎关注个人公众号:DS数说

03-05 23:39