---
# System prepended metadata

title: '集成學習（Ensemble learning）: Bagging, Boosting and Stacking'
tags: [機器學習]

---

## 什麼是集成學習（Ensemble learning）？
在機器學習中，單一模型往往有其局限性，而集成學習的目的是將多個模型的預測結果進行整合，達到比單獨使用一個模型更好的效果，也就是常常聽到的一句諺語「三個臭皮匠勝過一個諸葛亮」。

集成學習主要分成三個方法，以下先做簡單介紹
1. Bagging: 透過多次隨機且重複抽樣產生多組訓練數據集（training set），並訓練多個模型，最終取模型預測結果的「平均值（回歸）」或「投票結果（分類）。」
2. Boosting: 透過依次訓練弱分類器，每次針對前一次的錯誤進行加權，最終生成一個強分類器。
3. Stacking: 透過使用不同的模型進行訓練，然後將這些模型的輸出作為下一層模型的輸入，從而提高預測精度。

## Bagging 
### Bootstrapping
假如你手上有一組 N 筆的原始資料（Original data），透過隨機且取後放回的規則去抽出 n 筆資料（通常 N = n），即可得到一個新的資料集，若重複以上的動作就可以建構出多個資料集，此步驟稱為「Bootstrapping」，接著將剛剛建構出的資料集訓練各自不同的 model，例如決策樹（Decision tree）、支持向量機（SVM）等，最後將這些訓練好的模型整合起來，成為一個強大的 Ensemble model。
### Aggregating
現在有一筆從未看過的資料，希望模型能預測出較佳的結果，這個結果可能是一個數值或者是類別，根據問題/任務的特性而定，如果輸出結果為一個數值，則將每個小模型的輸出結果平均（Average of outputs）得到最終結果，如果輸出結果為一個類別，則將每個小模型的輸出結果依照多數決(Majority vote)得到最終結果，此步驟稱為「Aggregating。」
### Bagging = Bootstrapping + Aggregating
因此，Bagging 的核心概念就是 Bootstrapping 與 Aggregating 的技術組合而成，透過隨機且取後放回的抽樣方式，訓練不同的模型，採用平均或是多數決的方式決定最終結果，降低模型發生過擬合(Overfitting)的可能性，也就是降低方差(Variance)，避免原始資料(Original data)中離群點(Outlier)的影響。

