K-plus proche voisin avec variables continues et binaires

10

J'ai un ensemble de données avec des colonnes a b c(3 attributs). aest numérique et continue tandis que bet csont catégoriques chacun avec deux niveaux. J'utilise la méthode K-Neighbors la plus proche de classer aet bsur c. Donc, pour pouvoir mesurer les distances, je transforme mon ensemble de données en supprimant bet en ajoutant b.level1et b.level2. Si l'observation ia le premier niveau dans les bcatégories, b.level1[i]=1et b.level2[i]=0.

Maintenant, je peux mesurer les distances dans mon nouvel ensemble de données: a b.level1 b.level2

D'un point de vue théorique / mathématique: Pouvez-vous effectuer K-plus proche voisin (KNN) avec des données binaires et continues?

J'utilise le FNNpackage dans R et la fonctionknn()

k.dkhk
la source
Je n'ai pratiquement aucune expérience KNN mais je ne vois pas comment une variable binaire serait d'une grande aide pour établir des distances. Je me demande pourquoi vous vous penchez vers cette approche.
rolando2
Parce que je ne vois pas de meilleure façon de comparer une variable numérique à une variable catégorielle. N'hésitez pas à suggérer une meilleure approche :)
k.dkhk

Réponses:

11

C'est correct de combiner des variables catégorielles et continues (fonctionnalités).

D'une certaine manière, il n'y a pas beaucoup de fondement théorique pour une méthode telle que k-NN. L'heuristique est que si deux points sont proches l'un de l'autre (selon une certaine distance), alors ils ont quelque chose en commun en termes de sortie. Peut-être que oui, peut-être que non. Et cela dépend de la distance que vous utilisez.

Dans votre exemple, vous définissez une distance entre deux points et tels que:(a,b,c)(a,b,c)

  • prendre la distance au carré entre et :aa(aa)2
  • Ajoutez +2 si et sont différents, +0 s'ils sont égaux (car vous comptez une différence de 1 pour chaque catégorie)bb
  • Ajouter +2 si et sont différents, +0 est égal (identique)cc

Cela correspond à donner implicitement des poids à chaque caractéristique.

Notez que si prend de grandes valeurs (comme 1000, 2000 ...) avec une grande variance, alors les poids des caractéristiques binaires seront négligeables par rapport au poids de . Seule la distance entre et importera vraiment. Et l'inverse: si prend de petites valeurs comme 0,001: seules les fonctionnalités binaires compteront.aaaaa

Vous pouvez normaliser le comportement en repesant: divisant chaque fonction par son écart-type. Cela s'applique aux variables continues et binaires. Vous pouvez également fournir vos propres poids préférés.

Notez que la fonction R kNN () le fait pour vous: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Dans un premier temps, utilisez simplement norm = true (normalisation). Cela évitera la plupart des non-sens qui peuvent apparaître lors de la combinaison de caractéristiques continues et catégorielles.

Benoit Sanchez
la source
bonne réponse (+1), cependant, vous pouvez mentionner si la dimension est élevée et qu'il existe de nombreuses variables discrètes, tricotées avec une distance euclidienne peut ne pas fonctionner correctement.
Haitao Du
6

Oui, vous pouvez certainement utiliser KNN avec des données binaires et continues, mais vous devez être conscient de certaines considérations importantes lorsque vous le faites.

Les résultats vont être fortement informés par les divisions binaires relatives à la dispersion entre les résultats à valeur réelle (pour les vecteurs non pondérés à l'échelle 0-1), comme illustré ci-dessous:

Séparation des variables réelles et binaires

Vous pouvez voir dans cet exemple que les voisins les plus proches d'une observation individuelle par la distance seraient BEAUCOUP plus informés par la variable binaire que par la variable de valeur réelle mise à l'échelle.

De plus, cela s'étend à plusieurs variables binaires - si nous changeons l'une des variables à valeur réelle en binaire, nous pouvons voir que les distances seront beaucoup plus informées en faisant correspondre toutes les variables binaires impliquées que dans la proximité des valeurs réelles:

Séparation des variables réelles et binaires

Vous voudrez n'inclure que les variables binaires critiques - vous demandez en fait "à toutes les observations qui correspondent à cette configuration de variables binaires (le cas échéant), qui ont les valeurs réelles les plus proches?" Il s'agit d'une formulation raisonnable de nombreux problèmes qui pourraient être traités avec KNN, et d'une formulation très médiocre d'autres problèmes.

#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
la source