11-6-串行策略:Boosting(详细注释版)

一、完整注释版代码(Jupyter Notebook格式)

基础库导入

# 导入numpy库,用于数值计算(数组操作、矩阵运算等),机器学习必备基础库
import numpy as np
# 导入matplotlib.pyplot库,用于数据可视化(绘制散点图、折线图等)
import matplotlib.pyplot as plt
# 从sklearn的数据集模块导入make_moons函数,生成月牙形二分类数据集
# 该数据集是非线性可分的,适合测试Boosting这类串行集成算法的效果
from sklearn.datasets import make_moons
# 生成月牙形数据集:
# n_samples=1000:总样本数为1000个
# noise=0.4:数据的噪声程度(噪声越大,类别边界越模糊,分类难度越高)
# random_state=20:随机种子,保证每次运行生成的数据集完全相同,便于复现结果
x, y = make_moons(
    n_samples=1000, 
    noise=0.4, 
    random_state=20
)
# 绘制数据集的散点图,可视化数据分布
# x[:, 0]:所有样本的第一个特征(x轴);x[:, 1]:所有样本的第二个特征(y轴)
# c=y:根据标签y为散点着色(不同类别不同颜色),直观区分两类样本
# s=10:散点的大小为10(数值越大,点越大)
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
# 显示绘制的图形
plt.show()
# 图例说明:图中两种颜色的点分别代表月牙形数据集中的两个类别,噪声使得类别边界无明显线性分隔,
# 适合用Boosting这类非线性集成算法解决
# 从sklearn的模型选择模块导入train_test_split函数,用于划分训练集和测试集
from sklearn.model_selection import train_test_split
# 划分数据集:
# x/y:待划分的特征矩阵和标签数组
# random_state=0:随机种子,保证划分结果可复现
# 默认划分比例:75%训练集(x_train/y_train),25%测试集(x_test/y_test)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)

AdaBoost

# 从sklearn的集成模块导入AdaBoostClassifier(AdaBoost分类器)
# AdaBoost是Boosting的经典实现:串行训练弱分类器,关注上一轮分类错误的样本(提高其权重)
from sklearn.ensemble import AdaBoostClassifier
# 从sklearn的树模块导入DecisionTreeClassifier(决策树分类器),作为AdaBoost的弱基分类器
from sklearn.tree import DecisionTreeClassifier

# 初始化AdaBoost分类器
# 注:sklearn 1.2+版本中,AdaBoostClassifier的base_estimator参数已弃用,替换为estimator,
# 若运行报错,可将base_estimator改为estimator
ada_clf = AdaBoostClassifier(
    base_estimator=DecisionTreeClassifier(max_leaf_nodes=16),  # 弱基分类器:限制叶节点数为16的决策树(防止过拟合)
    n_estimators=100                                           # 弱分类器的数量:100个(串行训练100棵决策树)
)
# 用训练集数据训练AdaBoost模型(串行训练:每棵树都基于上一轮的错误样本调整权重)
ada_clf.fit(x_train, y_train)
# 评估AdaBoost模型在测试集上的准确率(score方法默认返回分类准确率)
# AdaBoost通过聚焦错误样本,逐步提升模型整体性能
ada_clf.score(x_test, y_test)

Gradient Boosting

# 从sklearn的集成模块导入GradientBoostingClassifier(梯度提升分类器)
# 梯度提升(GB)是Boosting的进阶实现:串行训练弱分类器,每棵树拟合上一轮模型的"残差"(预测误差)
from sklearn.ensemble import GradientBoostingClassifier

# 初始化梯度提升分类器
gb_clf = GradientBoostingClassifier(
    n_estimators=100  # 弱分类器的数量:100个(默认基分类器为深度3的决策树)
)
# 用训练集训练梯度提升模型(核心逻辑:每棵树拟合前序模型的残差,逐步降低整体误差)
gb_clf.fit(x_train,y_train)
# 评估梯度提升模型在测试集上的准确率
# 梯度提升通过拟合残差,通常比AdaBoost有更好的泛化能力(尤其在噪声数据上)
gb_clf.score(x_test,y_test)

二、核心知识点梳理

1. Boosting核心概念(与Bagging对比)

维度Boosting(串行策略)Bagging(并行策略)
训练方式串行:弱分类器依次训练,后一个分类器聚焦前一个的错误样本并行:弱分类器独立训练,无依赖关系
核心思想逐步修正错误:通过调整样本权重/拟合残差提升性能投票平均:通过样本随机化降低过拟合
权重分配对错误样本/效果好的分类器赋予更高权重所有分类器权重均等(硬投票)或按概率(软投票)
过拟合风险较高(串行聚焦错误样本,易过度拟合)较低(并行平均,分散风险)
代表算法AdaBoost、Gradient Boosting(GB)、XGBoost、LightGBM随机森林、Extra-Trees

2. AdaBoost关键参数与原理

