本文参考了周志华老师的《机器学习》(俗称“西瓜书”)。这里是 第八章“集成学习” 的阅读笔记。本文归纳整理了核心知识点,并且记录了我的思考,希望对你有所帮助🎉
1. 集成学习的基本概念
1.1 什么是集成学习
集成学习是一种通过结合多个模型(基学习器)来提高整体预测性能的机器学习方法。核心思想是:将多个弱模型组合成一个强模型。
- 基学习器:单个模型(如决策树、线性模型等)。
- 集成策略:通过 Bagging、Boosting 或 Stacking 等技术,将多个基学习器的预测结果融合,得到最终预测。
1.2 集成学习的两种主要策略
-
Bagging(Bootstrap Aggregating):
- 通过对数据进行随机采样,训练多个独立的基学习器。
- 对分类任务,通过多数投票决定类别;对回归任务,通过平均得到结果。
- 例子:随机森林(Random Forest)。
-
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)) $$
-
使用梯度下降优化损失函数。
-
常见实现:
- GBDT(Gradient Boosting Decision Tree):用决策树拟合残差。
- XGBoost、LightGBM 和 CatBoost 是 GBDT 的高效改进版本。
4. Stacking 方法
4.1 Stacking 的基本思想
Stacking 是一种模型融合方法,不同于 Bagging 和 Boosting 的同质模型,它允许多种类型的基学习器协同工作。
-
实现步骤:
- 训练多个基学习器(如决策树、SVM、神经网络等)。
- 使用基学习器的预测结果生成新特征,构造次级数据集。
- 用次级数据集训练元学习器(Meta Learner),得到最终模型。
-
优点:
- 灵活,可以结合不同类型的基学习器。
- 泛化性能强。
-
缺点:
- 计算复杂度高,容易过拟合。
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 降低方差
- Bagging 的核心是通过对训练数据进行随机采样,生成多个子数据集,分别训练多个独立的基学习器。
- 随机性与独立性:每个基学习器在不同的数据子集上独立训练,彼此之间没有直接关系。
- 由于模型独立性强,最终通过平均(回归)或投票(分类)结合多个学习器,可以减少因训练数据分布随机性导致的预测波动(方差)。
- 高方差基学习器: Bagging 通常搭配高方差模型(如深度决策树),因为这些模型容易过拟合,而 Bagging 可以通过集成平滑过拟合的效果。
举例:
- 假设某基学习器(如深度决策树)在不同训练集上表现不一致,单独使用时预测方差较大。
- Bagging 通过集成多个基学习器的结果,能够有效平均模型的波动,降低预测的不稳定性。
Boosting 降低偏差
- Boosting 的核心是通过序列化训练,逐步修正模型的错误:
- 每一轮训练的基学习器关注前一轮错误分类的样本。
- 最终结合多个学习器的加权结果。
- 针对偏差的优化:Boosting 不随机采样数据集,而是动态调整样本权重,让模型更加关注难以预测的样本。
- 通过每一轮迭代,模型逐步纠正偏差,从而逼近真实决策边界。
- 低偏差基学习器:Boosting 通常使用简单的弱学习器(如浅决策树、线性模型),通过多次迭代减少偏差,得到高精度预测。
举例:
- 如果一个浅决策树模型的单独预测能力较差(高偏差),Boosting 通过序列训练强化学习过程,逐步逼近真实的分类决策边界。
2. Boosting 对噪声数据敏感,但 Stacking 能解决这个问题吗?
Boosting 对噪声敏感的原因
Boosting 的序列化训练机制会让模型逐步关注错误分类的样本:
- 如果数据集中存在噪声样本(如错误标注的标签),Boosting 可能会不断尝试拟合这些噪声数据。
- 结果:模型对噪声过拟合,导致泛化能力下降。
Stacking 能否缓解噪声问题?
Stacking 的不同机制:
- 与 Boosting 不同,Stacking 的基学习器是并行训练的,相互独立。
- 元学习器综合多个基学习器的预测结果,关注全局特征,而非单一噪声样本的影响。
为什么 Stacking 能缓解噪声问题:
- 如果某些基学习器对噪声样本过拟合,元学习器可以通过权重调整,减少这些基学习器的影响。
- 元学习器能够自动学习哪些基学习器的预测更可信。
限制:Stacking 并非完全免疫噪声
- 如果所有基学习器都受噪声影响严重(比如样本质量差),Stacking 的元学习器也难以避免过拟合。
- 元学习器本身可能对噪声预测结果敏感,导致整体性能下降。
文章参考
- 《机器学习(西瓜书)》
- 部分LaTeX 公式借助了AI的帮助