K-najbliższy sąsiad ze zmiennymi ciągłymi i binarnymi

10

Mam zestaw danych z kolumnami a b c(3 atrybuty). ajest liczbowy i ciągły, ba jednocześnie cjest kategoryczny, każdy z dwoma poziomami. Używam K-Najbliższa metody sąsiadów do klasyfikowania ai bna c. Aby móc mierzyć odległości, przekształcam mój zestaw danych, usuwając bi dodając b.level1i b.level2. Jeśli obserwacja ima pierwszy poziom w bkategoriach, b.level1[i]=1oraz b.level2[i]=0.

Teraz mogę zmierzyć odległości w moim nowym zestawie danych: a b.level1 b.level2

Z teoretycznego / matematycznego punktu widzenia: czy możesz wykonać K-najbliższego sąsiada (KNN) z danymi binarnymi i ciągłymi?

Korzystam z FNNpakietu w R i funkcjiknn()

k.dkhk
źródło
Nie mam prawie żadnego doświadczenia KNN, ale nie widzę, jak zmienna binarna byłaby bardzo pomocna w ustalaniu odległości. Jestem ciekawy, dlaczego skłaniasz się ku takiemu podejściu.
rolando2
Ponieważ nie widzę lepszego sposobu na porównanie zmiennej numerycznej ze zmienną kategorialną. Możesz zaproponować lepsze podejście :)
k.dkhk

Odpowiedzi:

11

Można łączyć zmienne jakościowe i ciągłe (cechy).

Jakoś nie ma wiele podstaw teoretycznych dla metody takiej jak k-NN. Heurystyka polega na tym, że jeśli dwa punkty są blisko siebie (zgodnie z pewną odległością), to mają one coś wspólnego pod względem wydajności. Może tak może nie. I zależy to od odległości, z której korzystasz.

W swoim przykładzie określasz odległość między dwoma punktami (za,b,do) i (za,b,do) Jak na przykład :

  • przyjąć kwadratową odległość między za i za : (za-za)2)
  • Dodaj +2 jeśli b i b są różne, +0 jeśli równe (ponieważ liczysz różnicę 1 dla każdej kategorii)
  • Dodaj +2 jeśli do i do są różne, +0 jest równe (to samo)

Odpowiada to niejawnemu podawaniu wag każdej funkcji.

Zauważ, że jeśli za przyjmuje duże wartości (jak 1000, 2000 ...) z dużą zmiennością, wówczas wagi funkcji binarnych będą pomijalne w porównaniu z wagą za. Tylko odległość międzyza i zabędzie miało znaczenie. I odwrotnie: ifza przyjmuje małe wartości, takie jak 0,001: liczą się tylko funkcje binarne.

Możesz znormalizować zachowanie poprzez ponowne ważenie: dzielenie każdej cechy przez jej odchylenie standardowe. Dotyczy to zarówno zmiennych ciągłych, jak i binarnych. Możesz również podać własne preferowane ciężary.

Pamiętaj, że funkcja R kNN () robi to za Ciebie: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Jako pierwszą próbę użyj po prostu norma = prawda (normalizacja). Pozwoli to uniknąć większości nonsensów, które mogą się pojawić podczas łączenia funkcji ciągłych i kategorycznych.

Benoit Sanchez
źródło
dobra odpowiedź (+1), można jednak wspomnieć, jeśli wymiar jest wysoki i istnieje wiele zmiennych dyskretnych, znanych z odległości euklidesowej może nie działać dobrze.
Haitao Du
6

Tak, z pewnością możesz używać KNN zarówno z danymi binarnymi, jak i ciągłymi, ale należy pamiętać o kilku ważnych kwestiach.

Wyniki będą silnie informowane przez podziały binarne w odniesieniu do dyspersji wyników o wartościach rzeczywistych (dla wektorów skalowanych 0-1, nieważonych), jak pokazano poniżej:

Rozdzielenie zmiennych o wartościach rzeczywistych i binarnych

W tym przykładzie widać, że najbliżsi sąsiedzi z poszczególnych obserwacji pod względem odległości byliby O DUŻO silniej poinformowani przez zmienną binarną niż przez skalowaną zmienną wartości rzeczywistej.

Co więcej, rozciąga się to na wiele zmiennych binarnych - jeśli zmienimy jedną ze zmiennych o wartościach rzeczywistych na binarne, możemy zauważyć, że odległości będą znacznie bardziej świadome poprzez dopasowanie wszystkich zmiennych binarnych, niż w bliskości rzeczywistych wartości:

Rozdzielenie zmiennych o wartościach rzeczywistych i binarnych

Będziesz chciał uwzględnić tylko krytyczne zmienne binarne - w rzeczywistości pytasz „o wszystkie obserwacje, które pasują do tej konfiguracji zmiennych binarnych (jeśli istnieją), które mają najbliższe wartości rzeczywiste?” Jest to rozsądne sformułowanie wielu problemów, które można rozwiązać za pomocą KNN, i bardzo słabe sformułowanie innych problemów.

#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
źródło