Почему алгоритм KNN в Scikit не работает должным образом? - PullRequest
1 голос
/ 24 апреля 2019

Я строю простую модель KNN в python, используя scikit learn.Я протестировал его на наборе данных вина из 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 делает что-то по-другому.

Есть ли что-то в реализации KNeighborsClassifier Я пропустил?

1 Ответ

0 голосов
/ 24 апреля 2019

При использовании knn.kneighbors(), если вы не используете параметр X, он использует тренировочные данные (материал в self), используемые для подгонки модели, и исключает текущую точку из возможного набора соседей.,Однако, когда вы используете knn.predict, он не может исключить точку, поскольку не знает, что это та же точка (может быть какое-то другое вино, имеющее те же точные характеристики).Попробуйте вместо этого использовать knn.kneighbors(wine) при создании собственного предиктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...