我有一个多类分类问题,其中我使用 Scikit Learn 的 k 最近邻分类器(5 个类),这意味着 k 的奇数不会阻止分类关系。
那么 Scikit Learn 如何解决 k 最近邻分类中的关系呢?我似乎在互联网上的任何地方都找不到这个。
我需要这个来进行考试作业,因此非常感谢您提供快速答案,如果可能的话,您的知识来源:)
我有一个多类分类问题,其中我使用 Scikit Learn 的 k 最近邻分类器(5 个类),这意味着 k 的奇数不会阻止分类关系。
那么 Scikit Learn 如何解决 k 最近邻分类中的关系呢?我似乎在互联网上的任何地方都找不到这个。
我需要这个来进行考试作业,因此非常感谢您提供快速答案,如果可能的话,您的知识来源:)
警告:关于最近邻算法,如果发现两个邻居,邻居 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]
我们看到平局是如何解决的,不是分配最近邻的值,而是分配最低的类值。