自学教程 学编程从这里开始

集成学习

集成学习(Ensemble Learning)不是单一算法,而是将多个基础模型组合在一起,共同完成预测任务。利用多个模型的差异性,降低单个模型的误差,通常效果优于任意一个基础模型。

1. 核心思想

三个臭皮匠,顶个诸葛亮。
单个模型容易存在偏差或者方差问题:

  • 弱学习器:效果一般、泛化能力有限的基础模型(常使用决策树)
  • 集成学习:组合多个弱学习器,得到强学习器

集成学习主要分三大流派:Bagging、Boosting、Stacking。

2. 三大主流框架

Bagging(自助聚合)

并行训练,各个模型独立、互不影响。

  1. 对原始数据集做有放回抽样,得到多份不同训练子集
  2. 每份子集单独训练一个基础模型
  3. 预测:分类投票、回归取平均

代表:随机森林 Random Forest

随机森林额外增加特征随机选择,进一步降低树与树之间的相关性。

Boosting(提升)

串行训练,模型依次生成,后一个模型重点修正前一个模型的错误。

  1. 先训练第一个模型
  2. 对分错的样本提高权重,让下一个模型更加关注这些样本
  3. 不断迭代,最后加权组合所有模型

代表:AdaBoost、GBDT、XGBoost、LightGBM

Stacking(堆叠)

分层模型,第一层多个基础模型输出预测结果,作为第二层元模型的输入,由元模型学习如何融合结果。

  • 第一层:多个不同基础模型
  • 第二层:元学习器(比如逻辑回归)负责融合

3. 偏差与方差视角理解

  • Bagging:降低方差,缓解过拟合(单棵树容易过拟合,多棵树平均后稳定)
  • Boosting:降低偏差,提升模型拟合能力,但更容易过拟合

4. 优缺点

✅ 优点

  • 预测精度高,是工业表格数据竞赛最常用方案
  • 鲁棒性更强,不容易被噪声干扰
  • 可以同时处理分类、回归任务

❌ 缺点

  • 模型复杂度高,训练、推理耗时更大
  • 可解释性变差,远不如单棵决策树直观
  • 调参数量多,需要更多调优成本

5. Python 代码示例(随机森林)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 字体配置,解决 DejaVu Sans 中文缺失警告
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 生成数据集
np.random.seed(42)
X, y = make_classification(n_samples=150, n_features=2, n_informative=2, n_redundant=0, random_state=42)

# 划分训练集、测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 随机森林(Bagging代表)
model = RandomForestClassifier(n_estimators=50, max_depth=3, random_state=42)
model.fit(X_train, y_train)

# 预测评估
y_pred = model.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"测试集准确率:{acc:.2f}")

# 绘制决策边界
def plot_decision_boundary(clf, X, y):
    x_min, x_max = X[:,0].min()-1, X[:,0].max()+1
    y_min, y_max = X[:,1].min()-1, X[:,1].max()+1
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
    plt.scatter(X[:,0], X[:,1], c=y, cmap='coolwarm')
    plt.xlabel("x1")
    plt.ylabel("x2")

plot_decision_boundary(model, X_train, y_train)
plt.title("随机森林决策边界")
plt.show()

运行结果:

6. 适用场景

  • 结构化表格数据(风控、广告、销量预测)
  • 对精度要求高,接受一定推理耗时
  • 机器学习竞赛基线首选模型

7. 常见误区

  1. 集成模型一定比单模型好:基础模型如果效果都很差,集成也很难提升
  2. 树越多效果一定越好:n_estimators 到一定程度后,收益不再增加,只会增加耗时
  3. Boosting 不容易过拟合:持续迭代会不断拟合噪声,需要正则、限制深度

思考题

  1. Bagging 和 Boosting 在训练顺序上有什么区别?
  2. 随机森林为什么同时对样本和特征做随机采样?
标签:

0 条笔记