K-più vicino-vicino con variabili continue e binarie


10

Ho un set di dati con colonne a b c(3 attributi). aè numerico e continuo mentre be csono categorici ciascuno con due livelli. Sto usando il metodo vicini K-Nearest per classificare ae bsu c. Quindi, per poter misurare le distanze trasformo il mio set di dati rimuovendo, baggiungendo b.level1e b.level2. Se l'osservazione iha il primo livello nelle bcategorie, b.level1[i]=1e b.level2[i]=0.

Ora posso misurare le distanze nel mio nuovo set di dati: a b.level1 b.level2

Da un punto di vista teorico / matematico: puoi eseguire il K-più vicino vicino (KNN) con dati sia binari che continui?

Sto usando il FNNpacchetto in R e la funzioneknn()


Non ho quasi nessuna esperienza KNN ma non vedo come una variabile binaria sarebbe di grande aiuto nello stabilire le distanze. Sono curioso di sapere perché ti inclini a questo approccio.
rolando2

Perché non vedo un modo migliore per confrontare una variabile numerica con una variabile categoriale. Sentiti libero di suggerire un approccio migliore :)
k.dkhk

Risposte:


11

Va bene combinando variabili categoriche e continue (caratteristiche).

In qualche modo, non c'è molto terreno teorico per un metodo come k-NN. L'euristica è che se due punti sono vicini l'uno all'altro (in base a una certa distanza), allora hanno qualcosa in comune in termini di output. Forse sì forse no. E dipende dalla distanza che usi.

Nel tuo esempio definisci una distanza tra due punti e come:(a,b,c)(a,b,c)

  • prendere la distanza al quadrato tra e :a ( a - a ) 2aa(aa)2
  • Aggiungi +2 se e sono diversi, +0 se uguale (perché conti una differenza di 1 per ogni categoria)b bb
  • Aggiungi +2 se e sono diversi, +0 è uguale (uguale)c cc

Ciò corrisponde a dare pesi implicitamente a ciascuna caratteristica.

Si noti che se assume valori elevati (come 1000, 2000 ...) con una grande varianza, i pesi delle caratteristiche binarie saranno trascurabili rispetto al peso di . Solo la distanza tra e avrà davvero importanza. E viceversa: se accetta valori piccoli come 0,001: verranno conteggiate solo le funzionalità binarie.a a a aaaaaa

Puoi normalizzare il comportamento ripesando: dividendo ogni caratteristica per la sua deviazione standard. Questo vale sia per variabili continue che binarie. Puoi anche fornire i tuoi pesi preferiti.

Nota che la funzione R kNN () lo fa per te: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Come primo tentativo, basta usare fondamentalmente norm = true (normalizzazione). Ciò eviterà la maggior parte del non senso che può apparire quando si combinano caratteristiche continue e categoriche.


buona risposta (+1), tuttavia, puoi menzionare se la dimensione è alta e ci sono molte variabili discrete, ma la distanza euclidea potrebbe non funzionare bene.
Haitao Du

6

Sì, puoi sicuramente usare KNN con dati sia binari che continui, ma ci sono alcune considerazioni importanti di cui dovresti essere consapevole quando lo fai.

I risultati saranno pesantemente informati dalle divisioni binarie relative alla dispersione tra i risultati a valore reale (per vettori in scala 0-1 non ponderati), come illustrato di seguito:

Separazione di variabili binarie e a valore reale

Si può vedere in questo esempio che i vicini più vicini di una singola osservazione per distanza sarebbero MOLTO più fortemente informati dalla variabile binaria che dalla variabile di valore reale in scala.

Inoltre, questo si estende a più variabili binarie: se cambiamo una delle variabili con valore reale in binario, possiamo vedere che le distanze saranno molto più informate abbinando su tutte le variabili binarie coinvolte che in prossimità dei valori reali:

Separazione di variabili binarie e a valore reale

Ti consigliamo di includere solo le variabili binarie critiche. In effetti, ti stai chiedendo "di tutte le osservazioni che corrispondono a questa configurazione di variabili binarie (se presenti), che hanno i valori reali più vicini?" Questa è una formulazione ragionevole di molti problemi che potrebbero essere affrontati con KNN e una formulazione molto scarsa di altri problemi.

#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='')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.