为什么 scikit 中的 KNN 算法没有按预期工作?
Why is KNN algorithm in scikit not working as expected?
我正在使用 scikit learn 在 python 中构建一个简单的 KNN 模型。我在 UCI 的葡萄酒数据集上测试了它,我注意到 .predict()
函数返回的结果不是大多数 class 的邻居。
knn = KNeighborsClassifier(n_neighbors=3,weights='uniform')
knn.fit(wine,class_wine)
predictions = list(knn.predict(wine))
# S is array I've made that chooses majority class from neighbors of each instance
a = list(zip(predictions,list(S)))
for i in range(0,len(wine)):
if(predictions[i]!=S[i]):
print(predictions[i],S[i],class_wine[knn.kneighbors()[1][i].tolist()].tolist())
输出如下所示:
1.0 3.0 [3.0, 2.0, 3.0]
1.0 2.0 [1.0, 2.0, 2.0]
1.0 2.0 [1.0, 2.0, 2.0]
1.0 3.0 [3.0, 1.0, 3.0]
3.0 2.0 [2.0, 3.0, 2.0]
第一列是 scikit 算法的预测,第二列是我使用 kneighbors() 函数的算法,它从返回的列表中选择多数 class,因为它应该这样做。第三列是邻居列表。
如您所见,KNeighborsClassifier
中的 predict() 正在做一些不同的事情。
是否有关于 KNeighborsClassifier
的实现的问题?
使用knn.kneighbors()
时,如果不使用X参数,则使用拟合模型的训练数据(self
中的东西),排除当前点来自可能的邻居集。但是,当您使用 knn.predict
时,它无法排除该点,因为它不知道它是同一个点(可能是其他具有完全相同特征的葡萄酒)。在构建您自己的预测器时尝试使用 knn.kneighbors(wine)
。
我正在使用 scikit learn 在 python 中构建一个简单的 KNN 模型。我在 UCI 的葡萄酒数据集上测试了它,我注意到 .predict()
函数返回的结果不是大多数 class 的邻居。
knn = KNeighborsClassifier(n_neighbors=3,weights='uniform')
knn.fit(wine,class_wine)
predictions = list(knn.predict(wine))
# S is array I've made that chooses majority class from neighbors of each instance
a = list(zip(predictions,list(S)))
for i in range(0,len(wine)):
if(predictions[i]!=S[i]):
print(predictions[i],S[i],class_wine[knn.kneighbors()[1][i].tolist()].tolist())
输出如下所示:
1.0 3.0 [3.0, 2.0, 3.0]
1.0 2.0 [1.0, 2.0, 2.0]
1.0 2.0 [1.0, 2.0, 2.0]
1.0 3.0 [3.0, 1.0, 3.0]
3.0 2.0 [2.0, 3.0, 2.0]
第一列是 scikit 算法的预测,第二列是我使用 kneighbors() 函数的算法,它从返回的列表中选择多数 class,因为它应该这样做。第三列是邻居列表。
如您所见,KNeighborsClassifier
中的 predict() 正在做一些不同的事情。
是否有关于 KNeighborsClassifier
的实现的问题?
使用knn.kneighbors()
时,如果不使用X参数,则使用拟合模型的训练数据(self
中的东西),排除当前点来自可能的邻居集。但是,当您使用 knn.predict
时,它无法排除该点,因为它不知道它是同一个点(可能是其他具有完全相同特征的葡萄酒)。在构建您自己的预测器时尝试使用 knn.kneighbors(wine)
。