集成学习算法
目录
1.必要的导入
2.Bagging集成
3.基于matplotlib写一个函数对决策边界做可视化
4.总结图中结论
5.扩展说明
1.必要的导入
# To support both python 2 and python 3
from __future__ import division, print_function, unicode_literals
# Common imports
import numpy as np
import os
# to make this notebook's output stable across runs
np.random.seed(42)
# To plot pretty figures
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# Where to save the figures
PROJECT_ROOT_DIR = "."
CHAPTER_ID = "ensembles"
2.Bagging集成
本例中没有用到外部数据集,先基于make_moons自建数据集(make_moons 是一个用于快速生成简单而具有说明性数据集的有价值工具)
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=500, noise=0.30, random_state=42) # 创建make_moon数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 将创建好的数据集划分为训练集和测试集
BaggingClassifier(
base_estimator=None, #基学习器,默认是决策树
n_estimators=10, #基学习器的数量
*,
max_samples=1.0, #构建每个基学习器时从原始训练集中抽取的样本比例(如果为浮点数)或数量(如果为整数)。如果为 1.0,则使用全部样本。小于 1.0 的值会导致有放回抽样(bootstrap sampling)。
max_features=1.0, #构建每个基学习器时从原始特征集中抽取的特征比例(如果为浮点数)、数量(如果为整数)或根据某些策略(如 'auto'、'sqrt'、'log2')选择。如果为 1.0,则使用全部特征。
bootstrap=True, #是否对每个基学习器使用有放回抽样
bootstrap_features=False, #是否对每个基学习器使用特征的有放回抽样
oob_score=False, #是否使用袋外样本来评估模型的泛化性能
warm_start=False, #是否在上一次训练的基础上继续训练基学习器
n_jobs=None, #并行运行的作业数
random_state=None, #随机数种子
verbose=0, # 大于0则打印进度和性能信息
)
如果想尝试Pasting,就设置bootstrap=False
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
# TODO:利用BaggingClassifier构建集成学习,base_estimator设置为DecisionTreeClassifier,n_estimators=500,max_samples=100
bag_clf = BaggingClassifier(
DecisionTreeClassifier(random_state=42), n_estimators=500,
max_samples=100, bootstrap=True, n_jobs=-1, random_state=42) # bootstrap:设置是否有放回的参数,若为True则为Bagging,否则Pasting
# TODO: 模型训练
bag_clf.fit(X_train, y_train)
# TODO: 测试
y_pred = bag_clf.predict(X_test)
与不进行集成的单棵树进行对比
从准确率上看,好像提升不是很明显。 但集成学习不仅仅提高了准确率,更提高了模型的泛化能力。
3.基于matplotlib写一个函数对决策边界做可视化
from matplotlib.colors import ListedColormap
# 绘制决策树边界
def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.5, -1, 1.5], alpha=0.5, contour=True):
x1s = np.linspace(axes[0], axes[1], 100)
x2s = np.linspace(axes[2], axes[3], 100)
x1, x2 = np.meshgrid(x1s, x2s)
X_new = np.c_[x1.ravel(), x2.ravel()]
y_pred = clf.predict(X_new).reshape(x1.shape)
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap) # 将模型的预测值y_pred作为等高线的高度值来绘制决策
if contour:
custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
plt.axis(axes)
plt.xlabel(r"$x_1$", fontsize=18)
plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
对plot_decision_boundary函数的说明:
函数设计思路详细说明
- 生成网格数据:
- 使用 np.linspace 生成两个特征的网格数据 x1s 和 x2s。
- 通过 np.meshgrid 生成网格点的组合 x1 和 x2。
- 预测网格点的类别:
- 将网格点组合成 X_new,并使用分类器 clf 进行预测,得到预测结果 y_pred。
- 将 y_pred reshape 成与 x1 相同的形状,以便绘制等高线图。
- 绘制决策边界:
- 使用 plt.contourf 绘制填充的决策边界,颜色映射由 custom_cmap 控制。
- 可选地使用 plt.contour 绘制边界线,颜色映射由 custom_cmap2 控制。
- 绘制数据点:
- 根据类别 y 绘制数据点,用不同的标记和颜色表示不同的类别。
- 设置图形属性:
- 设置坐标轴范围、标签等。
如何在其他决策树边界绘制问题中使用或修改此函数
- 通用性:
- 该函数是一个通用的模板,适用于任何基于 scikit-learn 的分类器,只要分类器具有 predict 方法,并且数据是二维的。
- 适用范围:
- 适用于二分类问题。如果处理多分类问题,可能需要调整颜色映射和绘图逻辑。
- 参数调整:
- 数据维度:如果数据不是二维的,需要进行降维(例如使用 PCA 或 LDA)或选择两个特征进行绘制。
- 分类器兼容性:确保分类器具有 predict 方法,并且能够处理二维输入数据。
- 坐标轴范围 (axes):根据数据的特征范围调整 axes 参数,以确保决策边界和数据点在图中可见。
- 颜色映射 (custom_cmap 和 custom_cmap2):如果类别数多于两个,可能需要修改颜色映射以适应更多的类别。
- 数据点绘制的修改:
- 如果类别的标签不是 0 和 1,需要修改绘制数据点的部分,以正确区分不同的类别。
- 多分类问题的处理:
- 对于多分类问题,可以修改颜色映射和绘图逻辑,以正确显示多个类别的边界。
- 其他修改:
- 可以根据需要修改 alpha 参数来调整透明度。
- 可以通过设置 contour=False 来关闭边界线的绘制。
plt.figure(figsize=(11,4))
plt.subplot(121)
# TODO: 绘制没有任何限制的决策树边界,可以看出模型严重过拟合
plot_decision_boundary(tree_clf, X, y)
plt.title("Decision Tree", fontsize=14)
plt.subplot(122)
# TODO: 绘制通过装袋集成的决策树边界,可以看出集成后的模型泛化能力明显提升
plot_decision_boundary(bag_clf, X, y)
plt.title("Decision Trees with Bagging", fontsize=14)
plt.show()
4.总结图中结论
返回的可视化结果比较了两种决策边界,左图是单个决策树,右图是500个决策树组成的bagging集成,均在make_moon数据集上训练完成。可以看出,集成预测的泛化效果比单独的决策树要好;二者偏差相近,但是bagging集成的方差更小(两边训练集上的错误数量差不多,但集成的决策边界更规则。
5.扩展说明
袋外评估 Out-of-Bag(oob)
对于任意给定的预测器,使用bagging,有些实例可能会被采样多次,而有些实例则可能根本不被采样。默认采样m个训练实例,随着m的增长,平均只会对63%的训练实例进行采样
剩下的37%个没有被采样的训练实例就叫做袋外数据Out-of-Bag(oob)实例。注意对于每一个的分类器它们的37%不是相同的。每个学习器可以使用这部分数据来进行评估(原始的是对每个训练子集提取部分作为测试集,或者使用交叉验证),这样可以用来训练每个学习器的训练数据就变多了。从下面的代码也可以看出训练结果变好了。
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,bootstrap=True,
n_jobs=-1, oob_score=True)
bag_clf.fit(X_train, y_train)
6.算法小结
Bagging 算法的应用场景和知识概念小结
1. Bagging 算法的核心概念
Bagging(Bootstrap Aggregating,自助聚合)是一种集成学习(Ensemble Learning)方法,旨在通过结合多个基学习器的预测结果来提高模型的稳定性和准确性。其核心思想是通过对训练数据进行有放回的随机采样(Bootstrap Sampling),生成多个子数据集,然后分别训练多个基学习器,最后将这些基学习器的预测结果进行聚合(如分类问题中的投票或回归问题中的平均)。
2. Bagging 的关键步骤
Bootstrap Sampling:从原始训练集中有放回地随机抽取样本,生成多个子数据集。
基学习器训练:在每个子数据集上独立训练一个基学习器(如决策树、支持向量机等)。
结果聚合:将所有基学习器的预测结果进行聚合(分类问题通常使用投票法,回归问题使用平均法)。
3. Bagging 的优点
降低方差:通过聚合多个模型的预测结果,减少模型的过拟合风险,尤其对高方差模型(如决策树)效果显著。
提高泛化能力:通过引入数据的随机性,增强模型的鲁棒性和泛化能力。
并行化训练:每个基学习器可以独立训练,适合分布式计算。
4. Bagging 的典型算法
-
随机森林(Random Forest):Bagging 的扩展,不仅对样本进行随机采样,还对特征进行随机选择,进一步增加模型的多样性。
5. Bagging 的应用场景
高方差模型的优化:如决策树、神经网络等容易过拟合的模型。
非平衡数据集:通过 Bootstrap Sampling 可以缓解数据分布不均衡的问题。
大规模数据集:适合分布式计算环境,能够高效处理大规模数据。
分类和回归问题:广泛应用于分类(如信用评分、图像分类)和回归(如房价预测、销量预测)任务。
6. Bagging 的局限性
对低偏差、高方差模型更有效:如果基学习器本身偏差较大,Bagging 的效果可能不明显。
计算成本较高:需要训练多个模型,计算资源和时间开销较大。
解释性较差:由于是多个模型的集成,最终模型的解释性较弱。
7. Bagging 与 Boosting 的区别
样本权重:Bagging 对样本进行随机采样,样本权重相同;Boosting 则根据前一轮模型的错误调整样本权重。
模型关系:Bagging 的基学习器是独立训练的;Boosting 的基学习器是顺序训练的,后一个模型依赖于前一个模型的结果。
目标:Bagging 主要降低方差,Boosting 主要降低偏差。
8. 总结
Bagging 是一种强大的集成学习方法,特别适用于高方差模型的优化和非平衡数据集的处理。通过引入数据的随机性和模型的多样性,Bagging 能够显著提高模型的稳定性和泛化能力。其典型应用包括随机森林等算法,广泛应用于分类、回归以及大规模数据集的建模任务。