11-6-串行策略:Boosting(详细注释版)
一、完整注释版代码(Jupyter Notebook格式)
基础库导入
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
)
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.show()
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)
AdaBoost
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
ada_clf = AdaBoostClassifier(
base_estimator=DecisionTreeClassifier(max_leaf_nodes=16),
n_estimators=100
)
ada_clf.fit(x_train, y_train)
ada_clf.score(x_test, y_test)
Gradient Boosting
from sklearn.ensemble import GradientBoostingClassifier
gb_clf = GradientBoostingClassifier(
n_estimators=100
)
gb_clf.fit(x_train,y_train)
gb_clf.score(x_test,y_test)
二、核心知识点梳理
1. Boosting核心概念(与Bagging对比)
| 维度 | Boosting(串行策略) | Bagging(并行策略) |
|---|
| 训练方式 | 串行:弱分类器依次训练,后一个分类器聚焦前一个的错误样本 | 并行:弱分类器独立训练,无依赖关系 |
| 核心思想 | 逐步修正错误:通过调整样本权重/拟合残差提升性能 | 投票平均:通过样本随机化降低过拟合 |
| 权重分配 | 对错误样本/效果好的分类器赋予更高权重 | 所有分类器权重均等(硬投票)或按概率(软投票) |
| 过拟合风险 | 较高(串行聚焦错误样本,易过度拟合) | 较低(并行平均,分散风险) |
| 代表算法 | AdaBoost、Gradient Boosting(GB)、XGBoost、LightGBM | 随机森林、Extra-Trees |
2. AdaBoost关键参数与原理
| 类/参数 | 所属库 | 作用 | 核心原理 |
|---|
AdaBoostClassifier | sklearn.ensemble | AdaBoost分类器 | 1. 初始化样本权重均等;2. 训练弱分类器,计算错误率;3. 提高错误样本权重;4. 重复训练,加权组合所有分类器 |
base_estimator/estimator | AdaBoost参数 | 指定弱基分类器(如决策树) | 弱分类器需简单(易过拟合),通过Boosting组合成强分类器 |
n_estimators | AdaBoost参数 | 弱分类器数量 | 数量越多,模型拟合能力越强(但易过拟合) |
max_leaf_nodes | 决策树参数 | 限制决策树叶节点数 | 防止弱分类器过拟合,保证"弱"的特性 |
3. Gradient Boosting关键参数与原理
| 类/参数 | 所属库 | 作用 | 核心原理 |
|---|
GradientBoostingClassifier | sklearn.ensemble | 梯度提升分类器 | 1. 初始化基准模型(如均值);2. 计算残差(真实值-预测值);3. 训练弱分类器拟合残差;4. 更新模型,重复迭代 |
n_estimators | GB参数 | 弱分类器数量 | 控制迭代次数,默认100(平衡拟合能力与过拟合) |
learning_rate | GB参数(默认0.1) | 学习率:每棵树的贡献权重 | 越小越稳定(需更多n_estimators),越大收敛越快(易过拟合) |
max_depth | GB参数(默认3) | 基决策树的最大深度 | 限制单棵树复杂度,防止过拟合 |
4. 数据集与模型评估
| 函数/方法 | 作用 | 关键说明 |
|---|
make_moons | 生成月牙形二分类数据集 | 非线性可分,适合测试Boosting效果 |
train_test_split | 划分训练/测试集 | 75%训练、25%测试,保证模型泛化性评估 |
score() | 计算分类准确率 | 正确预测数/总样本数,直观评估模型性能 |
plt.scatter | 可视化数据集 | 按标签着色,直观展示类别分布和噪声 |
三、可直接运行的代码版本
版本1:Jupyter Notebook版(已在上方完整给出,可直接复制运行)
版本2:PyCharm版(无if name == ‘main’,可直接复制运行)
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)}个样本")
print("\n===== AdaBoost(自适应提升) =====")
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
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}")
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")
总结
- Boosting核心特性:串行集成策略,弱分类器依次训练,后一个分类器聚焦前一个的错误(AdaBoost调整样本权重,梯度提升拟合残差),最终组合成强分类器。
- AdaBoost vs 梯度提升:AdaBoost关注"错误样本权重",梯度提升关注"预测残差",梯度提升在含噪声的非线性数据集上通常泛化能力更强。
- 关键参数:
n_estimators控制弱分类器数量(平衡拟合能力与过拟合),max_leaf_nodes/max_depth限制基决策树复杂度(保证弱分类器特性)。 - 与Bagging对比:Boosting串行训练易过拟合但拟合能力强,Bagging并行训练泛化能力强但拟合能力稍弱,二者是集成学习的两大核心方向。
运行结果
===== 月牙形数据集可视化 =====
图例说明:两种颜色代表两个类别,噪声使类别边界无明显线性分隔
数据集划分完成:训练集750个样本,测试集250个样本
===== AdaBoost(自适应提升) =====
AdaBoost测试集准确率:0.816
===== Gradient Boosting(梯度提升) =====
梯度提升测试集准确率:0.860
===== 模型对比 =====
AdaBoost准确率:0.816 | 梯度提升准确率:0.860
结论:梯度提升通过拟合残差,在该噪声数据集上表现优于AdaBoost
进程已结束,退出代码为 0

所有评论(0)