K-vizinho mais próximo com variáveis ​​contínuas e binárias

10

Eu tenho um conjunto de dados com colunas a b c(3 atributos). aé numérico e contínuo enquanto be csão categóricos, cada um com dois níveis. Eu estou usando o método Vizinhos K-Nearest to classificar ae bon c. Portanto, para poder medir as distâncias, eu transformo meu conjunto de dados removendo be adicionando b.level1e b.level2. Se a observação itiver o primeiro nível nas bcategorias, b.level1[i]=1e b.level2[i]=0.

Agora eu posso medir distâncias no meu novo conjunto de dados: a b.level1 b.level2

Do ponto de vista teórico / matemático: Você pode executar o K-vizinho mais próximo (KNN) com dados binários e contínuos?

Estou usando o FNNpacote em R e a funçãoknn()

k.dkhk
fonte
Não tenho quase nenhuma experiência com o KNN, mas não vejo como uma variável binária ajudaria muito no estabelecimento de distâncias. Estou curioso para saber por que você se inclina para essa abordagem.
Rolando2 31/03
Porque não vejo uma maneira melhor de comparar uma variável numérica com uma variável categórica. Sinta-se livre para sugerir uma abordagem melhor :)
k.dkhk

Respostas:

11

Tudo bem combinando variáveis ​​categóricas e contínuas (recursos).

De alguma forma, não há muito fundamento teórico para um método como o k-NN. A heurística é que, se dois pontos estão próximos um do outro (de acordo com alguma distância), eles têm algo em comum em termos de saída. Talvez sim, talvez não. E isso depende da distância que você usa.

No seu exemplo, você define uma distância entre dois pontos e ( a ' , b ' , c ' ) como:(uma,b,c)(uma,b,c)

  • calcule a distância ao quadrado entre e a : ( a - a ) 2umauma(uma-uma)2
  • Adicione +2 se e b forem diferentes, +0 se for igual (porque você conta a diferença de 1 para cada categoria)bb
  • Adicione +2 se e c forem diferentes, +0 é igual (igual)cc

Isso corresponde a atribuir pesos implicitamente a cada recurso.

Observe que se assume valores grandes (como 1000, 2000 ...) com grande variação, os pesos dos recursos binários serão desprezíveis em comparação com o peso de a . Somente a distância entre a e a ' será realmente importante. E o contrário: se um leva valores pequenos como 0,001: somente os recursos binários contam.umaumaumaumauma

Você pode normalizar o comportamento repensando: dividindo cada recurso pelo seu desvio padrão. Isso se aplica a variáveis ​​contínuas e binárias. Você também pode fornecer seus próprios pesos preferidos.

Observe que a função R kNN () faz isso por você: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Como primeira tentativa, basta usar basicamente norm = true (normalização). Isso evitará a maior parte do absurdo que possa aparecer ao combinar recursos contínuos e categóricos.

Benoit Sanchez
fonte
boa resposta (+1), no entanto, você pode mencionar se a dimensão é alta e há muitas variáveis ​​discretas, pois a distância euclidiana pode não funcionar bem.
Haitao Du
6

Sim, você certamente pode usar o KNN com dados binários e contínuos, mas há algumas considerações importantes das quais você deve estar ciente ao fazer isso.

Os resultados serão fortemente informados pelas divisões binárias relativas à dispersão entre os resultados com valor real (para 0-1 vetores dimensionados e não ponderados), conforme ilustrado abaixo:

Separação de variáveis ​​reais e binárias

Você pode ver neste exemplo que os vizinhos mais próximos de uma observação individual por distância seriam MUITO mais informados pela variável binária do que pela variável de valor real em escala.

Além disso, isso se estende a várias variáveis ​​binárias - se alterarmos uma das variáveis ​​com valor real para binário, podemos ver que as distâncias serão muito mais informadas pela correspondência em todas as variáveis ​​binárias envolvidas do que na proximidade dos valores reais:

Separação de variáveis ​​reais e binárias

Você desejará incluir apenas variáveis ​​binárias críticas - na verdade, você está perguntando "de todas as observações que correspondem a essa configuração de variáveis ​​binárias (se houver), que têm os valores reais mais próximos?" Esta é uma formulação razoável de muitos problemas que poderiam ser tratados com o KNN e uma formulação muito pobre de outros 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
fonte