K-nächster Nachbar mit stetigen und binären Variablen


10

Ich habe einen Datensatz mit Spalten a b c(3 Attribute). aist dabei numerisch und stetig bund ckategorisch mit jeweils zwei Ebenen. Ich verwende die K-Nearest Neighbors-Methode zum Klassifizieren aund bWeiter c. Um die Entfernungen messen zu können, transformiere ich meinen Datensatz durch Entfernen bund Hinzufügen von b.level1und b.level2. Wenn die Beobachtung idie erste Ebene in den bKategorien hat, b.level1[i]=1und b.level2[i]=0.

Jetzt kann ich Entfernungen in meinem neuen Datensatz messen: a b.level1 b.level2

Aus theoretischer / mathematischer Sicht: Können Sie K-Nearest Neighbour (KNN) sowohl mit binären als auch mit kontinuierlichen Daten durchführen?

Ich benutze FNNPaket in R und die Funktionknn()


Ich habe so gut wie keine KNN-Erfahrung, aber ich sehe nicht, wie eine binäre Variable bei der Ermittlung von Entfernungen hilfreich sein könnte. Ich bin gespannt, warum Sie sich zu diesem Ansatz neigen.
Rolando2

Weil ich keinen besseren Weg sehe, eine numerische Variable mit einer kategorialen Variablen zu vergleichen. Fühlen Sie sich frei, einen besseren Ansatz
vorzuschlagen

Antworten:


11

Es ist in Ordnung, kategoriale und kontinuierliche Variablen (Features) zu kombinieren.

Irgendwie gibt es nicht viel theoretischen Grund für eine Methode wie k-NN. Die Heuristik ist, dass wenn zwei Punkte (je nach Entfernung) nahe beieinander liegen, sie in Bezug auf die Ausgabe etwas gemeinsam haben. Vielleicht ja vielleicht nein. Und es hängt von der Entfernung ab, die Sie verwenden.

In Ihrem Beispiel definieren Sie einen Abstand zwischen zwei Punkten und wie:( a ' , b ' , c ' )(a,b,c)(a,b,c)

  • nimm den quadratischen Abstand zwischen und :a ' ( a - a ' ) 2aa(aa)2
  • Addiere +2, wenn und unterschiedlich sind, +0, wenn gleich (weil du für jede Kategorie eine Differenz von 1 zählst)b 'bb
  • Addiere +2, wenn und unterschiedlich sind, +0 ist gleich (gleich)c 'cc

Dies entspricht der impliziten Angabe von Gewichten für jedes Merkmal.

Beachten Sie, dass wenn große Werte (wie 1000, 2000 ...) mit großer Varianz annimmt, die Gewichte von Binärmerkmalen im Vergleich zum Gewicht von vernachlässigbar sind . Nur der Abstand zwischen und wird wirklich wichtig sein. Und umgekehrt: Wenn kleine Werte wie 0,001 annimmt, zählen nur binäre Features.a a a ' aaaaaa

Sie können das Verhalten normalisieren, indem Sie erneut wiegen: Teilen Sie jedes Feature durch seine Standardabweichung. Dies gilt sowohl für kontinuierliche als auch für binäre Variablen. Sie können auch Ihre eigenen bevorzugten Gewichte angeben.

Beachten Sie, dass die R-Funktion kNN () dies für Sie erledigt: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Verwenden Sie als ersten Versuch einfach norm = true (Normalisierung). Dies vermeidet die meisten Unsinnigkeiten, die beim Kombinieren von fortlaufenden und kategorialen Merkmalen auftreten können.


Gute Antwort (+1) Sie können jedoch erwähnen, wenn die Dimension hoch ist und es viele diskrete Variablen gibt, die mit euklidischem Abstand bekannt sind und möglicherweise nicht gut funktionieren.
Haitao Du

6

Ja, Sie können KNN sicherlich sowohl mit binären als auch mit kontinuierlichen Daten verwenden, aber es gibt einige wichtige Überlegungen, die Sie dabei berücksichtigen sollten.

Die Ergebnisse werden stark von den binären Teilungen in Bezug auf die Streuung unter den reellen Ergebnissen (für 0-1 skalierte, ungewichtete Vektoren) beeinflusst, wie unten dargestellt:

Trennung von reellen und binären Variablen

Sie können in diesem Beispiel sehen, dass die nächsten Nachbarn einer einzelnen Beobachtung nach Entfernung VIEL stärker von der binären Variablen als von der skalierten Realwertvariablen beeinflusst werden.

Darüber hinaus erstreckt sich dies auf mehrere binäre Variablen. Wenn wir eine der reellen Variablen in binäre Variablen ändern, können wir sehen, dass die Abstände durch Abgleich aller beteiligten binären Variablen viel besser informiert werden als in der Nähe der reellen Werte:

Trennung von reellen und binären Variablen

Sie möchten nur kritische binäre Variablen einschließen - Sie fragen tatsächlich "nach allen Beobachtungen, die mit dieser Konfiguration von binären Variablen (falls vorhanden) übereinstimmen, die die nächsten reellen Werte haben?" Dies ist eine vernünftige Formulierung vieler Probleme, die mit KNN angegangen werden könnten, und eine sehr schlechte Formulierung anderer Probleme.

#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='')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.