Skip to content

集成学习 (Ensemble)

一句话定义:集成学习是通过组合多个弱学习器来构建一个强学习器的方法。“三个臭皮匠,顶个诸葛亮”。

方法核心思想代表算法
Bagging并行训练,投票/平均Random Forest
Boosting串行训练,纠正前一个的错误AdaBoost, XGBoost, LightGBM
Stacking用模型组合模型比赛常用

方法类比
单个决策树一个人做判断,容易犯错
Random Forest100 人投票,少数服从多数
Boosting专家组:第一个人判断后,第二个人专门纠正第一个人的错误,以此类推
  • 高方差 (Variance):多次打靶,分布很散 → Bagging 解决
  • 高偏差 (Bias):多次打靶,都偏左 → Boosting 解决


观察 Bagging 和 Boosting 的工作原理,理解集成学习如何提升性能。

🌲 集成学习可视化

弱学习器数量:3
📦 样本数据
🍎+
🍊+
🍋+
🥦-
🥕-
🍅-
🔀 并行训练的弱学习器
1
+++--+
准确率: 83%
2
++----
准确率: 83%
3
+-+-+-
准确率: 50%

💡 Bagging 减少方差 (Random Forest),Boosting 减少偏差 (XGBoost)


Bagging 预测
f^(x)=1Bb=1Bfb(x)\hat{f}(x) = \frac{1}{B}\sum_{b=1}^B f_b(x)
  • BB: 基学习器数量(如 100 棵树)
  • fbf_b: 第 bb 个基学习器,在 Bootstrap 样本上训练
  • 回归任务取平均,分类任务投票

Bootstrap 采样:从 N 个样本中有放回抽取 N 个样本,约 63.2% 的原始样本会被抽到。

在 Bagging 基础上,每次分裂时只考虑随机子集的特征:

特征子采样
m=p (分类)m=p3 (回归)m = \sqrt{p} \text{ (分类)} \quad \text{或} \quad m = \frac{p}{3} \text{ (回归)}
  • pp: 总特征数
  • mm: 每次分裂考虑的特征数
  • 降低树之间的相关性,减少方差
Boosting 迭代
Fm(x)=Fm1(x)+αmhm(x)F_m(x) = F_{m-1}(x) + \alpha_m h_m(x)
  • FmF_m: 第 mm 轮后的组合模型
  • hmh_m: 第 mm 个弱学习器
  • αm\alpha_m: 第 mm 个学习器的权重
  • 每轮增加对”难样本”的关注
梯度提升
Fm(x)=Fm1(x)+γhm(x),hm=argminhiL(yi,Fm1(xi)+h(xi))F_m(x) = F_{m-1}(x) + \gamma h_m(x), \quad h_m = \arg\min_h \sum_i L(y_i, F_{m-1}(x_i) + h(x_i))
  • 每轮拟合残差(负梯度方向)
  • LL: 损失函数(MSE, LogLoss 等)
  • XGBoost 加入正则化项防止过拟合

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Random Forest
rf = RandomForestClassifier(
n_estimators=100, # 树的数量
max_depth=10, # 最大深度
min_samples_split=5, # 分裂最少样本数
random_state=42
)
rf.fit(X_train, y_train)
print(f"Random Forest 准确率: {rf.score(X_test, y_test):.3f}")
# 特征重要性
import pandas as pd
importance = pd.Series(rf.feature_importances_).sort_values(ascending=False)
print("Top 5 特征重要性:\n", importance.head())

特性Random ForestXGBoostLightGBMCatBoost
训练速度✅ 快
内存占用✅ 低
类别特征需编码需编码✅ 原生支持✅ 原生支持
过拟合风险
可解释性
Kaggle 常用⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

参数作用过拟合时
n_estimators树的数量影响不大
max_depth树的深度⬇️ 减小
learning_rate学习率 (Boosting)⬇️ 减小
min_samples_split分裂最少样本⬆️ 增大
subsample样本采样比例⬇️ 减小
colsample_bytree特征采样比例⬇️ 减小

  1. 决策树 - 理解基学习器
  2. SVM - 另一个经典算法
  3. 神经网络 - 深度学习方法