Постоянное получение разных прогнозов для небольшого набора данных при использовании KNN (k = 2) в R

Рассмотрим эту проблему регрессии со следующим обучающим набором:

введите здесь описание изображения

Я хочу предсказать предсказание 2 ближайших соседей для каждого объекта, однако каждый раз, когда я вызываю функцию knn, я получаю разные предсказания. Должно ли это быть так? Вот код, который я использую:

library(class)
test <- train <- matrix(c(-1, 0, 2, 3),,1)
cl <- c(0, 1, 2, 1)
knn(train, test, cl, k=2)

Выход:

> knn(train, test, cl, k=2)
[1] 1 1 2 2
Levels: 0 1 2
> knn(train, test, cl, k=2)
[1] 0 0 1 2
Levels: 0 1 2
> knn(train, test, cl, k=2)
[1] 1 1 1 2
Levels: 0 1 2
> knn(train, test, cl, k=2)
[1] 0 0 1 2
Levels: 0 1 2

Был бы очень признателен за любые разъяснения.


person v0vk    schedule 11.12.2015    source источник


Ответы (2)


Связи Inknn разбиваются случайным образом, и так, как вы это настроили, у вас всегда будет ровно одна правильная (точное совпадение) и одна неправильная метка (ближайшее совпадение) в голосовании, и, таким образом, результатом всегда является случайный выбор между фактической меткой и неправильный.

Вы можете убедиться в этом эмпирически, запустив эксперимент много раз и посмотрев на результаты — в каждой строке будет ровно два разных результата примерно в той же пропорции.

person Simon Urbanek    schedule 11.12.2015
comment
Ах, хорошо, это имеет смысл. Я работаю над упражнением в своей книге, в котором мне предлагается построить прогноз 2 ближайших соседей для каждого объекта по отношению к объекту (в R). Он не дает решений, но был бы я прав, предполагая, что для этого конкретного сценария будет несколько правильных сюжетов? - person v0vk; 11.12.2015
comment
Что ж, все сюжеты правильные ;). Но да, на таком небольшом тренировочном наборе прогноз будет различаться для каждого вызова, поскольку для k=2 будут связи, поэтому вы получите разные графики. - person Simon Urbanek; 11.12.2015
comment
Прохладный. Из любопытства, если бы я сделал это на бумаге вместо R, мои результаты по-прежнему сильно различались бы? Буду ли я по-прежнему выбирать ярлыки случайным образом? Машинное обучение — это не то, что я изучаю, поэтому я не совсем знаком с алгоритмом (пока), но я планирую изучить его более подробно завтра. - person v0vk; 11.12.2015
comment
Это зависит от того, как вы решите разорвать отношения. Алгоритм просто берет ближайшие строки (по евклидному расстоянию), просматривает их метки и выбирает наиболее часто встречающуюся. Для k=2 у вас всегда есть две метки, так что либо они одинаковы (и, следовательно, явный победитель), либо нет. Если это не так, то вам нужно принять какое-то решение — скажем, если вы решите всегда брать меньшее число, тогда вы получите последовательные результаты — но тогда вы также с большей вероятностью предскажете меньшие числа. R просто выбирает один случайным образом, чтобы у вас не было конкретной предвзятости в результате. - person Simon Urbanek; 11.12.2015

Несмотря на то, что код не работает, я предполагаю, что есть ничья, и в этом случае он выбирает случайным образом, поэтому вы видите разные результаты каждый раз, когда используете его. Выбор k=3 в этом случае предотвратит все ничьи и даст вам каждый раз один и тот же ответ.

person TBSRounder    schedule 11.12.2015
comment
Извините, проверьте редактирование, теперь оно работает. Я установил k = 3 и все равно получаю разные результаты, я не уверен, что не так - person v0vk; 11.12.2015
comment
k=3 не поможет: вы всегда получите 1 для последних двух строк, потому что единственная метка, которая встречается дважды (и, следовательно, может выиграть сразу), — это 1, и только последние две строки достаточно близки, чтобы выбрать обе. Первые две строки всегда будут иметь 3 разных метки и, таким образом, всегда будут случайным образом выбраны среди них. - person Simon Urbanek; 11.12.2015