如何可视化 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 方法添加适当的参数来随意设置它的样式。请注意,我在这里通过设置xlimylim 对其进行剪切,您也可以更改这些,但要注意保持x 和y 轴之间的1:1 比例,否则邻居可能看起来不正确。

【讨论】:

非常感谢!你的回答真的很清楚。我学到了很多东西

以上是关于如何可视化 k 最近邻分类器的测试样本?的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试实现 GridSearchCV 来调整 K 最近邻分类器的参数

分类器以及归一化

分类器的选择

为啥逻辑回归分类器的准确率与 k 近邻不同? [关闭]

python用K近邻(KNN)算法分类MNIST数据集和Fashion MNIST数据集

KNN分类器(十折交叉验证)