Ensemble method of machine learning 机器学习中的组合方法

时间:2022-09-09 00:12:51

最近做了不少的kaggle机器学习竞赛,总结出了一个经验:做好了feature enginering可以进到前百分之20,如果要进到前百分之10,那么就需要Ensemble method的支持了,所以最近专门深入了解了以下组合的各种方法。通过学习发现组合方法真的是屡试不爽,在竞赛的后期,黔驴技穷,走投无路之时,不妨试试组合方法,会让人豁然开朗,

组合历史提交答案

这是最简单的一种组合方法,只需要把以前提交的答案组合起来再提交一遍就能得到效果,在比赛后期与他人组队的时候,这招也尤为有效,可以直接将自己的结果与他人ensemble,只要保证足够的多样性,可以得到明显的效果。

Voting ensembles

投票组合,故名思议,就是在分类任务中让多个结果来投票,得票数多的类别就是最终答案。

Error correcting codes

投票的方法常见于通信系统中的错误编码纠正,例如有以下编码:
1110110011101111011111011011
但是由于某种原因变为了:
1010110011101111011111011011
在编码纠正中的常见技术是传递冗余编码,假设对于以上编码,同一码字传送3遍,最终可以通过投票来纠正偶尔错误的编码:
Original signal:
1110110011

Encoded:
10,3 101011001111101100111110110011

Decoding:
1010110011
1110110011
1110110011

Majority vote:
1110110011

投票组合例子

假设有以下正确结果:
1111111111
我训练了3个分类器,每个分类器可以达到70%的正确率,最后从概率上来计算一下投票组合方法能达到多大的正确率:
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
最后组合方法可以达到~78% (0.3429 + 0.4409 = 0.7838)的正确率。

投票者的数量

接下来咱们看看投票者的数量对最终结果的影响: Ensemble method of machine learning 机器学习中的组合方法
学过通信的都知道,当信噪比比较低的时候,编码的误码率就越高,但是可以通过传送冗余的编码,最后投票来纠正一些编码的错误,上图展示了不同次数的冗余编码对最终误码率的影响,可以看到当信噪比(SNR)比较低的时候,随着重复次数的增多,组合个数的增加,编码错误是降低的。

模型相关性

在对提交结果做组合的时候,多个结果之间相关性较低会给组合带来较大的增益,why? 例如有以下三次提交结果:
1111111100 = 80% accuracy
1111111100 = 80% accuracy
1011111100 = 70% accuracy.
投票结果:
1111111100 = 80% accuracy
因为最终结果的高相关性,所以组合出来的效果并不理想。

例如有以下另外三个model的结果:
1111111100 = 80% accuracy
0111011101 = 70% accuracy
1000101111 = 60% accuracy
最终投票结果:
1111111101 = 90% accuracy
所以提交结果之间的高多样性,低相关性会增加ensemble的效果。

Weighing

为什么要再ensemble的时候引入权重,其实就是为了让牛逼的model又更高的话语权,在voting ensemble中,默认的是大家有一样的投票权,weighing就是为了打破这种平衡,对表现好的结果寄予较高的权重。或者也可以认为是为了让一些比较差的model来修复较好model的一些错误。

Averaging

以上讲述的方法主要应用于分类问题,对于回归问题,可以用平均的方法来达到ensemble的目的。通过对结果们的平均,还能从一定程度上防止overfitting,从下图可以得到一些启发,绿色的线代表着我们提交的某一次结果,当咱们把多个结果平均后,会得到一条更接近于黑色的线,这条线可以很好的分开红蓝两种类别。 Ensemble method of machine learning 机器学习中的组合方法

Rank averaging

在ranking这类问题中,如果我们直接去平均结果,往往会出现一些问题,例如分类器对于ranking有以下输出:
Id,Prediction
1,0.35000056
2,0.35000002
3,0.35000098
4,0.35000111
如果以上的结果和另一个分类器的结果来ensemble,结果并没有改变。
Id,Prediction
1,0.57
2,0.04
3,0.96
4,0.99
所以面对ranking这类问题,我们可以对结果做一些calibration,例如初始结果如下:
Id,Rank,Prediction
1,1,0.35000056
2,0,0.35000002
3,2,0.35000098
4,3,0.35000111
我们可以normalizing下结果,这样就能比较好的去组合其他的结果了。

Id,Prediction
1,0.33
2,0.0
3,0.66
4,1.0

Stacked Generalization & Blending

stacking

体验了以上简单的组合方法所带来的好处,咱们再来看看一些稍微复杂的组合方法:Stacke系列,其原理主要是将一些分类或者回归器作用于其他一系列分类器或者回归器的输出,以此来减少generalization error。例如我要做2-fold stacking,步骤如下:
  1. 将training data分为两部分,train_a, train_b
  2. 将模型于train_a数据集上训练,得到train_b的prediction
  3. 将模型于train_b数据集上训练,得到train_a的prediction
  4. 最后将模型于所有train数据集上训练,对test数据集做prediction
  5. 最后将所有train 1阶模型的输出作为训练数据,而对所有test 1阶模型的输出作为测试数据,重新的train一个新的2阶段模型,继续在原有的输出基础之上做预测
例如咱们准备用random forest来ensemble我们的6个feature+model的预测结果输出:首先通过将基础的RF,RR,Xgb模型用于各种feature来获取期望的diversity增益,然后将训练好的model分别用于训练和测试数据,分别得到6列预测因子,把这些因子当做新的训练和测试数据feed进新的Random forest(也可以是其他算法)进行训练,找出最佳模型,最后用最佳model在新的factor基础上做出最终预测。
Ensemble method of machine learning 机器学习中的组合方法

Blending

Blending这个概念最早出自大名鼎鼎的Netflex竞赛,它和Stacking很像,但是有一点不同的是:始终从训练数据及中留出一小部分数据作为测试数据。有效的防止了数据的泄露。

Stacking with non-linear algorithms

stacking可以使用一些咱们平常看起来比较复杂的算法,例如:ET,RF,Xgb,GBM,KNN,NN,这些非线性的组合算法通常可以带来结果上的提高。



reference: http://mlwave.com/kaggle-ensembling-guide/