类/参数所属库作用核心原理
AdaBoostClassifiersklearn.ensembleAdaBoost分类器1. 初始化样本权重均等;2. 训练弱分类器,计算错误率;3. 提高错误样本权重;4. 重复训练,加权组合所有分类器
base_estimator/estimatorAdaBoost参数指定弱基分类器(如决策树)弱分类器需简单(易过拟合),通过Boosting组合成强分类器
n_estimatorsAdaBoost参数弱分类器数量数量越多,模型拟合能力越强(但易过拟合)
max_leaf_nodes决策树参数限制决策树叶节点数防止弱分类器过拟合,保证"弱"的特性

3. Gradient Boosting关键参数与原理

类/参数所属库作用核心原理
GradientBoostingClassifiersklearn.ensemble梯度提升分类器1. 初始化基准模型(如均值);2. 计算残差(真实值-预测值);3. 训练弱分类器拟合残差;4. 更新模型,重复迭代
n_estimatorsGB参数弱分类器数量控制迭代次数,默认100(平衡拟合能力与过拟合)
learning_rateGB参数(默认0.1)学习率:每棵树的贡献权重越小越稳定(需更多n_estimators),越大收敛越快(易过拟合)
max_depthGB参数(默认3)基决策树的最大深度限制单棵树复杂度,防止过拟合

4. 数据集与模型评估

函数/方法作用关键说明
make_moons生成月牙形二分类数据集非线性可分,适合测试Boosting效果
train_test_split划分训练/测试集75%训练、25%测试,保证模型泛化性评估
score()计算分类准确率正确预测数/总样本数,直观评估模型性能
plt.scatter可视化数据集按标签着色,直观展示类别分布和噪声

三、可直接运行的代码版本

版本1:Jupyter Notebook版(已在上方完整给出,可直接复制运行)

版本2:PyCharm版(无if name == ‘main’,可直接复制运行)

# 11-6-串行策略:Boosting - PyCharm可直接运行版本(适配sklearn 1.2+)

# ====================== 基础库导入与数据集生成 ======================
# 导入数值计算和可视化库
import numpy as np
import matplotlib.pyplot as plt

# 生成月牙形二分类数据集
from sklearn.datasets import make_moons
x, y = make_moons(
    n_samples=1000, 
    noise=0.4, 
    random_state=20
)

# 可视化月牙形数据集
print("===== 月牙形数据集可视化 =====")
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.title("月牙形二分类数据集(噪声0.4)")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.show()
print("图例说明:两种颜色代表两个类别,噪声使类别边界无明显线性分隔")

# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)
print(f"\n数据集划分完成:训练集{len(x_train)}个样本,测试集{len(x_test)}个样本")

# ====================== AdaBoost分类器 ======================
print("\n===== AdaBoost(自适应提升) =====")
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

# 初始化AdaBoost(新版参数estimator,替换旧版base_estimator)
# 若sklearn版本<1.2,可改回base_estimator
ada_clf = AdaBoostClassifier(
    estimator=DecisionTreeClassifier(max_leaf_nodes=16),  # 适配新版参数
    n_estimators=100
)
# 训练模型
ada_clf.fit(x_train, y_train)
# 评估准确率
ada_acc = ada_clf.score(x_test, y_test)
print(f"AdaBoost测试集准确率:{ada_acc:.3f}")

# ====================== Gradient Boosting(梯度提升) ======================
print("\n===== Gradient Boosting(梯度提升) =====")
from sklearn.ensemble import GradientBoostingClassifier

# 初始化梯度提升分类器
gb_clf = GradientBoostingClassifier(n_estimators=100)
# 训练模型
gb_clf.fit(x_train,y_train)
# 评估准确率
gb_acc = gb_clf.score(x_test,y_test)
print(f"梯度提升测试集准确率:{gb_acc:.3f}")

# 对比输出
print(f"\n===== 模型对比 =====")
print(f"AdaBoost准确率:{ada_acc:.3f} | 梯度提升准确率:{gb_acc:.3f}")
print("结论:梯度提升通过拟合残差,在该噪声数据集上表现优于AdaBoost")

总结

  1. Boosting核心特性串行集成策略,弱分类器依次训练,后一个分类器聚焦前一个的错误(AdaBoost调整样本权重,梯度提升拟合残差),最终组合成强分类器。
  2. AdaBoost vs 梯度提升:AdaBoost关注"错误样本权重",梯度提升关注"预测残差",梯度提升在含噪声的非线性数据集上通常泛化能力更强。
  3. 关键参数n_estimators控制弱分类器数量(平衡拟合能力与过拟合),max_leaf_nodes/max_depth限制基决策树复杂度(保证弱分类器特性)。
  4. 与Bagging对比:Boosting串行训练易过拟合但拟合能力强,Bagging并行训练泛化能力强但拟合能力稍弱,二者是集成学习的两大核心方向。

运行结果

===== 月牙形数据集可视化 =====
图例说明:两种颜色代表两个类别,噪声使类别边界无明显线性分隔

数据集划分完成:训练集750个样本,测试集250个样本

===== AdaBoost(自适应提升) =====
AdaBoost测试集准确率:0.816

===== Gradient Boosting(梯度提升) =====
梯度提升测试集准确率:0.860

===== 模型对比 =====
AdaBoost准确率:0.816 | 梯度提升准确率:0.860
结论:梯度提升通过拟合残差,在该噪声数据集上表现优于AdaBoost

进程已结束,退出代码为 0

在这里插入图片描述

更多推荐