Ensemble learning 中文名叫做集成學習,它並不是一個單獨的機器學習算法,而是將很多的機器學習算法結合在一起,我們把組成集成學習的算法叫做“個體學習器”。在集成學習器當中,個體學習器都相同,那么這些個體學習器可以叫做“基學習器”。
個體學習器組合在一起形成的集成學習,常常能夠使得泛化性能提高,這對於“弱學習器”的提高尤為明顯。弱學習器指的是比隨機猜想要好一些的學習器。
在進行集成學習的時候,我們希望我們的基學習器應該是好而不同,這個思想在后面經常體現。 “好”就是說,你的基學習器不能太差,“不同”就是各個學習器盡量有差異。
集成學習有兩個分類,一個是個體學習器存在強依賴關系、必須串行生成的序列化方法,以Boosting為代表。另外一種是個體學習器不存在強依賴關系、可同時生成的並行化方法,以Bagging和隨機森林(Random Forest)為代表。
Stacking 的基本思想
將個體學習器結合在一起的時候使用的方法叫做結合策略。對於分類問題,我們可以使用投票法來選擇輸出最多的類。對於回歸問題,我們可以將分類器輸出的結果求平均值。
上面說的投票法和平均法都是很有效的結合策略,還有一種結合策略是使用另外一個機器學習算法來將個體機器學習器的結果結合在一起,這個方法就是Stacking。
在stacking方法中,我們把個體學習器叫做初級學習器,用於結合的學習器叫做次級學習器或元學習器(meta-learner),次級學習器用於訓練的數據叫做次級訓練集。次級訓練集是在訓練集上用初級學習器得到的。

過程1-3 是訓練出來個體學習器,也就是初級學習器。
過程5-9是 使用訓練出來的個體學習器來得預測的結果,這個預測的結果當做次級學習器的訓練集。
過程11 是用初級學習器預測的結果訓練出次級學習器,得到我們最后訓練的模型。
如果想要預測一個數據的輸出,只需要把這條數據用初級學習器預測,然后將預測后的結果用次級學習器預測便可。
訪問AI圖譜 技術分享社區
https://loveai.tech
Stacking的實現
最先想到的方法是這樣的,
1:用數據集D來訓練h1,h2,h3...,
2:用這些訓練出來的初級學習器在數據集D上面進行預測得到次級訓練集。
3:用次級訓練集來訓練次級學習器。
但是這樣的實現是有很大的缺陷的。在原始數據集D上面訓練的模型,然后用這些模型再D上面再進行預測得到的次級訓練集肯定是非常好的。會出現過擬合的現象。
Stacking是模型融合的一個重要的方法,幾乎每個數據科學競賽的前幾名都會使用,接下來我主要是介紹stacking的原理。
相信大家看很多stacking的資料都會看到下面的這個圖:

這個圖很形象,他具體是這樣做的, 首先我們將訓練集使用kfold切分為k分,每一分包括一個驗證集和測試集,每次取其中k-1分訓練,另外的1分用來驗證,stacking是這樣做的,比如對於集成的第一個模型,clf1,我們使用kfold交叉驗證,那么可以得到k個clf1模型,模型的類型是一樣的,但是模型里面學到的參數不一樣,因為他們的訓練集是不一樣的,對與每一折的訓練,我們還有一個驗證集啊,那么我們用訓練得到的模型在驗證集合上做一次預測,你想,因為這個時候我們的驗證集是不是只有1分,也就是只有train_set_number/k個樣本(train_set_number表示訓練樣本的個數),但是這只是一折啊,我們還有k折,每一折我們都會在驗證集上預測,所以最終對於clf1在驗證集上得到是不是train_set_number個結果,不用擔心是沒有重復的,因為你是kflod啊 是不是每一折的驗證集樣本都不會相同,也就是沒有哪個樣本同時出現在兩個驗證集上,這樣下來,我們就得到第一級的結果,也是train_set_number個結果。然后在每一折上,我們在測試集上做一次預測,那么k個clf1模型預測k次得到了k個結果,也就是每一個樣本預測結果有k個,我們就取一下平均,看到是取平均,這樣取完平均以后每一個樣本在clf1模型上就得到一個預測結果。這只是一個模型的過程,因為我們需要集成很多個模型,那么我重復n個模型,做法和上面是一樣的,假設我們有n個模型,那么請問我們stacking第一層出來,在驗證集上得到的結果特征是什么維度?應該就是訓練樣本的個數行(train_set_number),列數就是n吧,因為n個模型啊,這就是我們對第一層結果的一個特征堆疊方法,這樣第一層出來的結果又可以作為特征訓練第二層,第二層任然可以使用stacking多個模型,或者直接接一個模型用於訓練,然后直接預測。那么同樣,對於測試集第一層出來的維度是不是(test_set_number,n),也就是測試集樣本的行數,這樣是不是可以用第二層訓練的模型在這個上面預測,得到我們最后的結果。這個就是stacking的整個過程。 然后我們看一段stacking的代碼:

構造stacking類
事實上還可以構造一個stacking的類,它擁有fit和predict方法

本文分享自微信公眾號 - 機器學習AI算法工程(datayx)