KAGGLE ENSEMBLING GUIDE
聲明:文章來(lái)自網(wǎng)絡(luò),手動(dòng)翻譯筆記,僅做學(xué)習(xí)參考。文末附上原地址,轉(zhuǎn)載請(qǐng)注明出處和聲明。
模型整合式是用來(lái)提升多樣機(jī)器語(yǔ)言任務(wù)準(zhǔn)確率的一個(gè)非常強(qiáng)有力的技巧。在這里我將分享我在Kaggle競(jìng)賽上使用的整合方法。
第一個(gè)部分我們著眼于從提交文件中來(lái)整合。第二部分我們將看到通過(guò)已堆疊的一般/混合的來(lái)整合。
我會(huì)回答為什么整合可以減少大多數(shù)普遍的誤差。最終我將展示整合的不同算法,將它們聚合在一起的結(jié)果和你可以自己嘗試一下的代碼。
這揭示了你如何贏得機(jī)器語(yǔ)言比賽:“你將他人的工作成果聚合在一起?!?/em>Vitaly Kuznetsov NIPS2014
從提交文件中創(chuàng)造整合
大部分基礎(chǔ)以及方便的整合方法是去整合Kaggle的提交CSV文件。你只需要在使用這些算法在測(cè)試數(shù)據(jù)集上——不需要重新訓(xùn)練模型。這是一個(gè)整合已完成的現(xiàn)存模型預(yù)測(cè)的快速方法,是組隊(duì)時(shí)的理想情況。
投票整合.
我們首先看一個(gè)簡(jiǎn)單的多數(shù)投票整合。我們看看為何模型整合能減少錯(cuò)誤比率以及它比選擇低聯(lián)系度模型預(yù)測(cè)要好。
錯(cuò)誤修正編碼
在航空任務(wù)中,所有的型號(hào)被完全正確的傳輸是非常重要的。
如果我們有一個(gè)由二進(jìn)制構(gòu)成的字符信號(hào)像這樣:
1110110011101111011111011011
然而這個(gè)信號(hào)腐敗(一點(diǎn)點(diǎn)問(wèn)題)如下:
1010110011101111011111011011
也許這會(huì)出人命。
有一種編碼方法是去找到矯正錯(cuò)誤的編碼。這個(gè)最簡(jiǎn)單的正確編碼是一個(gè)重復(fù)的編碼:
使用同樣的尺寸大小重播那個(gè)信號(hào)許多次然后多數(shù)票決。
源信號(hào):
1110110011
編碼:
10,3 101011001111101100111110110011
解碼:
1010110011
1110110011
1110110011
多數(shù)票決:
1110110011
信號(hào)腐敗是一個(gè)非常少見(jiàn)的情況而且通常發(fā)生在小型爆炸里。因此當(dāng)它顯示一個(gè)腐敗的多數(shù)票決的時(shí)候甚至更為稀少。
只要信號(hào)腐敗不是完全不可預(yù)測(cè)的(有50%的幾率腐?。?,那么信號(hào)就能被重新修復(fù)。
一個(gè)機(jī)器學(xué)習(xí)的例子
假使我們有一組十個(gè)樣本的測(cè)試集。正確的分類(lèi)是均為正數(shù)('1'):
1111111111
此外,我們有三個(gè)達(dá)到了70%的準(zhǔn)確度的二進(jìn)制分類(lèi)器(A,B,C)。你現(xiàn)在可以看到這些分類(lèi)器隨機(jī)的產(chǎn)生70%比率的‘1’和30%比例的‘0’.
我們現(xiàn)在展示這些假設(shè)的分類(lèi)器怎么能通過(guò)一個(gè)投票整合,獲得78%的準(zhǔn)確率。
一部分算法
對(duì)于一個(gè)三個(gè)成員的多數(shù)票決,我們可以預(yù)測(cè)有四個(gè)結(jié)果:
- 這三個(gè)都正確
0.7×0.7×0.7
=0.3429
兩個(gè)正確
0.7×0.7×0.3
+0.7×0.3×0.7
+0.3×0.7×0.7
=0.4409
兩個(gè)錯(cuò)誤
0.3×0.3×0.7
+0.3×0.7×0.3
+0.7×0.3×0.3
=0.189
三個(gè)都錯(cuò)
0.3×0.3×0.3
=0.027
我們看到大部分的時(shí)候(大約44%)
多數(shù)票決糾正了一個(gè)錯(cuò)誤。這個(gè)多數(shù)票決,總體可以糾正平均大約78%(0.3429+0.4409=0.7838)
選民的數(shù)量
如同當(dāng)更多的代碼被重復(fù)的時(shí)候,重復(fù)代碼可以提升他們糾正錯(cuò)誤的性能一樣,所以在做整合的時(shí)候添加更多整合成員通??梢缘玫教岣摺?/p>

使用上述的算法:能夠得到70%正確率包含五個(gè)選舉整合的假設(shè)隨機(jī)分類(lèi)器,能夠提前到大部分時(shí)間大約83%。大約66%的多數(shù)票決,在最開(kāi)始得到一個(gè)或者兩個(gè)錯(cuò)誤(0.36015+0.3087)
相關(guān)性
但我第一次加入到針對(duì)KDD-cup 2014的隊(duì)伍中時(shí),Marios Michailidis (KazAnova)提議了某些獨(dú)特的事項(xiàng)。他為我們的任務(wù)計(jì)算了個(gè)人的相關(guān)性,而且聚合了一些在過(guò)去聯(lián)系不緊密的優(yōu)質(zhì)模型。
通過(guò)同這些不同任務(wù)文件,創(chuàng)造一個(gè)平均整合,給了我們最大50個(gè)安全點(diǎn)登上了排行榜。整合不相關(guān)的任務(wù)文件明顯的優(yōu)于那些相關(guān)文件。但是為什么會(huì)這樣?
來(lái)看看這個(gè),讓我們?cè)俅文贸鋈齻€(gè)簡(jiǎn)單的模型,實(shí)際情況依然是所有為'1':
1111111100 = 80% accuracy
1111111100 = 80% accuracy
1011111100 = 70% accuracy
這些模型在預(yù)測(cè)時(shí)有高度的相關(guān)性。當(dāng)我們采用多數(shù)票決時(shí)發(fā)現(xiàn)沒(méi)有提升:
1111111100 = 80% accuracy
現(xiàn)在我們比較三個(gè)較差的預(yù)測(cè),但是高度不相關(guān)的模型:
1111111100 = 80% accuracy
0111011101 = 70% accuracy
1000101111 = 60% accuracy
但我們整合這些,來(lái)使用多數(shù)票決的時(shí)候,我們得到:
1111111101 = 90% accuracy
這是一個(gè)提升:一個(gè)關(guān)聯(lián)性交差的綜合模型成員看起來(lái)能夠提升糾正錯(cuò)誤的性能
在Kaggle中使用:森林覆蓋率測(cè)類(lèi)型
多數(shù)票決在評(píng)審度量要求艱難的預(yù)測(cè)時(shí),有最大的意義,舉個(gè)例子多分類(lèi)分類(lèi)器的準(zhǔn)確度。
森林覆蓋類(lèi)型預(yù)測(cè)挑戰(zhàn),使用UCI森林覆蓋類(lèi)型數(shù)據(jù)集。這個(gè)數(shù)據(jù)集有54個(gè)屬性,以及6個(gè)分類(lèi)。
我們使用500個(gè)樹(shù)形隨機(jī)森林,創(chuàng)造了一個(gè)簡(jiǎn)單的開(kāi)始模型。接下來(lái)創(chuàng)造了一些更多的模型而且挑選了表現(xiàn)最佳的一個(gè)。在這個(gè)任務(wù)中,我們的模型選擇ExtraTreesClassifier表現(xiàn)最好。
加權(quán)
接下來(lái)我們使用了加權(quán)多數(shù)票決。為什么加權(quán)?通常我們想要在票選中給更好的模型,更多的權(quán)重。因此我們將最佳的模型,在票選中記數(shù)三次。其他的四個(gè)模型每次計(jì)數(shù)一票。
規(guī)則如下:次級(jí)的模型想要否決最好模型的唯一辦法是,他們?nèi)拷y(tǒng)一的支持另一個(gè)。
我們希望這個(gè)整合可以修復(fù)最佳模型選擇的幾個(gè)錯(cuò)誤,取得一些小小的進(jìn)步。這是我們對(duì)于放棄民主的懲罰,而創(chuàng)造了一個(gè)柏拉圖政權(quán)。
‘Every city encompasses two cities that are at war with each other.'——Plato in Republic
表格1.展示了訓(xùn)練五個(gè)模型的結(jié)果,以及結(jié)合了加權(quán)多數(shù)票決的結(jié)果。
| MODEL | PUBLIC ACCURACY SCORE |
|---|---|
| 梯度推進(jìn)機(jī)器 | 0.65057 |
| 隨機(jī)森林Gini | 0.75107 |
| 隨機(jī)森林熵 | 0.75222 |
| 臨時(shí)森林商 | 0.75524 |
| 臨時(shí)森林Gini(best) | 0.75571 |
| 選舉整合(民主) | 0.75337 |
| 選舉整合(3×Best vs Rest) | 0.75667 |
在Kaggle中使用:CIFAR-10 圖片中目標(biāo)檢測(cè)
CIFAR-10 是另一個(gè)精確度事件多重分類(lèi)的分類(lèi)器挑戰(zhàn)
我們的隊(duì)伍在這個(gè)挑戰(zhàn)中處于領(lǐng)先,Phil Culliton,第一個(gè)發(fā)現(xiàn)最好的步驟是從dr.Graham那里復(fù)制一個(gè)好的模型。
于是我們對(duì)30個(gè)卷積提交使用票選整合(所有的分?jǐn)?shù)都超過(guò)90%準(zhǔn)確度)。在整合體中單一模型最好的分?jǐn)?shù)為0.93170。
三四個(gè)模型的票選整合,分?jǐn)?shù)為0.94120。在錯(cuò)誤概率上下降了大概0.01,推動(dòng)最終的成績(jī)超過(guò)了個(gè)人預(yù)計(jì)分類(lèi)的準(zhǔn)確度。
代碼
在MLWave Github repo我們有一個(gè)票選手稿你可以使用。(這個(gè)地址已經(jīng)不能用了)
這是在Kaggle提交文件的目錄上運(yùn)行,而且創(chuàng)造一個(gè)新的提交文件。更新:Armando Segnini 增加了權(quán)重。
整合:訓(xùn)練10個(gè)神經(jīng)網(wǎng)絡(luò)并且取它們預(yù)測(cè)的平均值。這是取得讓結(jié)果的性能提升的一個(gè)簡(jiǎn)單公平的方法。
一個(gè)讓我疑惑地地方是為何平均可以有如此大幫助,然而對(duì)于平均的效用有一個(gè)簡(jiǎn)單的解釋。假設(shè)有兩個(gè)錯(cuò)誤率為70%的分類(lèi)器,當(dāng)他們同意自己是正確的。但當(dāng)他們不同意的時(shí)候,其中一個(gè)往往是正確的,此時(shí)平均的預(yù)測(cè)將會(huì)在正確的答案上放更多權(quán)重。
當(dāng)網(wǎng)絡(luò)正確的時(shí)候這個(gè)效用會(huì)很大而當(dāng)它錯(cuò)誤是會(huì)顯得信心不足(效用差)。Ilya Sutskever A brief overview of Deep Learning.
求均值
求均值在廣泛地問(wèn)題(分類(lèi)和回歸都是)和算法(AUC,均方誤差,或者對(duì)數(shù)損失)中表現(xiàn)良好。
對(duì)于于每個(gè)模型平均預(yù)測(cè),沒(méi)有什么比求平均更重要。在Kaggle上經(jīng)常聽(tīng)到的簡(jiǎn)短說(shuō)法是'bagging submissions'。

