集成學習通過 “組合多個基礎模型” 提升泛化能力,核心分為并行集成(Bagging)、串行集成(Boosting) 和多層集成(Stacking) 三大范式,分別對應 “降方差”“降偏差”“兼顧偏差與方差” 三大優化目標,適用場景與實現邏輯差異顯著。
一、Bagging:并行集成,專注降低方差(Bootstrap AGGregatING)
Bagging 的核心是 “用數據多樣性抵消模型波動”,通過并行訓練多個相同基礎模型,最終平均 / 投票輸出,主打 “提升模型穩定性”,對偏差影響極小。
1. 核心原理與流程
三步實現數據采樣、并行訓練與結果融合,關鍵在于 “有放回采樣(Bootstrap)” 創造多樣性:
- 數據采樣:對含 m 個樣本的原始訓練集,有放回采樣 m 次,生成 n 個不同的訓練集(每個訓練集樣本有重復);
- 并行訓練:用 n 個訓練集,并行訓練 n 個完全相同的基礎模型(如決策樹);
- 結果融合:
- 回歸任務:n 個模型預測結果取平均;
- 分類任務:n 個模型預測結果投票(少數服從多數)。
(1?lim?m→∞(1?1/m)m=1?1/e≈63%)(1-\lim_{m \to \infty}(1-1/m)^m = 1-1/e \approx 63\%) (1?m→∞lim?(1?1/m)m=1?1/e≈63%) 的樣本會被采樣到,未被采樣的 “Out-of-Bag(OOB)樣本” 可直接作為驗證集,無需額外劃分數據。
2. 代碼實現(簡化版)
from copy import deepcopy
import numpy as np
import pandas as pd # 假設輸入為DataFrame格式class Bagging: def __init__(self, base_learner, n_learners): # 初始化n個相同基礎模型(深拷貝避免參數共享)self.learners = [deepcopy(base_learner) for _ in range(n_learners)] self.n_learners = n_learnersdef fit(self, X: pd.DataFrame, y: pd.Series): # 循環模擬并行訓練(實際工程中可多線程/多進程加速)for learner in self.learners: # Bootstrap有放回采樣:生成與原數據量相同的樣本索引sample_indices = np.random.choice(np.arange(len(X)), size=len(X), replace=True)# 用采樣數據訓練單個基礎模型learner.fit(X.iloc[sample_indices], y.iloc[sample_indices]) def predict(self, X: pd.DataFrame) -> np.ndarray: # 回歸任務:多模型預測結果取平均preds = np.array([learner.predict(X) for learner in self.learners]) # 形狀:(n_learners, 樣本數)return preds.mean(axis=0) # 按樣本維度平均,輸出形狀:(樣本數,)
3. 適用場景與典型案例
- 核心作用:顯著降低方差(多模型平均抵消單模型對數據的敏感波動),對偏差基本無影響;
- 適配基礎模型:僅對 “不穩定模型” 有效(如決策樹、神經網絡)—— 這類模型對訓練數據細節敏感,數據微小變化會導致預測結果大幅波動;對 “穩定模型”(如線性回歸)效果有限;
- 典型案例:隨機森林(Random Forest)—— 在 Bagging 基礎上,對每個決策樹的 “特征” 也進行隨機采樣(如每次分裂僅選 1/3 特征),進一步增加模型多樣性,降低過擬合風險。
二、Boosting:串行集成,專注降低偏差
Boosting 的核心是 “逐步修正錯誤,強化弱模型”,通過串行訓練多個弱模型(如淺層決策樹),后一個模型聚焦前一個模型的錯誤樣本,最終加權融合,主打 “提升模型準確性”。
1. 核心原理與流程
三步實現串行訓練、錯誤聚焦與加權融合,關鍵在于 “樣本權重調整”:
- 弱模型串行訓練:按順序訓練 n 個弱模型(如深度≤3 的決策樹),每個模型的訓練依賴前一個模型的誤差;
- 錯誤樣本聚焦:通過調整樣本權重(或重新采樣),讓后一個模型更關注前一個模型預測錯誤的樣本(如錯誤樣本權重升高,正確樣本權重降低);
- 結果加權融合:根據每個弱模型的性能(誤差率)分配權重(誤差率越低,權重越高),最終預測結果為各模型預測值的加權和。
典型算法:
- AdaBoost:通過 “樣本權重更新” 聚焦錯誤 錯誤樣本權重×(1/誤差率),正確樣本權重×誤差率錯誤樣本權重 \times(1 / 誤差率), \quad 正確樣本權重 \times 誤差率錯誤樣本權重×(1/誤差率),正確樣本權重×誤差率;
- Gradient Boosting:通過 “擬合前一輪模型的殘差” 聚焦錯誤 殘差=真實值?前一輪預測值殘差 = 真實值 - 前一輪預測值殘差=真實值?前一輪預測值,適用性更廣。
2. Gradient Boosting:基于殘差的經典實現
Gradient Boosting(梯度提升)是工業界最常用的 Boosting 算法,通過 “擬合殘差” 優化偏差,引入 “學習率(η)” 控制修正幅度,避免過擬合。
(1)核心公式
-
模型迭代公式:
Ht+1(x)=Ht(x)+η?ft(x)\Large H_{t+1}(x) = H_t(x) + \eta \cdot f_t(x)Ht+1?(x)=Ht?(x)+η?ft?(x)
- Ht(x)H_t(x)Ht?(x):第 t 輪集成模型的預測值;
- ft(x)f_t(x)ft?(x):第 t 個弱模型(擬合Ht(x)H_t(x)Ht?(x)的殘差,即y?Ht(x)y - H_t(x)y?Ht?(x));
- η\etaη(學習率):控制ft(x)f_t(x)ft?(x)的貢獻度(通常取 0.01~0.1),避免單模型影響過大導致過擬合。
-
殘差意義:當使用 MSE(均方誤差)作為損失函數時,殘差 y?Ht(x)y - H_t(x)y?Ht?(x) 等于損失函數對 Ht(x)H_t(x)Ht?(x) 的負梯度 ??L/?Ht(x)-\partial L / \partial H_t(x)??L/?Ht?(x),即梯度下降的方向 —— 本質是用 “殘差” 替代 “梯度”,簡化計算。
(2)代碼實現(簡化版)
from copy import deepcopy
import numpy as np
import pandas as pdclass GradientBoosting: def __init__(self, base_learner, n_learners, learning_rate=0.1): self.learners = [deepcopy(base_learner) for _ in range(n_learners)] self.lr = learning_rate # 學習率,控制每輪殘差修正幅度self.n_learners = n_learnersdef fit(self, X: pd.DataFrame, y: pd.Series): residual = y.copy().values # 初始殘差=真實值(第0輪模型預測為0)for learner in self.learners: # 弱模型擬合當前殘差(將殘差視為“新的真實值”)learner.fit(X, residual) # 更新殘差:減去當前模型的修正量(修正量=模型預測值×學習率)residual -= self.lr * learner.predict(X) def predict(self, X: pd.DataFrame) -> np.ndarray: # 所有弱模型預測值加權求和(權重=學習率)preds = np.array([learner.predict(X) for learner in self.learners]) # 形狀:(n_learners, 樣本數)return preds.sum(axis=0) * self.lr # 按樣本維度求和,輸出形狀:(樣本數,)
3. GBDT 與工程優化
- GBDT(Gradient Boosting Decision Trees):以 “淺層 CART 樹” 為弱模型的 Gradient Boosting,兼顧精度與可解釋性,廣泛用于推薦系統(CTR 預測)、金融風控(違約預測)等場景;
- 工程優化算法:
- XGBoost:引入 “樹復雜度正則化”(L1/L2 正則)、“缺失值自動處理”,支持并行計算(特征分裂候選值并行),訓練速度比傳統 GBDT 快 5~10 倍;
- LightGBM:采用 “直方圖優化”(將連續特征離散為直方圖)、“Leaf-wise 樹生長”(優先分裂增益大的葉子節點),進一步提升訓練效率,適合億級樣本場景。
三、Stacking:多層集成,兼顧偏差與方差
Stacking 的核心是 “用不同模型多樣性 + 多層學習”,通過并行訓練多個不同基礎模型,將其輸出作為新特征輸入 “元模型”,兼顧 “穩定性” 與 “準確性”,靈活性高于 Bagging 和 Boosting。
1. 單層 Stacking:基礎結構
(1)核心流程
三層結構實現 “基礎模型特征提取 + 元模型融合”,關鍵在于 “不同基礎模型” 與 “特征拼接”:
- 第一層(基礎模型層):并行訓練 n 個不同類型的基礎模型(如 Random Forest、GBDT、MLP),每個模型輸出預測結果(如分類任務輸出類別概率,回歸任務輸出連續值);
- 特征拼接(Concat):將 n 個基礎模型的預測結果拼接成 “新特征矩陣”(如 3 個基礎模型 → 新特征維度 = 3);
- 第二層(元模型層):用 “新特征矩陣” 訓練元模型(如邏輯回歸、Dense 層),輸出最終預測結果。
(2)結構示意圖
# 單層Stacking結構(核心:不同基礎模型+元模型融合)元模型(如邏輯回歸、Dense層)👆-------------------| Concat | # 拼接各基礎模型的預測結果(新特征)-------------------👆---------------- 👆 ---------------- 👆 ----------------| Random Forest | | GBDT | | ... | | MLP | # 不同類型基礎模型---------------- 👆 ---------------- 👆 ----------------👆-------------------| Inputs | # 原始輸入特征(如用戶特征、物品特征)-------------------
(3)核心作用
- 主要降低方差:通過 “不同類型基礎模型” 的多樣性(如樹模型 + 神經網絡),抵消單一模型的波動;
- 對比 Bagging:Bagging 靠 “相同模型 + 數據采樣” 創造多樣性,Stacking 靠 “不同模型” 創造多樣性,靈活性更高,可適配更多場景。
2. 多層 Stacking:進階結構
(1)核心流程
在單層基礎上增加層級,實現 “逐層修正偏差”:
- 多層級聯:每一層的輸出作為下一層的輸入(如 L1 層輸出 → L2 層輸入,L2 層輸出 → L3 層輸入);
- 每層多樣性:每一層可使用不同基礎模型(如 L1 用樹模型,L2 用線性模型),高層元模型聚焦修正低層的偏差。
(2)結構示意圖
# 多層Stacking結構(核心:層級聯+逐層修正偏差)L3:元模型(如Dense層)👆-------------------| Concat | # L2層各模型預測結果拼接-------------------👆---------------- 👆 ---------------- 👆 ----------------| Random Forest | | GBDT | | ... | | MLP | # L2層基礎模型---------------- 👆 ---------------- 👆 ----------------👆-------------------| Concat | # L1層各模型預測結果拼接-------------------👆---------------- 👆 ---------------- 👆 ----------------| Random Forest | | GBDT | | ... | | MLP | # L1層基礎模型---------------- 👆 ---------------- 👆 ----------------👆-------------------| Inputs | # 原始輸入特征-------------------
(3)過擬合解決策略
多層 Stacking 的高層(如 L2、L3)因 “新特征維度低、數據量少” 易過擬合,需針對性優化:
- 分層數據劃分:將數據集分為 A、B 兩組,A 訓練 L1 層,B 訓練 L2 層(避免 L2 層看到 L1 層的訓練數據,導致數據泄露);
- K 折 Bagging 重復:
- 對每一層,用 K 折交叉驗證訓練 K 個模型,取 “Out-of-Fold(OOF)預測結果” 作為下一層輸入(如 K=5,每個樣本僅用 “未參與訓練的 1 折模型” 預測,避免過擬合);
- 重復 n 次 K 折過程,對同一樣本的 n 次預測取平均,進一步降低波動。
四、三大集成范式對比
集成范式 | 核心目標(降低偏差 / 方差) | 計算成本 | 并行性 | 關鍵特點 | 適用場景 |
---|---|---|---|---|---|
Bagging | 方差(主要) | n(n = 基礎模型數) | 高(n 個模型并行) | 相同基礎模型 + Bootstrap 采樣,穩定優先 | 模型波動大、需提升穩定性(如決策樹) |
Boosting | 偏差(主要) | n | 低(串行訓練) | 弱模型串行 + 錯誤聚焦,精度優先 | 模型欠擬合、需提升準確性(如淺層模型) |
單層 Stacking | 方差(主要) | n | 高(基礎模型并行) | 不同基礎模型 + 元模型融合,靈活優先 | 需平衡穩定與靈活(如多模態數據) |
多層 Stacking | 偏差 + 方差(兼顧) | n×l×k(n = 模型數,l = 層數,k=K 折) | 中(每層內并行) | 層級聯 + 逐層修正,需防過擬合 | 高精度場景(如競賽、核心業務預測) |