本文参考了周志华老师的《机器学习》(俗称“西瓜书”)。这里是 第八章“集成学习” 的阅读笔记。本文归纳整理了核心知识点,并且记录了我的思考,希望对你有所帮助🎉

1. 集成学习的基本概念

1.1 什么是集成学习

集成学习是一种通过结合多个模型(基学习器)来提高整体预测性能的机器学习方法。核心思想是:将多个弱模型组合成一个强模型

1.2 集成学习的两种主要策略

  1. Bagging(Bootstrap Aggregating)

    • 通过对数据进行随机采样,训练多个独立的基学习器。
    • 对分类任务,通过多数投票决定类别;对回归任务,通过平均得到结果。
    • 例子:随机森林(Random Forest)。
  2. Boosting

    • 按顺序训练基学习器,每个学习器关注前一模型的错误样本。
    • 最终结果由所有学习器的加权组合决定。
    • 例子:AdaBoost、GBDT、XGBoost。

2. Bagging 方法

2.1 Bagging 的基本思想

Bagging 是并行集成学习方法的代表,通过随机采样生成多个数据子集,分别训练独立的基学习器,再结合它们的预测结果。

2.2 随机森林(Random Forest)

随机森林是 Bagging 的经典实现,使用多棵决策树作为基学习器,并在每棵树的训练中加入随机特征选择。

示意图


3. Boosting 方法

3.1 Boosting 的基本思想

Boosting 是一种序列化集成学习方法,通过按顺序训练多个模型,后续模型重点学习前一模型的错误样本。

3.2 AdaBoost(Adaptive Boosting)

AdaBoost 是 Boosting 方法的经典实现,通过调整样本权重,使错误分类样本的权重增加。

$$ w_i = w_i \cdot e^{\alpha \cdot I(y_i \neq \hat{y}_i)} $$

w_i:第 i 个样本的权重。
alpha:基学习器的权重,取决于其分类精度。

3.3 梯度提升(Gradient Boosting)

梯度提升是一种基于残差优化的 Boosting 方法,核心思想是:通过拟合当前模型的预测残差,逐步提高整体预测性能。

$$ \min_{\mathbf{f}} \sum_{i=1}^m L(y_i, f(x_i)) $$


4. Stacking 方法

4.1 Stacking 的基本思想

Stacking 是一种模型融合方法,不同于 Bagging 和 Boosting 的同质模型,它允许多种类型的基学习器协同工作。

示意图


5. Scikit-learn 实现集成学习

以下代码展示了 Bagging、Boosting 和 Stacking 的实现。

5.1 Bagging:随机森林

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 1. 加载数据集
data = load_iris()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 2. 随机森林
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

print("随机森林准确率:", accuracy_score(y_test, y_pred))

5.2 Boosting:AdaBoost

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

# 1. 使用决策树作为基学习器
base_learner = DecisionTreeClassifier(max_depth=1, random_state=42)
ada = AdaBoostClassifier(base_estimator=base_learner, n_estimators=50, random_state=42)

# 2. 训练模型
ada.fit(X_train, y_train)
y_pred = ada.predict(X_test)

print("AdaBoost 准确率:", accuracy_score(y_test, y_pred))

5.3 Stacking

from sklearn.ensemble import StackingClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression

# 1. 定义基学习器
estimators = [
    ('rf', RandomForestClassifier(n_estimators=10, random_state=42)),
    ('svc', SVC(probability=True, random_state=42))
]

# 2. 定义元学习器
stack = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())

# 3. 训练模型
stack.fit(X_train, y_train)
y_pred = stack.predict(X_test)

print("Stacking 准确率:", accuracy_score(y_test, y_pred))

6. 总结

策略 代表算法 优点 缺点
Bagging 随机森林、Extra Trees 减少过拟合,鲁棒性强 对偏差大的模型改进有限
Boosting AdaBoost、GBDT、XGBoost 减少偏差,适合复杂任务 对噪声数据敏感,训练时间长
Stacking StackingClassifier 泛化能力强,可结合不同类型基学习器 模型复杂性高,容易过拟合

7.头脑风暴

1. Bagging 适合降低方差,而 Boosting 更适合降低偏差

Bagging 降低方差

举例

Boosting 降低偏差

举例

2. Boosting 对噪声数据敏感,但 Stacking 能解决这个问题吗?

Boosting 对噪声敏感的原因
Boosting 的序列化训练机制会让模型逐步关注错误分类的样本:

Stacking 能否缓解噪声问题?

Stacking 的不同机制

为什么 Stacking 能缓解噪声问题

限制:Stacking 并非完全免疫噪声

文章参考