以上圖片來(lái)自Kaggle比賽:’Don't Overfit!'黑色線(xiàn)表現(xiàn)出比綠色顯更好的分界。預(yù)測(cè)線(xiàn)從噪聲數(shù)據(jù)點(diǎn)中學(xué)習(xí)。不要擔(dān)心,對(duì)數(shù)個(gè)不同的綠色線(xiàn)取平均將會(huì)使我們更靠近黑色線(xiàn)。
記得我們的目標(biāo)不是去熟記訓(xùn)練數(shù)據(jù)(有比內(nèi)部隨機(jī)森林更有效率的儲(chǔ)存數(shù)據(jù)的方法),而是在新的沒(méi)見(jiàn)過(guò)的數(shù)據(jù)上更好的推廣。
在Kaggle中使用:一袋子的文字遇見(jiàn)無(wú)數(shù)袋的爆米花
這是一個(gè),電影情緒分析比賽.在先前的公布中,我們使用在線(xiàn)情緒分析器,得到了95.2UAC。
如果數(shù)據(jù)是線(xiàn)性可分的,這個(gè)分析器是一個(gè)非常好的線(xiàn)性分類(lèi)器,他能保證找到一個(gè)分割線(xiàn)。這是一個(gè)很受歡迎的性能,但是你必須要意識(shí)到哦,分類(lèi)器一旦達(dá)到這個(gè)分割線(xiàn)了就會(huì)停止學(xué)習(xí)。他并不一定能夠在新數(shù)據(jù)上找到最好的分割。
如果我們使用隨機(jī)權(quán)重初始化五個(gè)分類(lèi)器,并且用平均來(lái)比較他們的預(yù)測(cè),將會(huì)是怎樣的情況?為什么我們能夠在測(cè)試集上得到提升。
| 模型 | 公眾AUC分?jǐn)?shù) |
|---|---|
| 感知器 | 0.95288 |
| 隨機(jī)感知器 | 0.95092 |
| 隨機(jī)感知器 | 0.95128 |
| 隨機(jī)感知器 | 0.95118 |
| 隨機(jī)感知器 | 0.95072 |
| 裝袋子的感知器 | 0.95427 |
以上的結(jié)果舉例說(shuō)明了整合能夠把,你從必須向良好數(shù)據(jù)學(xué)習(xí)以及機(jī)器算法的內(nèi)部細(xì)節(jié)中,解救出來(lái)。如果它效果好,當(dāng)然好,如果不好,也無(wú)傷大雅。

