在机器学习领域,AdaBoost(自适应增强)是一种集成学习算法,它通过组合多个弱分类器来构建一个强分类器。本文将介绍如何使用AdaBoost分类器对一个由两个“高斯分位数”簇组成的非线性可分数据集进行分类,并展示决策边界和决策分数的分布情况。
首先,构建了一个包含两个高斯分布的数据集,这两个高斯分布在二维空间中是重叠的,因此它们是非线性可分的。使用scikit-learn库中的make_gaussian_quantiles
函数来生成这样的数据集。接着,创建了一个AdaBoost分类器实例,它使用决策树桩作为基学习器,并设置了200个弱学习器。
在训练过程中,AdaBoost分类器会根据每个弱学习器的表现来调整样本权重,使得错误分类的样本在后续的学习中获得更高的权重。通过这种方式,AdaBoost能够逐渐提高分类器的性能。
训练完成后,使用DecisionBoundaryDisplay
类来绘制决策边界。决策边界是分类器用来区分不同类别的边界,它可以帮助直观地理解模型是如何对数据进行分类的。在本例中,决策边界将展示为一个二维空间中的曲线,其中一侧的点被分类为类别A,另一侧的点被分类为类别B。
此外,还绘制了决策分数的分布图。决策分数是每个样本属于其预测类别的程度的度量。在图中,可以看到类别A和类别B的决策分数分布。对于类别B,可以通过选择决策分数高于某个阈值的样本来构建一个纯净度更高的数据集。
以下是实现上述过程的Python代码示例:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_gaussian_quantiles
from sklearn.ensemble import AdaBoostClassifier
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.tree import DecisionTreeClassifier
# 构建数据集
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))
# 创建并训练AdaBoost分类器
bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200)
bdt.fit(X, y)
# 绘制决策边界
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), ["A", "B"], ["b", "r"]):
idx = np.where(y == i)
plt.scatter(X[idx, 0], X[idx, 1], c=c, 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")
# 绘制两类决策分数
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), ["A", "B"], ["b", "r"]):
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()