K-ближайший сосед с непрерывными и двоичными переменными


10

У меня есть набор данных с колонками a b c(3 атрибута). aявляется числовым и непрерывным в то время как bи cявляются категориальными каждый с двумя уровнями. Я использую метод K-Nearest Neighbours для классификации aи bдалее c. Таким образом, чтобы иметь возможность измерять расстояния, я преобразовываю свой набор данных, удаляя bи добавляя b.level1и b.level2. Если наблюдение iимеет первый уровень в bкатегориях, b.level1[i]=1и b.level2[i]=0.

Теперь я могу измерять расстояния в моем новом наборе данных: a b.level1 b.level2

С теоретической / математической точки зрения: Можете ли вы выполнить K-ближайший сосед (KNN) с двоичными и непрерывными данными?

Я использую FNNпакет в R и функциюknn()


У меня почти нет опыта работы с KNN, но я не понимаю, как бинарная переменная могла бы сильно помочь в установлении расстояний. Мне любопытно, почему вы склоняетесь к такому подходу.
rolando2

Потому что я не вижу лучшего способа сравнить числовую переменную с категориальной переменной. Не стесняйтесь предложить лучший подход :)
k.dkhk

Ответы:


11

Это нормально, объединяя категориальные и непрерывные переменные (функции).

Каким-то образом, нет большого теоретического обоснования для такого метода, как k-NN. Эвристика заключается в том, что если две точки близки друг к другу (согласно некоторому расстоянию), то они имеют что-то общее с точки зрения выхода. Может быть да, а может быть и нет. И это зависит от расстояния, которое вы используете.

В вашем примере вы определяете расстояние между двумя точками и такими как:(a,b,c)(a,b,c)

  • возьмите квадратное расстояние между и :aa(aa)2
  • Добавьте +2, если и разные, +0, если равны (потому что вы считаете разницу в 1 для каждой категории)bb
  • Добавьте +2, если и разные, +0 равно (то же самое)cc

Это соответствует приданию весов неявно каждой функции.

Обратите внимание, что если принимает большие значения (например, 1000, 2000 ...) с большой дисперсией, то вес двоичных объектов будет незначительным по сравнению с весом . Только расстояние между и действительно будет иметь значение. И наоборот: если принимает небольшие значения, такие как 0,001: учитываются только двоичные объекты.aaaaa

Вы можете нормализовать поведение, взвесив: разделив каждую особенность на ее стандартное отклонение. Это относится как к непрерывным, так и к двоичным переменным. Вы также можете указать свои предпочтительные веса.

Обратите внимание, что функция R kNN () делает это за вас: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

В качестве первой попытки просто используйте в основном norm = true (нормализация). Это позволит избежать большинства бессмысленных ситуаций, которые могут возникнуть при объединении непрерывных и категориальных функций.


хороший ответ (+1), однако, вы можете упомянуть, если размерность велика, и есть много дискретных переменных, то кнк с евклидовым расстоянием может не сработать.
Haitao Du

6

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

Результаты будут в значительной степени проинформированы бинарными расщеплениями относительно дисперсии среди реальных значений (для масштабированных 0-1 невзвешенных векторов), как показано ниже:

Разделение вещественных и двоичных переменных

В этом примере вы можете видеть, что ближайшие соседи отдельного наблюдения по расстоянию будут НАМНОГО более сильно информированы двоичной переменной, чем масштабированной переменной действительного значения.

Кроме того, это распространяется на несколько двоичных переменных - если мы заменим одну из вещественных переменных на двоичную, мы увидим, что расстояния будут гораздо более информированными при сопоставлении по всем задействованным двоичным переменным, чем при приближении к действительным значениям:

Разделение вещественных и двоичных переменных

Вы захотите включить только критические двоичные переменные - фактически вы спрашиваете «обо всех наблюдениях, которые соответствуют этой конфигурации двоичных переменных (если таковые имеются), которые имеют ближайшие реальные значения?» Это разумная формулировка многих проблем, которые можно решить с помощью KNN, и очень плохая формулировка других проблем.

#code to reproduce plots:
library(scatterplot3d) 

scalevector <- function(x){(x-min(x))/(max(x)-min(x))}

x <- scalevector(rnorm(100))
y <- scalevector(rnorm(100))
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')

x <- scalevector(rnorm(100))
y <- ifelse(sign(rnorm(100))==-1, 0, 1)
z <- ifelse(sign(rnorm(100))==-1, 0, 1)
df <- data.frame(cbind(x,y,z))

scatterplot3d(df$x, df$z, df$y, pch=16, highlight.3d=FALSE,
              type="h", angle =235, xlab='', ylab='', zlab='')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.