我們不會(huì)因?yàn)槠骄耸畟€(gè)表現(xiàn)良好的線(xiàn)性回歸受到懲罰。裝袋一個(gè)較差的線(xiàn)性交叉驗(yàn)證集,已經(jīng)過(guò)擬合的提交文件,甚至可以通過(guò)組合多樣內(nèi)容(那些關(guān)聯(lián)更少的)給你帶來(lái)更好的收益。
代碼
我們?cè)贕ithub上發(fā)布了一個(gè)簡(jiǎn)單的平均腳本代碼(鏈接已不可用),輸入為CSV文件而輸出為平均后的任務(wù)文件。更新:我們已經(jīng)加上了一個(gè)幾何平均腳本。幾何平均能夠勝過(guò)原始平均。
取隊(duì)列平均
當(dāng)我們對(duì)多重不同模型的輸出取平均的時(shí)候,有些問(wèn)題會(huì)突然出現(xiàn)。不是所有的預(yù)測(cè)都是完美的校準(zhǔn):
他們可能會(huì)在預(yù)測(cè)過(guò)高或者過(guò)低。或者是在某一個(gè)范圍之內(nèi)預(yù)測(cè)混亂。
在極端的情況下,你可能會(huì)有一個(gè)下面這樣的結(jié)果:
ID , 預(yù)測(cè)
1 , 0.35000056
2 , 0.35000002
3 , 0.35000098
4 , 0.35000111
在評(píng)審算法是排名或者基本闕值類(lèi)似于AUC的時(shí)候,這樣的預(yù)測(cè)也許能夠在排行榜上有一個(gè)好名次。但當(dāng)其他模型取平均如下所示:
ID , 預(yù)測(cè)
1 , 0.57
2 , 0.04
3 , 0.96
4 , 0.99
他不會(huì)對(duì)整體結(jié)果改變太多。
我們的算法是首先將預(yù)測(cè)改變到排行榜里,然后再平均這些排行。
ID , 排行, 預(yù)測(cè)
1, 1 , 0.35000056
2, 0 ,0.35000002
3, 2 ,0.35000098
4, 3 ,0.35000111
在正規(guī)化排行于0到1之間之后,你一定能夠在你的預(yù)測(cè)里得到一個(gè)平均分布。排行平均化的整體如下:
ID , 預(yù)測(cè)
1 , 0.33
2 , 0.00
3 , 0.66
4 , 1.00
歷史排行.
排名需要一個(gè)測(cè)試數(shù)據(jù)己,所以當(dāng)你測(cè)試一個(gè)單一數(shù)據(jù)的時(shí)候,怎么做?你可以把它和舊的測(cè)試數(shù)據(jù)排在一起,但是就會(huì)提升你算法的復(fù)雜性。
一個(gè)使用歷史排行的算法。在他們的排行上儲(chǔ)存舊數(shù)據(jù)的測(cè)試結(jié)果?,F(xiàn)在當(dāng)你新樣本的測(cè)試為'0.35000110'的時(shí)候,你會(huì)發(fā)現(xiàn)它會(huì)取代最靠近的一個(gè)測(cè)試排行(這個(gè)案例中'0.3500011'排行'3')。
Kaggle 使用案例:獲得重要客戶(hù)的挑戰(zhàn)
平均排行在排行、基本闕值算法(比如UC)、以及搜索引擎性能算法(在k上的平均精度)上,都表現(xiàn)的不錯(cuò)。
獲得重要客戶(hù)挑戰(zhàn)的目標(biāo)是對(duì)于可能成為回頭客的客戶(hù)進(jìn)行概率上的排行。
我們的團(tuán)隊(duì)首先使用 R GLMNet模型對(duì)多個(gè) Vowpal Wabbit 模型取平均。然后使用平均排行來(lái)提升完全一樣的整合。
| 模型 | 公共分?jǐn)?shù) | 私人分?jǐn)?shù) |
|---|---|---|
| Vowpal Wabbit A | 0.60764 | 0.59962 |
| Vowpal Wabbit B | 0.60737 | 0.59957 |
| Vowpal Wabbit C | 0.60757 | 0.59954 |
| GLMNet | 0.60433 | 0.59665 |
| Average Bag | 0.60795 | 0.60031 |
| Rank average Bag | 0.61027 | 0.60187 |
我記錄下了平均排行給我們帶來(lái)巨大提升的Avito挑戰(zhàn)
最終我們使用,對(duì)袋子中的感知器使用加權(quán)重平均排行將我們的模型性能從0.96328AUC提升到0.96461AUC。這個(gè)感知器來(lái)自前面章節(jié)(1X) 在fastML.com上一個(gè)新的bag-of-words tutorial(3X)。
代碼
一個(gè)簡(jiǎn)單的主力[平均排行腳本]已經(jīng)添加到了MLWave Github repo。(地址已失效)
*’競(jìng)賽是有實(shí)際作用的,因?yàn)闊o(wú)論多少數(shù)量的算法都能應(yīng)用于任何模型問(wèn)題,但是我們不知道,哪一個(gè)才是最具推動(dòng)力的。——
Anthony Goldbloom Data Prediction Competitions — Far More than Just a Bit of Fun

