简介
在本次实验中,我们将使用最近邻分类算法对二维空间中的数据点进行分类。我们将使用鸢尾花数据集,这是机器学习中常用的数据集。我们将可视化每个类别的决策边界,并观察在使用不同权重时算法的表现。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
导入必要的库
我们将首先导入必要的库,这些库包括来自 sklearn 的 matplotlib、seaborn、ListedColormap、datasets、neighbors 和 DecisionBoundaryDisplay。
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasets
from sklearn.inspection import DecisionBoundaryDisplay
加载鸢尾花数据集
然后,我们将使用 sklearn 的 datasets 模块中的 load_iris() 函数来加载鸢尾花数据集。
iris = datasets.load_iris()
准备数据
我们将只取用鸢尾花数据集的前两个特征,即萼片长度和萼片宽度。然后,我们会将数据拆分为特征矩阵 X 和目标向量 y。
X = iris.data[:, :2]
y = iris.target
定义颜色映射
我们将定义用于绘制决策边界和训练点的颜色映射。
cmap_light = ListedColormap(["orange", "cyan", "cornflowerblue"])
cmap_bold = ["darkorange", "c", "darkblue"]
可视化决策边界
我们将遍历两个不同的权重值,即“uniform”和“distance”,并为每个权重值绘制决策边界。我们将使用 neighbors 模块中的 KNeighborsClassifier 类来执行分类。
n_neighbors = 15
for weights in ["uniform", "distance"]:
## 创建一个邻居分类器实例并拟合数据
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(X, y)
## 绘制决策边界
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(
clf,
X,
cmap=cmap_light,
ax=ax,
response_method="predict",
plot_method="pcolormesh",
xlabel=iris.feature_names[0],
ylabel=iris.feature_names[1],
shading="auto",
)
## 绘制训练点
sns.scatterplot(
x=X[:, 0],
y=X[:, 1],
hue=iris.target_names[y],
palette=cmap_bold,
alpha=1.0,
edgecolor="black",
)
plt.title(
"3-Class classification (k = %i, weights = '%s')" % (n_neighbors, weights)
)
plt.show()
解读结果
我们可以观察到每个权重值对应的决策边界,以及算法在对数据点进行分类时的表现。“uniform”权重值假定所有邻居具有相等的权重,而“distance”权重值则为距离较近的邻居赋予更大的权重。我们可以看到,使用“distance”权重值时决策边界更平滑,这表明分类更准确。
总结
在本实验中,我们学习了如何使用最近邻分类算法对二维空间中的数据点进行分类。我们使用鸢尾花数据集来可视化每个类别的决策边界,并观察了在使用不同权重值时算法的表现。我们还学习了如何解读结果,并观察到“distance”权重值在对数据点进行分类时表现更好。