Stacking:集成學習策略圖解

Stacking 是機器學習中,集成學習的一種方法。集成的好處是不同的模型可以學習到數據的不同特徵,經過融合後的結果往往能有更好的表現,大有取長補短的意思。

  • 基本理解

這種方法的思想比較簡單,在不知道它之前,我們可能在設計算法的時候就會想到這種結構了,下面是我對這個算法的理解: 

 這個結構我們都很熟悉,十分像神經網絡中上層神經元到它的一個下層神經元的結構。如果按這種方法,x1-x4是上層的權重,e1是這個神經元的激活函數,並輸出神經元的值。不同的是,對於每個x1-x4,輸入都是一樣的,我們姑且稱爲data_in,則公式化的結果可以表示爲:

output = f\subscript_{activation}(\sum x\subscript_{i} *data\subscript _{in})

而對於集成學習來說,我們只需要把關鍵的x1 - x4 以及 e1 換成模型就好了。換句話說,最終整個模型的流程如下:

即將所有數據使用n個模型進行預測,再將預測的結果取平均值,作爲特徵值輸入給第n+1個模型,最終的輸出由Model(n+1)決定。

  • 模型選擇

可以看到,Stacking的結構在構成上就已經非常複雜(因爲我們在圖中過濾了每個model的內部結構),那麼當我們真正使用這個結構的時候,是如何進行訓練的正常運行,保證結構的合理性而不會過擬合呢。這一部分參考了許多網上的資料,包括知乎、CSDN和其他的博客園的內容,大家都是相互引用,我就不一一引用了哈。

在這裏我們首先分步考慮每個模型的訓練過程:

對於Model1 - Model n,他們是第一層的模型,普遍來講,我們可以選擇的有:

第一層模型: 

  • Xgboost
  • LightGBM
  • RandomForest
  • GBDT
  • ExtraTrees
  • ...

這裏可以看出,第一層的模型都是強模型,至於爲什麼,可以從幾個方面考慮:

  1. 最簡單的思想就是馬後炮,如果第一層使用了一個弱模型,則整個模型的表現會被大大影響,準確率大打折扣。
  2. 當然光是馬後炮是不管用的,首先,我們考慮我們對第一層模型的需求,因爲Stacking的思想是取長補短,而不同的強模型對於相同的數據以及數據分佈都是從不同的角度出發的,所以我們需要不同角度的數據進行彙總和學習,獲得更好的結果。
  3. 結合上面兩點,我們對第一層的模型要求應該是:效果準確,結構不同。所以我們應當選擇的是結構不同的強模型。

另外,是否使用Stacking也有幾點需要注意:

  1. 數據集是否夠大。stacking不一定對極小的數據集有效,這與它的訓練過程有關,如果一共就200個數據,在訓練過程中就要首先分爲訓練集和測試集,所有訓練集又要分爲n-fold,導致每個fold可能就只有20個數據,最終結果是無法保證效果的。
  2. 第一層的model數要夠多。爲什麼要夠多呢,這裏主要是考慮第二層模型的訓練問題,Stacking精巧的訓練過程需要將第一層的model輸出合併爲第二層的model_(n+1)的輸入,即第一層的model數N決定了第二層model_(n+1)的輸入特徵維數,如果想要第二層得到充分訓練,那麼N的維數取1或者2肯定是不夠的。(如下圖所示)

  3. 從知乎轉:理論上看,通用的stacking模型已經證明其集成結果應該“漸進等價”第一層中的最優子模型,所以stacking的結果不應該有大幅度的下降。換句話說,如果你用了stacking,效果變差了,就優先考慮上面兩條,然後再好好檢查下自己的第一層model中有沒有效果很差的model拉低了整體的表現。

那麼到這裏基本搞定了第一層的模型選擇,我們再看第二層。說是第二層,其實就是一個model_(n+1)。對於這一層的算法,我覺得可以有很多不同的理解:

  • 可以認爲是第一層做的是特徵變換,第二層做的纔是結果預測;
  • 也可以認爲第一層是各個模型進行預測,第二層進行結果篩選;
  • 或者第一層是模型預測,第二層是置信度的打分和加權平均。

但無論如何第二層做的計算一定是決定如何輸出結果的,因爲第一層的模型其實已經十分好了(強模型),在第二層,我們應該使用的是較爲簡單的模型,所以這裏我們有一個非常普遍的選擇,就是:LR模型,Linear Regression。當然這個選擇也不絕對,可以使用不同的模型進行最後的輸出決策,但是這個模型最好是簡單的模型,以防止整體模型的過擬合。

對於LR模型,下篇博客再好好介紹一下。這裏,我們就先看下整體模型是如何進行訓練的。

  • 訓練過程

突然意識到應該先寫訓練過程再寫模型選擇的,會更好理解。但是也沒有無妨,如果你理解了上面的內容,那下面的過程一看就會明白。

首先我們需要知道機器學習中 K-Fold 的訓練過程是怎樣的,即把一個數據集分爲K份,再將每一份作爲測試集,其餘作爲訓練集,訓練K次,最終的結果的準確度或取值是這K次結果的均值,一張圖表達:

而在Stacking中,每個model都會做一個K-Fold預測,那麼Stacking的訓練過程也就變爲了:

可以看到,第一層模型經過K-Fold 訓練後得到的所有數據連在一起,成爲了Model_(n+1)的訓練集。

但不難發現的是,Model_(n+1)只有訓練集,沒有測試集。因爲K-fold中每個測試集的結果都變成了Model_(n+1)的訓練集。所以在最最最最最最開始,我們就需要將整體數據分爲測試集和訓練集。那麼最終,Stacking的整體結構爲:

 

到此,Stacking的結構就結束了,具體如何用代碼實現,是一個很枯燥難頂的過程,因爲我是使用Stacking做迴歸,所以如果完成,會把實現代碼貼上來。

完結!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章