为什么scikit中的KNN算法没有按预期工作?

问题描述 投票:1回答:1

我正在使用scikit learn在python中构建一个简单的KNN模型。我在UCI的葡萄酒数据集上测试了它,我注意到.predict()函数返回的结果不是邻居的多数类。

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()函数的算法,并且从返回的列表中选择多数类,就像它应该做的那样。第三列是邻居列表。

正如您所看到的,来自KNeighborsClassifier的predict()正在采取不同的做法。

有什么关于KNeighborsClassifier的实施,我失踪了吗?

scikit-learn knn
1个回答
0
投票

当使用knn.kneighbors()时,如果不使用X参数,它会使用用于拟合模型的训练数据(self中的东西),并且它会从可能的邻居集中排除当前点。但是,当你使用knn.predict时,它不能排除这一点,因为它不知道它是相同的点(可能是其他一些具有相同确切特征的葡萄酒)。在构建自己的预测器时,请尝试使用knn.kneighbors(wine)

© www.soinside.com 2019 - 2024. All rights reserved.