我正在使用scikit Learn在python中构建一个简单的KNN模型。我在UCI的wine数据集上对其进行了测试,发现.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
的实现吗?
答案 0 :(得分:0)
使用knn.kneighbors()
时,如果不使用X参数,它将使用用于拟合模型的训练数据(self
中的内容),并从可能的邻居集合。但是,当您使用knn.predict
时,它不能排除该点,因为它不知道该点是同一点(可能是某些具有相同确切功能的其他葡萄酒)。构建自己的预测变量时,请尝试使用knn.kneighbors(wine)
。