在Youtube上展示的'如何制造蘇格蘭混合威士忌'。
普通堆疊&混合
平均預(yù)測(cè)文件是一個(gè)效果好而且容易的方法,但是這不是頂級(jí)參賽者唯一的算法。這種謹(jǐn)慎的收屁,開(kāi)始于堆放和混合。抓緊你頭上的帽子和裙角:這有很多有七個(gè)頭的龍。站在另外30條龍的上面。
Netflix 網(wǎng)飛公司
網(wǎng)飛公司組織和推廣了第一個(gè)數(shù)據(jù)科學(xué)比賽。在電影推薦的挑戰(zhàn)比賽中,整合創(chuàng)造真的推動(dòng)了最新的成果,也許是因?yàn)檫^(guò)于復(fù)雜,網(wǎng)飛公司決定不在生產(chǎn)中使用獲勝的算法。那是一個(gè)簡(jiǎn)單而復(fù)雜的算法。
然而,許多的論述和新奇的算法,從這場(chǎng)比賽中產(chǎn)生:
- 堆放線(xiàn)性權(quán)重特征Feature-Weighted Linear Stacking
- 針對(duì)精確推薦系統(tǒng)的混合預(yù)測(cè) Combining Predictions for Accurate Recommender Systems
- 針對(duì)Netflix Prize的混合算法 The BigChaos Solution to the Netflix Prize
如果你想要提高你的Kaggle競(jìng)賽成績(jī),他們都是非常有趣容易而且相關(guān)的讀物。