有關 Overfitting 與 Variance 的關係，詳細內容請參見[Overfitting v.s. Underfitting](https://hackmd.io/@lcaMuWOwR1Ox5o5yeTEupA/ByCVKNQNA) 的文章。

![image](https://hackmd.io/_uploads/BkjkZ1O0C.png)
<p class="text-center">Bagging(Source: AIML.com Research)

:::info
常聽到的隨機森林（Random Forest, RF），其實就是應用 Bagging 技術的其中一個例子，簡單來說 Random Forest = Bagging + decision tree，其運作方式是構建多棵決策樹（即"森林"），並通過這些樹的預測結果進行集成，達到更精確和穩定的預測。
    
需要特別注意的是，隨機森林的隨機性體現在隨機抽樣以及隨機特徵選擇，隨機抽樣能減少模型過度擬合，隨機特徵選擇降低決策樹之間的相關性，若原始資料(Original data)具有 p 個特徵的分類問題，構建決策樹常使用 √p 個特徵，而回歸問題常使用 p/3 個特徵。
:::

## Boosting
根據前一輪分類器預測錯誤的數據，賦予錯誤樣本更高的權重，讓下一個分類器更加專注於修正這些錯誤，也就是說這些不同的分類器(classifier)為互補關係，後分類器彌補前分類器不足之處，依序訓練，最後整合出強大的分類器。
    
保證，如果有一個弱小的分類器（ex: 淺層決策樹）在訓練資料上的錯誤率（Error rate）小於 50%，其偏差（bias）也很高，經過 Boosting 後，最終能獲得一個錯誤率為零的強大分類器，使得偏差能有效降低。
    
![image](https://hackmd.io/_uploads/BJpQ-EK0A.png)


Boosting 算法常見的分為以下三種
### 1. AdaBoost(Adaptive Boosting)
最早的 Boosting 算法，每個新的分類器專注於前一個分類器錯誤分類的樣本，為錯誤樣本賦予較高權重，從而改善整體模型的準確性。
    
下圖中，一開始各個數據點的權重都是相同的，經過第一個分類器的判讀結果，錯誤率為 0.3，判讀錯誤的數據會更新權重，其計算方式為$\exp\left(0.5 \cdot \ln\left(\frac{0.3}{0.7}\right)\right)=1.53$ 使其比一開始的權重大，而判讀正確的數據也會做一次權重更新，其計算方式為 $\exp\left(-0.5 \cdot \ln\left(\frac{0.3}{0.7}\right)\right)=0.65$ 使權重變小，因此下一個分類器將會更專注於權重較大的數據，也就是被錯誤分類的數據，彌補前一個分類器的不足之處，以此類推。

![image](https://hackmd.io/_uploads/BylDAiu661x.png)


### 2. Gradient boosting
Gradient boosting 的技術能夠使用在回歸、分類以及 Ranking 上，下方以回歸作為例子展示。
    
在迴歸問題中，首先產生一個初始模型（通常比深度僅有一層的決策樹 Stump 再深一些），使用原始資料的平均值作為預設值，並計算與每一筆實際值間的殘差。

根據計算出的殘差或梯度，訓練一個新的弱學習器（Weak learner），新的弱學習器的預測結果會被加入到整體模型的預測中，但在相加之前，會按學習率（learning rate）進行縮放，學習率通常介於 0.01 到 0.3 之間。

這樣的步驟會不斷重複：計算殘差或梯度、訓練新的弱學習器、更新模型，直到達到指定的迭代次數或滿足預定的停止條件。

![image](https://hackmd.io/_uploads/BkPvgCoA0.png)
:::info
XGBoost（eXtreme Gradient Boosting） 是一種以梯度提升（Gradient Boosting）為基礎的機器學習方法，不僅保留了傳統梯度提升的優點，還加入了二階導數優化、正則化、缺值處理與並行運算等改良，使其在效率與準確率上都表現優異。
:::
    
:::info
AdaBoost 和 Gradient Boosting 的差異
![image](https://hackmd.io/_uploads/rkfp3uTpJx.png)
:::
    
## Stacking
首先準備建模資料，並將其劃分為訓練集、驗證集和測試集，接下來是選擇在堆疊模型中使用的基本模型（Base model），通常選擇多種異質模型（Heterogeneous model），確保它們產生不同類型的錯誤，並能相互彌補之間的問題。

選擇好基礎模型後，這些模型會在訓練集上進行訓練，當基礎模型訓練完成後，會使用這些模型對驗證集進行預測，並使用這些預測結果作為輸入並訓練元模型（Meta/Second-level model），元模型可以採用任何演算法來實現，例如線性迴歸、邏輯迴歸或神經網絡。

最終，元模型會用來對測試集進行預測，並根據基礎模型的輸出產生最終預測結果，最後，通過混淆矩陣等評估指標，對 Stacking 的性能進行評估。


![image](https://hackmd.io/_uploads/SJovDAi0C.png)

### Stacking 的優點與缺點
優點
1. 性能提升：透過結合不同模型的預測結果，通常能獲得比單一模型更好的性能，特別是在複雜數據集上。
2. 靈活性：可以使用多種不同類型的模型（例如，決策樹、隨機森林和神經網絡），增加了模型的多樣性。
3. 減少過擬合：適當的堆疊可以減少模型的過擬合，尤其是在使用交叉驗證的情況下，能提高泛化能力。

缺點  
1. 計算開銷大：訓練多個模型和元模型需要較高的計算資源和時間，可能不適合處理非常大的數據集。
2. 複雜性：模型的組合和調參可能相當複雜，需要更多的專業知識。

    
## 總結
以上，解釋了什麼是集成學習(Ensemble learning)，訓練多個學習器/小模型最後整合成一個強大的模型，正所謂「三個臭皮匠勝過一個諸葛亮」，也提到三個常用的機器學習算法，分別是 Bagging、Boosting 與 Stacking，並且說明其差異與優缺點。

---
:::info 
以上就是這篇文章「集成學習(Ensemble learning): Bagging, Boosting and Stacking」的所有內容，第一次看的人會花比較多時間消化吸收，這是很正常的事情，若有任何問題，歡迎在下方與我聯繫、討論，接下來也會繼續分享相關文章，敬請期待。