K-vecino más cercano con variables continuas y binarias

10

Tengo un conjunto de datos con columnas a b c(3 atributos). aes numérica y continua, mientras que by cson categóricas cada uno con dos niveles. Estoy utilizando el método K-vecinos más cercano para clasificar ay bsobre c. Entonces, para poder medir las distancias, transformo mi conjunto de datos eliminando by agregando b.level1y b.level2. Si la observación itiene el primer nivel en las bcategorías, b.level1[i]=1y b.level2[i]=0.

Ahora puedo medir distancias en mi nuevo conjunto de datos: a b.level1 b.level2

Desde un punto de vista teórico / matemático: ¿Se puede realizar el vecino K más cercano (KNN) con datos binarios y continuos?

Estoy usando el FNNpaquete en R y la funciónknn()

k.dkhk
fuente
Casi no tengo experiencia en KNN, pero no veo cómo una variable binaria sería de mucha ayuda para establecer distancias. Tengo curiosidad por qué te inclinas hacia este enfoque.
rolando2
Porque no veo una mejor manera de comparar una variable numérica con una variable categórica. Siéntase libre de sugerir un mejor enfoque :)
k.dkhk

Respuestas:

11

Está bien combinar variables categóricas y continuas (características).

De alguna manera, no hay mucho fundamento teórico para un método como k-NN. La heurística es que si dos puntos están cerca uno del otro (de acuerdo con cierta distancia), entonces tienen algo en común en términos de salida. Tal vez sí tal vez no. Y depende de la distancia que uses.

En su ejemplo, define una distancia entre dos puntos y como:( a , b , c )(a,b,c)(a,b,c)

  • tomar la distancia al cuadrado entre y :a ( a - a ) 2aa(aa)2
  • Añadir 2 si y son diferentes, 0 si son iguales (porque se cuenta una diferencia de 1 para cada categoría)b bb
  • Agregue +2 si y son diferentes, +0 es igual (igual)c cc

Esto corresponde a dar pesos implícitamente a cada característica.

Tenga en cuenta que si toma valores grandes (como 1000, 2000 ...) con una gran variación, entonces los pesos de las características binarias serán insignificantes en comparación con el peso de a . Sólo la distancia entre una y una ' realmente importa. Y al revés: si a toma valores pequeños como 0.001: solo contarán las características binarias.aaaaa

Puede normalizar el comportamiento volviendo a pesar: dividiendo cada característica por su desviación estándar. Esto se aplica tanto a las variables continuas como a las binarias. También puede proporcionar sus propios pesos preferidos.

Tenga en cuenta que la función R kNN () lo hace por usted: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Como primer intento, simplemente use básicamente norma = verdadero (normalización). Esto evitará la mayoría de los sin sentido que pueden aparecer al combinar características continuas y categóricas.

Benoit Sanchez
fuente
buena respuesta (+1), sin embargo, puede mencionar si la dimensión es alta, y hay muchas variables discretas, knn con distancia euclidiana puede no funcionar bien.
Haitao Du
6

Sí, ciertamente puede usar KNN con datos binarios y continuos, pero hay algunas consideraciones importantes que debe tener en cuenta al hacerlo.

Los resultados van a estar fuertemente informados por las divisiones binarias en relación con la dispersión entre los resultados de valor real (para vectores escalados 0-1, no ponderados), como se ilustra a continuación:

Separación de variables reales y binarias.

Puede ver en este ejemplo que los vecinos más cercanos de una observación individual por distancia estarían MUCHO más informados por la variable binaria que por la variable de valor real escalada.

Además, esto se extiende a múltiples variables binarias: si cambiamos una de las variables de valor real a binario, podemos ver que las distancias serán mucho más informadas al coincidir en todas las variables binarias involucradas que en la cercanía de los valores reales:

Separación de variables reales y binarias.

Deberá incluir solo variables binarias críticas: en efecto, está preguntando "¿todas las observaciones que coinciden con esta configuración de variables binarias (si las hay), que tienen los valores reales más cercanos?" Esta es una formulación razonable de muchos problemas que podrían abordarse con KNN, y una formulación muy pobre de otros problemas.

#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='')
Thomas Cleberg
fuente