'這是一個(gè)讓他印象深刻的比賽,十多年來(lái)的一個(gè)頂點(diǎn),混合了數(shù)百個(gè)預(yù)測(cè)模型,終于越過(guò)了終點(diǎn)線(xiàn)。我們離線(xiàn)評(píng)估了一些新模型,但是我們?cè)u(píng)判的額外的準(zhǔn)確性收益,看起來(lái)不能證明他們是在工程需要的合理成就?!W(wǎng)飛公司工程師
普通堆疊
普通堆疊是Wolpert在1992paper提出來(lái)的,早于Breiman的論文“Bagging Predictors“.
兩年。
基礎(chǔ)理念就是使用一堆基本分類(lèi)器來(lái)進(jìn)行普通堆疊,然后使用另外一個(gè)分類(lèi)區(qū)聯(lián)合他們,目的在于減少普通誤差(generalization error)。
讓我們來(lái)看一下你想要做到的兩折堆疊:
- 將訓(xùn)練集分為兩個(gè)部分:train_a 和 train_b
- 使用train_a訓(xùn)練第一個(gè)模型,然后在tain_b進(jìn)行預(yù)測(cè)
- 用train_b訓(xùn)練同一個(gè)模型,然后在train_a進(jìn)行預(yù)測(cè)
- 最終在所有的訓(xùn)練集上訓(xùn)練模型,然后在測(cè)試集進(jìn)行預(yù)測(cè)
- 在第一歩模型得到的概率上,進(jìn)行第二步訓(xùn)練堆疊模型
比起單獨(dú)訓(xùn)練,堆疊模型能在使用把第一部的預(yù)測(cè)當(dāng)作特征的問(wèn)題空間中得到更多的信息。
令人滿(mǎn)意的一點(diǎn)是0級(jí)別的廣泛化是所有的'類(lèi)型',并且不僅是簡(jiǎn)單的改變彼此(比如:我們希望表面-fitters,訓(xùn)練模型的建造者,統(tǒng)計(jì)學(xué)的外推器,等等)。在這個(gè)方法中,從分利用所有檢查學(xué)習(xí)集以及從中推進(jìn)它。這就是為什么級(jí)別0廣泛化應(yīng)該“空間接空間”這個(gè)說(shuō)法的含義。
[...]普通堆疊是一個(gè)集合一些generalizer,來(lái)創(chuàng)造一個(gè)新的generalizer來(lái)取得平均值,對(duì)每個(gè)初始的generalizer表達(dá)過(guò)的學(xué)習(xí)集的內(nèi)容,嘗試最佳整體。每個(gè)generalizer表達(dá)的越多(不是去重復(fù)復(fù)制其他的generalizer曾經(jīng)說(shuō)過(guò)的內(nèi)容),最終堆積generalization的結(jié)果越好?!猈olpert(1992)堆積-Generalization
混合
混合式一個(gè)由網(wǎng)飛獲勝者介紹的方法。它和普通堆疊很接近,但是它會(huì)更簡(jiǎn)單而且信息的泄露量更少。有一些研究者,使用“全部堆疊”和“混合”交換。
在混合中,并非使用從中取折(out-of-fold)預(yù)測(cè)用來(lái)做訓(xùn)練集,用訓(xùn)練集中的10%創(chuàng)造一個(gè)很小的holdout訓(xùn)練集合,只在這holdout集合上訓(xùn)練。
混合有幾個(gè)優(yōu)勢(shì):
- 它是簡(jiǎn)單的堆疊
- 它防止信息的泄露:廣泛普通的(generalizers)以及堆疊使用不同的數(shù)據(jù)。
- 你不需要同你的隊(duì)友分享分層的折的種子。任何人可以使用'blender'拋擲模型,并且混合者決定,他是否保持那個(gè)模型。
缺點(diǎn)是:
- 你在全體數(shù)據(jù)上使用的更少
- 最終的模型可能對(duì)于holdout集合過(guò)擬合
- 你的CV堆疊起來(lái)(多次折疊計(jì)算)比使用一個(gè),單一小的holdout集合更加堅(jiān)固
對(duì)于績(jī)效,兩種方法可能是相似的結(jié)果??雌饋?lái)更重要的是哪一種技術(shù)你更偏好。我個(gè)人更喜歡堆疊。
如果你無(wú)法作出決定,你可以?xún)蓚€(gè)都做。使用普通堆疊創(chuàng)造堆疊整體,然后從中取折(out-of-flod)預(yù)測(cè)。然后在第三歩使用holdout集合更進(jìn)一步的聯(lián)合這些模型。
使用邏輯回歸堆疊
使用邏輯回歸堆疊,是更進(jìn)一步的傳統(tǒng)、常規(guī)的堆疊做法。我找到了Emanuele Olivetti
的一個(gè)手稿script
幫助我去理解。
當(dāng)為測(cè)試集創(chuàng)造預(yù)測(cè)的時(shí)候,你可以一次性完成它,或者從中取折預(yù)測(cè)然后平均。通過(guò)平均是一個(gè)干凈而且精確的方法來(lái)實(shí)現(xiàn)預(yù)測(cè),我更喜歡一次性完成,那是模型和代碼復(fù)雜度降低一點(diǎn)。
Kaggle使用:“Papirusy z Edhellond”
我使用了由Emanuele在這類(lèi)比賽中完成的blend.py。用邏輯回歸堆疊了8個(gè)基本模型,給我第二名最好的成績(jī)0.99409精確度,對(duì)我來(lái)說(shuō)很棒。
Kaggle使用:Kdd-cup 2014
使用這個(gè)手稿我可以從 Yan Xu
的模型中提升一步。他的模型在堆疊前分?jǐn)?shù)大約是0.605AUC,堆疊之后提升到了大約0.625AUC。
非線(xiàn)性算法堆疊
常見(jiàn)的非線(xiàn)性算法堆疊,包括GBM, KNN, NN, RF 以及 ET。
原始特征的非線(xiàn)性堆疊,在多分類(lèi)問(wèn)題上,取得了令人意外的好成績(jī)。顯然,第一步預(yù)測(cè)非常有用,而且得到了最高特征的重要信息。非線(xiàn)性算法,找到了原始特征以及元模型(meta-model)特征之間有用的相互關(guān)系。
Kaggle使用:TUT Headpose Estimation 比賽
TUT Headpose Estimation
比賽可以看作為,多分類(lèi)下的多標(biāo)簽比賽。
每個(gè)標(biāo)簽單獨(dú)的被整合模型訓(xùn)練。
下面的表格展示,單獨(dú)模型訓(xùn)練的結(jié)果,以及使用極端隨機(jī)森林模型堆疊預(yù)測(cè)分類(lèi)可能性之后,提升過(guò)的分?jǐn)?shù)。
| 模型 | 公共MAE | 私人MAE |
|---|---|---|
| 統(tǒng)計(jì)500隨機(jī)森林 | 6.156 | 6.546 |
| 統(tǒng)計(jì)極端500隨機(jī)森林 | 6.317 | 6.666 |
| 5個(gè)鄰元素KNN-分類(lèi)器 | 6.828 | 7.460 |
| 邏輯回歸 | 6.694 | 6.949 |
| 使用極端隨機(jī)森林堆疊 | 4.772 | 4.718 |
可見(jiàn),使用標(biāo)準(zhǔn)模型進(jìn)行,普通堆點(diǎn)可以降低誤差,30%左右。
在這篇論文上可以了解更多: Computer Vision for Head Pose Estimation: Review of a Competition。
代碼
代碼已失效。你可以使用numpy水平堆疊來(lái)創(chuàng)造混合數(shù)據(jù)集。
線(xiàn)性堆疊特征權(quán)重
線(xiàn)性堆疊特征權(quán)重使用模型預(yù)測(cè)堆疊設(shè)計(jì)過(guò)后的元特征。希望使用原始模型來(lái)堆疊學(xué)習(xí)到的,是有必然結(jié)果的樣本的最佳預(yù)測(cè)者。線(xiàn)性算法是用來(lái)檢查,保持最終模型的速度以及簡(jiǎn)明。

