如何可视化 k 最近邻分类器的测试样本?
Posted
技术标签:
【中文标题】如何可视化 k 最近邻分类器的测试样本?【英文标题】:How can I visualize the test samples of k nearest neighbour classifier? 【发布时间】:2021-03-23 22:24:16 【问题描述】:我想可视化 4 个 k-NN 分类器的测试样本。我已经搜索过了,但我找不到任何东西。你能帮我实现代码吗?
这是我目前的代码,
from sklearn.datasets import make_moons
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
from sklearn.neighbors import KNeighborsClassifier
X, y = make_moons(n_samples=100, noise=0.3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.04, random_state=42)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
通过 1×4 轴图形。对于每个轴,我想可视化训练样本、相应的测试样本(用“+”标记表示)以及该样本的最近 k 个邻居(用绿色边框颜色表示)。每个轴的标题应说明预测类别。
【问题讨论】:
【参考方案1】:为此,您基本上需要重建 KNN 算法本身,因为它不会跟踪用于对给定样本进行预测的“邻居”。
您将如何做到这一点取决于 KNN 算法使用的距离度量。
例如,您可以定义一个函数来根据L1
(曼哈顿距离)获取最近的邻居,如下所示:
def get_neighbors(xs, sample, k=5):
neighbors = [(x, np.sum(np.abs(x - sample))) for x in xs]
neighbors = sorted(neighbors, key=lambda x: x[1])
return np.array([x for x, _ in neighbors[:k]])
xs
是您的训练集,sample
是您要进行预测的点。
现在您可以通过在图上分散训练点、测试点和邻居来轻松地对其进行可视化。
_, ax = plt.subplots(nrows=1, ncols=4, figsize=(15, 5))
for i in range(4):
sample = X_test[i]
neighbors = get_neighbors(X_train, sample, k=5)
ax[i].scatter(X_train[:, 0], X_train[:, 1], c="skyblue")
ax[i].scatter(neighbors[:, 0], neighbors[:, 1], edgecolor="green")
ax[i].scatter(sample[0], sample[1], marker="+", c="red", s=100)
ax[i].set(xlim=(-2, 2), ylim=(-2, 2))
plt.tight_layout()
您可以通过向scatter
方法添加适当的参数来随意设置它的样式。请注意,我在这里通过设置xlim
和ylim
对其进行剪切,您也可以更改这些,但要注意保持x 和y 轴之间的1:1 比例,否则邻居可能看起来不正确。
【讨论】:
非常感谢!你的回答真的很清楚。我学到了很多东西以上是关于如何可视化 k 最近邻分类器的测试样本?的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试实现 GridSearchCV 来调整 K 最近邻分类器的参数