简介
这是一个关于如何使用 AdaBoost 训练决策树桩并对由两个高斯分位数簇组成的二维数据集进行分类的分步实验。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
This tutorial is from open-source community. Access the source code
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
这是一个关于如何使用 AdaBoost 训练决策树桩并对由两个高斯分位数簇组成的二维数据集进行分类的分步实验。
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
在这一步中,我们将导入本实验所需的库。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles
from sklearn.inspection import DecisionBoundaryDisplay
在这一步中,我们将使用 sklearn.datasets
模块中的 make_gaussian_quantiles
函数创建一个由两个高斯分位数簇组成的非线性可分分类数据集。我们还将把这两个簇连接起来并为它们分配标签。
X1, y1 = make_gaussian_quantiles(
cov=2.0, n_samples=200, n_features=2, n_classes=2, random_state=1
)
X2, y2 = make_gaussian_quantiles(
mean=(3, 3), cov=1.5, n_samples=300, n_features=2, n_classes=2, random_state=1
)
X = np.concatenate((X1, X2))
y = np.concatenate((y1, -y2 + 1))
在这一步中,我们将使用 sklearn.ensemble
模块中的 AdaBoostClassifier
类创建一个 AdaBoost 决策树。我们将使用决策树作为基估计器,并将 max_depth
参数设置为 1。我们还将把 algorithm
参数设置为 "SAMME",把 n_estimators
参数设置为 200。最后,我们将把分类器拟合到数据集上。
bdt = AdaBoostClassifier(
DecisionTreeClassifier(max_depth=1), algorithm="SAMME", n_estimators=200
)
bdt.fit(X, y)
在这一步中,我们将绘制决策边界和训练点。我们将使用 sklearn.inspection
模块中的 from_estimator
方法创建一个 DecisionBoundaryDisplay
对象,并传入 AdaBoost 分类器、数据集和其他参数。我们还将使用不同颜色绘制每个类别的训练点。
plot_colors = "br"
plot_step = 0.02
class_names = "AB"
plt.figure(figsize=(10, 5))
## 绘制决策边界
ax = plt.subplot(121)
disp = DecisionBoundaryDisplay.from_estimator(
bdt,
X,
cmap=plt.cm.Paired,
response_method="predict",
ax=ax,
xlabel="x",
ylabel="y",
)
x_min, x_max = disp.xx0.min(), disp.xx0.max()
y_min, y_max = disp.xx1.min(), disp.xx1.max()
plt.axis("tight")
## 绘制训练点
for i, n, c in zip(range(2), class_names, plot_colors):
idx = np.where(y == i)
plt.scatter(
X[idx, 0],
X[idx, 1],
c=c,
cmap=plt.cm.Paired,
s=20,
edgecolor="k",
label="Class %s" % n,
)
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.legend(loc="upper right")
plt.title("Decision Boundary")
在这一步中,我们将绘制二类决策分数。我们将使用 AdaBoost 分类器的 decision_function
方法来获取数据集中每个样本的决策分数。然后,我们将绘制每个类别的决策分数直方图。
## 绘制二类决策分数
twoclass_output = bdt.decision_function(X)
plot_range = (twoclass_output.min(), twoclass_output.max())
plt.subplot(122)
for i, n, c in zip(range(2), class_names, plot_colors):
plt.hist(
twoclass_output[y == i],
bins=10,
range=plot_range,
facecolor=c,
label="Class %s" % n,
alpha=0.5,
edgecolor="k",
)
x1, x2, y1, y2 = plt.axis()
plt.axis((x1, x2, y1, y2 * 1.2))
plt.legend(loc="upper right")
plt.ylabel("Samples")
plt.xlabel("Score")
plt.title("Decision Scores")
plt.tight_layout()
plt.subplots_adjust(wspace=0.35)
plt.show()
在这个实验中,我们学习了如何使用 AdaBoost 训练一个决策树桩,并对由两个高斯分位数簇组成的二维数据集进行分类。我们还学习了如何绘制分类器的决策边界和决策分数。