Vowpal Wabbit 能夠在框架之外,執(zhí)行特征,權(quán)重線(xiàn)性堆疊的框架。前提是我們像這樣來(lái)訓(xùn)練集合:
1 |f f_1:0.55 f_2:0.78 f_3:7.9 |s RF:0.95 ET:0.97 GBM:0.92
我們?cè)?s- 特征空間以及 f- 特征空間之間,添加二次相互作用的特征 -q fs。在名為 f 空間中的特征能被設(shè)計(jì)像論文中的元特征,或者能成為原始特征。
二次線(xiàn)性堆疊模型
我自己為它取了一個(gè)名字。它與特征權(quán)重線(xiàn)性堆疊很相似,但是他創(chuàng)造了一個(gè)模型預(yù)測(cè)的聯(lián)合體。在眾多的實(shí)驗(yàn)中提升了成績(jī),最明顯的是在DrivenData上的Modeling Women’s Healthcare Decision competition。
使用如上相同的VW訓(xùn)練集
1 |f f_1:0.55 f_2:0.78 f_3:7.9 |s RF:0.95 ET:0.97 GBM:0.92
我們能夠在模型預(yù)測(cè)之間使用 -q ss 創(chuàng)造的相互作用算法特征訓(xùn)練 。
這能容易的聯(lián)合線(xiàn)性特征權(quán)重來(lái)堆疊:-q fs -q ss,可能兩個(gè)都提升。
如今有一種情況是許多基本模型都應(yīng)該被創(chuàng)造。你不知道這些先前的模型哪一個(gè),對(duì)最終的,算法模型有幫助。這個(gè)情況前兩個(gè)階段的模型,更偏好于高度相似弱基本模型。
因此為什么要對(duì)這些基本模型進(jìn)行大量調(diào)整呢?也許調(diào)整在這里只是獲得了模型的差異。但是在最后,你不知道哪一個(gè)模型是有幫助的。而最終的步驟像線(xiàn)性(它不需要微調(diào)或者一個(gè)單一的參數(shù)來(lái)提供稀疏性)。Mike Kim Tuning doesn’t matter. Why are you doing it?
使用回歸堆疊分類(lèi)器以及反向操作
堆疊可以使用分類(lèi)器進(jìn)行回歸問(wèn)題,反之亦然。舉一個(gè)例子,針對(duì)于字典分類(lèi)問(wèn)題的一個(gè)分?jǐn)?shù)位回歸基本模型。一個(gè)好的堆疊,應(yīng)該能夠從預(yù)測(cè)中拿到信息,盡管通?;貧w不是最好的分類(lèi)器。
在回歸問(wèn)題中,使用分類(lèi)器有一點(diǎn)機(jī)靈狡詐。你首先:轉(zhuǎn)換y_標(biāo)簽到均勻的分類(lèi)空間。一個(gè)回歸問(wèn)題需要你去預(yù)測(cè)報(bào)酬,以便能夠轉(zhuǎn)換成為多標(biāo)簽分類(lèi)問(wèn)題,就像如下:
- 所有低于2萬(wàn)的是類(lèi)別1
- 在2萬(wàn)到4萬(wàn)之間是類(lèi)別2
- 超過(guò)4萬(wàn)是類(lèi)別3
預(yù)測(cè)這些類(lèi)別的可能性能夠幫助堆疊回歸取得更好的預(yù)測(cè)值。
“我意識(shí)到你絕對(duì)不可能不使用out-of-fold預(yù)測(cè)到達(dá)任何地方。即使我去夏威夷,或者是洗澡間,都會(huì)帶著他們。不知道什么時(shí)候我需要訓(xùn)練,第二個(gè)或者第三個(gè)水平的元分類(lèi)器(mate-classifier)?!?a target="_blank" rel="nofollow">T. Sharf
堆疊非監(jiān)督學(xué)習(xí)到的特征
沒(méi)有任何理由,我們?nèi)ハ拗圃诙询B中監(jiān)督學(xué)習(xí)技能。你一樣能夠使用非監(jiān)督學(xué)習(xí)技能堆疊。
K-Means聚合在這里是一個(gè)流行的技巧,它在這里能發(fā)揮作用。Sofia-ML產(chǎn)生一個(gè)適用于此的快速的線(xiàn)性k-means算法。
另外兩個(gè)最近的新增方法是使用t-SNE:減少數(shù)據(jù)集到2或者3維然后使用非線(xiàn)性堆疊器堆疊。使用holdout集合來(lái) 堆疊/混合,在這里的感覺(jué)就像安全選擇。這里有一個(gè)Mike Kim,的解決方案,使用t-SNE向量,而且用XGBoot推動(dòng):‘0.41599 via t-SNE meta-bagging‘。

