集成Ensemble

什麼是集成(ensemble)集成是使⽤不同⽅式,結合多個/多種不同分類器,作為綜合預測的做法統稱。通過對模型截長補短的方式,來取得更好的分數
其中⼜分為 資料⾯的集成 : 如裝袋法(Bagging) / 提升法(Boosting)以及 模型與特徵的集成 : 如混合泛化(Blending) / 堆疊泛化(Stacking)
資料⾯集成 : 裝袋法 ( Bagging )裝袋法顧名思義,是將資料放入袋中抽取,每回合結束後全部放回袋中重抽再搭配弱分類器取平均/多數決結果,最有名的就是前⾯學過的 隨機森林(Random Forest)
資料⾯集成 : 提升法 ( Boosting )提升法則是由之前模型的預測結果,去改變資料被抽到的權重或⽬標值將錯判資料被抽中的機率放⼤,正確的縮⼩,就是 ⾃適應提升 (AdaBoost,Adaptive Boosting)如果是依照估計誤差的殘差項調整新⽬標值,則就是 梯度提升機 (GradientBoosting Machine) 的作法,只是梯度提升機還加上⽤梯度來選擇決策樹分⽀
資料集成 v.s. 模型與特徵集成值得一提的是雖然兩者都稱為集成,其實適⽤範圍差異很⼤,通常不會⼀起提及但為了避免混淆,在這邊將兩者做個對比
資料集成Bagging / Boosting
使⽤不同訓練資料 + 同⼀種模型,多次估計的結果合成最終預測
模型與特徵集成Voting / Blending / Stacking
使⽤同⼀資料 + 不同模型,合成出不同預測結果
混合泛化 (Blending)其實混合泛化非常單純,就是將不同模型的預測值 加權合成 ,權重和為 1如果取預測的平均 or ⼀⼈⼀票多數決(每個模型權重相同),則⼜稱為 投票泛化(Voting)混合泛化提升預測⼒的原因是基於模型差異度⼤,在預測細節上能互補,因此預測模型只要各⾃調參優化過且原理不同,通常都能使⽤混合泛化集成
注意事項雖然blending可以有效的提升成績,然而 Blending 的前提是 : 個別單模效果都很好(有調參)並且模型差異⼤,其中單模要好尤其重要,如果單模效果差異太⼤,Blending 的效果提升就相當有限
延伸:林軒⽥老師公開課程中有更詳細的解說https://www.youtube.com/watch?v=mjUKsp0MvMI&list=PLXVfgk9fNX2IQOYPmqjqWsNUFl2kpk1U2&index=26
堆疊泛化(Stacking) 原始paper相對於 Blending 的改良不只將預測結果混合,而是使用預測結果當新特徵更進一步的運用了資料輔助集成,但也使得 Stacking 複雜許多
Stacking 的設計挑戰 : 訓練測試的不可重複性Stacking 主要是把模型當作下一階的特徵編碼器來使用,但是待編碼資料與用來訓練編碼器的資料不可重複 (訓練測試的不可重複性)若將訓練資料切成兩組 :待編碼資料太少,下一層的資料筆數就會太少,訓練編碼器的資料太少,則編碼器的強度就會不夠,
這樣的困境該如何解決呢?
巧妙的 K-Fold 拆分Stacking 最終採取 將資料拆成 K 份,每份含 1/K 的資料,要編碼時,使用其他的 K-1 組資料訓練模型/編碼器。這樣資料就沒有變少,K 夠大時 編碼器的強韌性也夠,唯一的問題就是計算時間隨著 K 變大而變長,但 K 可以調整,且相對深度學習所需的時間來說,這樣的時間長度也還算可接受
常見問題Q1:能不能新舊特徵一起用,再用模型預測呢?A1:可以,這裡其實有個有趣的思考,也就是 : 這樣不就可以一直一直無限增加特徵下去?這樣後面的特徵還有意義嗎? 不會 Overfitting 嗎?…其實加太多次是會 Overfitting 的,因此必須謹慎切分 Fold 以及新增次數
Q2:新的特徵,能不能再搭配模型創造特徵,第三層第四層…⼀一直下去呢?A2:可以,但是每多一層,模型會越複雜 : 因此泛化(又稱為魯棒性)會做得更好,精準度也會下降,所以除非第一層的單模調得很好,否則兩三層就不需要繼續往下了了
Q3:既然同層新特徵會 Overfitting,層數加深會增加泛化,兩者同時用是不是就能把缺點互相抵銷呢?A3:可以!! 而且這正是 Stacking 最有趣的地方,但真正實踐時,程式複雜,運算時間又要再往上一個量級,之前曾有⼤大神寫過 StackNet實現這個想法,用JVM 加速運算,但實際上使用時調參數困難,後繼使用的人就少了
注意事項「分類問題」的 Stacking 要注意兩件事:記得加上 use_probas=True(輸出特徵才會是機率值),以及輸出的總特徵數會是:模型數量*分類數量(回歸問題特徵數=模型數量)
相關StackingCVClassifier - mlxtrend 官⽅方網站http://rasbt.github.io/mlxtend/user_guide/classifier/StackingCVClassifier/