Scikit Learn 如何解决 KNN 分类中的关系?

机器算法验证 自习 分类 scikit-学习 k-最近邻
2022-04-12 11:04:45

我有一个多类分类问题,其中我使用 Scikit Learn 的 k 最近邻分类器(5 个类),这意味着 k 的奇数不会阻止分类关系。

那么 Scikit Learn 如何解决 k 最近邻分类中的关系呢?我似乎在互联网上的任何地方都找不到这个。

我需要这个来进行考试作业,因此非常感谢您提供快速答案,如果可能的话,您的知识来源:)

2个回答

文档中KNeighborsClassifier

警告:关于最近邻算法,如果发现两个邻居,邻居 k+1 和 k,具有相同的距离但不同的标签,结果将取决于训练数据的排序。

要准确了解会发生什么,我们必须查看源代码。您可以看到,在未加权的情况下,KNeighborsClassifier.predict 最终调用 scipy.stats.mode,其文档说

返回传递数组中模态(最常见)值的数组。

如果有多个这样的值,则只返回第一个。

因此,在平局的情况下,答案将是恰好出现在邻居集中的类。

再深入一点,使用的neigh_ind数组是调用方法kneighbors结果,它(尽管文档没有这么说)似乎以排序的顺序返回结果所以应该通过选择最接近查询点的类来打破联系,但是这种行为没有记录在案,我也不是 100% 确定它总是会发生。

这个答案只是用一个简短的例子来展示 sklearn 如何解决 kNN 中选择具有最低值的类的关系:

from sklearn.neighbors import KNeighborsClassifier
import numpy as np

# We start defining 4 points in a 1D space: x1=10, x2=11, x3=12, x4=13
x = np.array([10,11,12,13]).reshape(-1,1)   # reshape is needed as long as is 1D

# We assign different classes to the points
y = np.array([0,1,1,2])

# we fit a 2-NN classifier
knn = KNeighborsClassifier(n_neighbors=2 , weights='uniform')
knn.fit(x, y)

# We try to predict samples with 5 and 15 values (it will be a tie in both cases) 
x_test=np.array([5,15]).reshape(-1,1)
pred = knn.predict(x_test)
print(pred)

#[0 1]

我们看到平局是如何解决的,不是分配最近邻的值,而是分配最低的类值。