Piotr給我們了在Otto Product Classification Challenge
數(shù)據(jù)集上的t-SNE一個(gè)非常棒的形象化展示。
在線(xiàn)堆疊
我花費(fèi)很多時(shí)間實(shí)現(xiàn)了我曾經(jīng)的一個(gè)在線(xiàn)堆疊想法:首先從散列的字典代表中創(chuàng)建小型充分的隨機(jī)森林。當(dāng)森林做了正確的預(yù)測(cè)的時(shí)候減去或者添加收益。然后將最高收益以及最小收益的森林添加到代表特征(集)。
這能有作用,但只是在虛擬的數(shù)據(jù)上。一個(gè)實(shí)際的例子,一個(gè)在線(xiàn)隨機(jī)森林線(xiàn)性感知器堆疊之后能學(xué)習(xí)一個(gè)非線(xiàn)性XOR問(wèn)題。但是它無(wú)法在任何現(xiàn)實(shí)數(shù)據(jù)中學(xué)習(xí),相信我,我是嘗試過(guò)了。自此我對(duì)任何只在虛擬數(shù)據(jù)特征上面,展示他們新算法的論文,持有懷疑態(tài)度。
來(lái)自論文作者一個(gè)相似的辦法起了作用:random bit regression。這里有許多從特征創(chuàng)建的隨機(jī)線(xiàn)性函數(shù),其中最佳的是從嚴(yán)重的正則中找出來(lái)的。我能在某些數(shù)據(jù)集上復(fù)制使用。這將是未來(lái)的發(fā)展。
更多的在線(xiàn)堆疊具體案例是使用添加點(diǎn)擊預(yù)測(cè)。模型使用最近的數(shù)據(jù)預(yù)測(cè)比過(guò)去的好。因此當(dāng)一個(gè)數(shù)據(jù)集有一個(gè)暫存的效果,你能使用Vowpal Wabbit去在全部數(shù)據(jù)集訓(xùn)練,然后用更復(fù)雜和有力地工具諸如XGBoost,在最后一天(最近)的數(shù)據(jù)集上訓(xùn)練。接下來(lái)你將XGBoost預(yù)測(cè)值于樣本堆疊結(jié)合,讓Vowpal Wabbit做它最擅長(zhǎng)的部分:優(yōu)化損失函數(shù)。
現(xiàn)實(shí)世界很復(fù)雜,所以認(rèn)為整合不同的模型可以捕獲更多這樣的復(fù)雜性?!?br>
Ben Hamner ‘Machine learning best practices we’ve learned from hundreds of competitions’ (video)
每件事都是一個(gè)超參數(shù)
當(dāng)在進(jìn)行 堆疊、混合、制作元模型 的時(shí)候,對(duì)于堆疊模型,思考將所有的動(dòng)作視為超參數(shù)是一件非常有益的事情。
比如:
- 不要縮放數(shù)據(jù)比例
- 標(biāo)準(zhǔn)化數(shù)據(jù)比例
- 極小極大化數(shù)據(jù)比例
簡(jiǎn)單臨時(shí)的參數(shù)微調(diào)來(lái)提升整合模型的性能。同樣的,基本模型的使用數(shù)量能看作為一個(gè)優(yōu)化的參數(shù)。特征選擇(前70%)或者歸咎(丟失特征歸為0)是另個(gè)元參數(shù)的例子。
就如同隨機(jī)網(wǎng)格搜索是一個(gè)調(diào)整計(jì)算參數(shù)的好備選方案,所以調(diào)整這些元參數(shù)以使其有效果。
有時(shí)候允許XGBoost看到KNN分類(lèi)器看到的內(nèi)容,是很有用的?!?a target="_blank" rel="nofollow">Marios Michailidis
模型的選擇
你可以使用聯(lián)合多重整合模型來(lái)進(jìn)一步優(yōu)化分?jǐn)?shù)。
- 一個(gè)專(zhuān)門(mén)的方法:在手動(dòng)選擇的優(yōu)質(zhì)表現(xiàn)整合模型中使用平均、選舉或者平均排名
- 貪婪模型選擇(Caruana et al.)。開(kāi)始于三分之一或者更多基本模型。當(dāng)一個(gè)模型提升訓(xùn)練數(shù)據(jù)集分?jǐn)?shù)最高時(shí)添加進(jìn)去。由于允許加入和剔除模型,一個(gè)模型可能會(huì)被多次采用(權(quán)重)。
- 基因模型選擇使用基因算法和CV-分?jǐn)?shù)作為適當(dāng)?shù)暮瘮?shù)??梢栽?a target="_blank" rel="nofollow">inversion的算法 ‘Strategy for top 25 position‘中看到實(shí)例。
- 我使用的是有Caruana的算法計(jì)劃的一個(gè)充分隨機(jī)算法:從隨機(jī)選擇的整合中制作一個(gè)100或者相當(dāng)?shù)恼象w(不重復(fù))。然后選擇最高的得分模型。
自動(dòng)化
在Otto product classification比賽中我使用堆疊取得了一個(gè)前10的好成績(jī)。通過(guò)添加越來(lái)越多的基本模型以及裝袋多重堆疊整合體,我能夠一直提升我的分?jǐn)?shù)。
有一次我達(dá)到了由6個(gè)堆疊器堆疊出來(lái)的7個(gè)基本模型,出現(xiàn)了一種驚慌和陰郁的感覺(jué)。我真的能在復(fù)制出這些所有嗎?這些復(fù)雜并且笨重的模型,超出了我的快速、簡(jiǎn)單機(jī)器學(xué)習(xí)的舒適圈。
我利用剩下的競(jìng)賽來(lái)建立來(lái)一個(gè)自動(dòng)堆疊的方法。由于基本的模型,是由單純隨機(jī)訓(xùn)練后的參數(shù)組成的單純隨機(jī)算法。編寫(xiě)的封裝器制造分類(lèi)器如VW、Sofia-Ml、RGF、MLP和SBGoost,與Scikit-lean API配合很好。

第一個(gè)白板描述的一個(gè)由3個(gè)buckets平行放置組成的自動(dòng)堆疊。
堆疊時(shí)我使用SVM、隨機(jī)森林、極端隨機(jī)樹(shù)、GBM以及CGBoost。它們使用隨機(jī)參數(shù)和隨機(jī)基本模型子集。
當(dāng)在訓(xùn)練集預(yù)測(cè)的更低損失時(shí),最終創(chuàng)造的堆疊結(jié)果是平均的。
這個(gè)自動(dòng)堆疊能在比賽結(jié)束前一周能夠排名第57位。這對(duì)于我最終的整合大有益處。唯一的不同之處在于我沒(méi)有花費(fèi)時(shí)間訓(xùn)練或者選擇:我運(yùn)行之后就去睡覺(jué),然后醒來(lái)時(shí)得到一個(gè)好方案。

自動(dòng)堆疊能在一個(gè)超過(guò)3000參賽選手的競(jìng)賽中,不借助于任何微調(diào)或者手動(dòng)模型選擇,得到前10%的分?jǐn)?shù)。
自動(dòng)堆疊是我的一個(gè)大收獲。尤其后面在此基礎(chǔ)提高算法。自動(dòng)堆疊的最佳結(jié)果可以在TUT Headposs Estimation比賽中看到。這個(gè)黑盒子算法,擊敗現(xiàn)存的state-of-the-art為這個(gè)專(zhuān)屬問(wèn)題創(chuàng)造的針對(duì)目的算法的集合。

更值得注意的是:這是一個(gè)多重標(biāo)簽分類(lèi)問(wèn)題。預(yù)測(cè)結(jié)果同時(shí)需要'yaw'和'pithe'。由于'yaw'和'pitch'為首部的標(biāo)簽是相關(guān)的,堆疊一個(gè)預(yù)測(cè)為'yaw‘的模型會(huì)提升'pitch'預(yù)測(cè)的準(zhǔn)確度,反之亦然。這個(gè)結(jié)果很有意思。
用網(wǎng)絡(luò)直觀(guān)表示模型能使用向后傳播訓(xùn)練。這些堆疊模型學(xué)習(xí)哪個(gè)基本模型減少誤差最多。

挨在CV-分?jǐn)?shù),可以考慮到CV-分?jǐn)?shù)的標(biāo)準(zhǔn)偏差(小一點(diǎn)的選擇更安全)。能觀(guān)察優(yōu)化 復(fù)雜性/內(nèi)存 用法和運(yùn)行時(shí)間。最后一個(gè)可以看到添加相關(guān)的到混合體-讓代碼在制造整合體時(shí)更喜歡不相關(guān)的預(yù)測(cè)模型。
整個(gè)自動(dòng)堆疊管道可以平行和分散。這使得在一個(gè)筆記本電腦上,也能帶來(lái)速度的提升和更好的結(jié)果。
上文相關(guān)的強(qiáng)制優(yōu)化看起來(lái)似乎完全隨機(jī)的網(wǎng)格搜索是一個(gè)不錯(cuò)的選擇:我們希望我們的算法開(kāi)始于好的參數(shù)和模型,而且記住這些。然而隨機(jī)SVM這些選擇最后導(dǎo)致內(nèi)存不足。這些堆疊的附加問(wèn)題一會(huì)進(jìn)行詳細(xì)的細(xì)節(jié)討論。
于此同時(shí)你可以在MLWave Github 上得到一個(gè)內(nèi)部演示repo:'Hodor-autoML'。
第一和第二的德國(guó)獲勝者取得分類(lèi)挑戰(zhàn),使用了超過(guò)1000個(gè)不同模型的整合體。在這兩個(gè)地方可以了解更多:first place 和 second place。
為什么要?jiǎng)?chuàng)造這些自取滅亡整合體?
你可能希望明白為什么這些是無(wú)效的:堆疊和聯(lián)合1000多個(gè)模型,而且花費(fèi)無(wú)數(shù)的小時(shí),是挺瘋狂的對(duì)吧?嗯....對(duì)。等這些怪物一般的整合體仍有他們的用處:
- 你能夠贏得Kaggle比賽
- 你能夠使用一個(gè)單一的方法去擊敗大多數(shù)專(zhuān)業(yè)的state-of-the-art標(biāo)準(zhǔn)
- 你能使用一個(gè)簡(jiǎn)單的性能來(lái)比較你新提升之后的水準(zhǔn),更多友好的預(yù)測(cè)模型
- 總有一天,如今的電腦會(huì)被淘汰,而你已經(jīng)準(zhǔn)備好
- 有可能從這些整合體中獲得知識(shí)來(lái)使用到更簡(jiǎn)單的淺層次模型中去(DarkKnowledge——Hinton,Model Compression——Caruanan)
- 不是所有的基礎(chǔ)模型都需要按時(shí)完成。在這一點(diǎn)上,整合介紹一個(gè)優(yōu)雅降低的框架:扔掉一個(gè)模型,并不會(huì)妨礙創(chuàng)造好的預(yù)測(cè)。
- 大型自動(dòng)的整合體有效防止過(guò)擬合,而且增加了一個(gè)正則的框架,這不需要太多的調(diào)整和選擇。原則上堆疊,可以供外行人使用。
- 這是目前提升機(jī)器學(xué)習(xí)算法最好的算法之一,也許告訴了我們一些,有關(guān)于人類(lèi)整體學(xué)習(xí)效率的方面。
- 在準(zhǔn)確率上提升1%,有可能讓基金從虧損一點(diǎn),到虧損更少一點(diǎn)。嚴(yán)格的說(shuō):提升醫(yī)療保健算法有助于保衛(wèi)生命。
更新:非常感謝Dat Le在文檔編制以及重構(gòu)隨文章后附加的code方面的幫助。謝謝 Armando Segnini添加了,權(quán)重平均。感謝每個(gè)人的鼓勵(lì)。如果忘記了鏈接到你之前做的工作,我表示歉意。更多的內(nèi)容在
”More is always better – The power of Simple Ensembles“——Carter Sibley
“Tradeshift Benchmark Tutorial with two-stage SKLearn models” —— Dmitry Dryomov
“Stacking, Blending and Stacked Generalization” —— Eric Chio
Ensemble Learning: The wisdom of the crowds (of machines) ——Lior Rokach
“Deep Support Vector Machines” —— Marco Wiering
術(shù)語(yǔ):當(dāng)我說(shuō)整合體,我的意思是’聯(lián)合多個(gè)模型,平均模型'。想隨機(jī)森林使用在整合體中的技巧,這種算法就像是內(nèi)部袋裝。對(duì)于本文來(lái)說(shuō),我們注意力不在那。
文中的圖片來(lái)自于WikiMedia Commons 而且是公眾部分。非常感謝Jesse Merz。
引用
如果你從這個(gè)文章中使用重要的部分或者是算法,放到科學(xué)論文,報(bào)告或者書(shū)。請(qǐng)考慮如下內(nèi)容:
- Hendrik Jacob van Veen, Le Nguyen The Dat, Armando Segnini. 2015. Kaggle Ensembling Guide. [accessed 2018 Feb 6]. https://mlwave.com/kaggle-ensembling-guide/
或者你需要一個(gè)更權(quán)威的引用:
- Michailidis, Marios. (2017). Investigating machine learning methods in recommender systems (Thesis). University College London.
對(duì)于其他不太正式的材料,比如博客或教育幻燈片,一個(gè)簡(jiǎn)單的鏈接就足以滿(mǎn)足。
網(wǎng)站,地址將保持靜態(tài)
The resource URL will remain static and the page hosted on this site for the foreseeable future.
原地址 https://mlwave.com/kaggle-ensembling-guide/
聲明:此文稿由本人自己手動(dòng)翻譯,僅作自己筆記使用。請(qǐng)勿作為學(xué)習(xí)內(nèi)容。文末附有原論文地址,可以將本文作為參考。歡迎指正,如若轉(zhuǎn)載注明出處以及聲明。