K-terdekat-tetangga dengan variabel kontinu dan biner

10

Saya memiliki kumpulan data dengan kolom a b c(3 atribut). abersifat numerik dan kontinu sementara bdan cmasing-masing kategori dengan dua tingkat. Saya menggunakan metode Tetangga K-terdekat untuk mengklasifikasikan adan bpada c. Jadi, untuk dapat mengukur jarak saya mengubah set data saya dengan menghapus bdan menambahkan b.level1dan b.level2. Jika observasi imemiliki level pertama dalam bkategori, b.level1[i]=1dan b.level2[i]=0.

Sekarang saya bisa mengukur jarak di set data baru saya: a b.level1 b.level2

Dari sudut pandang teoretis / matematis: Bisakah Anda melakukan tetangga terdekat (KNN) dengan data biner dan kontinu?

Saya menggunakan FNNpaket dalam R dan fungsinyaknn()

k.dkhk
sumber
Saya hampir tidak memiliki pengalaman KNN tetapi saya tidak melihat bagaimana variabel biner akan sangat membantu dalam menentukan jarak. Saya ingin tahu mengapa Anda condong ke arah pendekatan ini.
rolando2
Karena saya tidak melihat cara yang lebih baik untuk membandingkan variabel numerik dengan variabel kategorikal. Jangan ragu untuk menyarankan pendekatan yang lebih baik :)
k.dkhk

Jawaban:

11

Tidak apa-apa menggabungkan variabel kategori dan kontinu (fitur).

Entah bagaimana, tidak ada banyak landasan teori untuk metode seperti k-NN. Heuristik adalah bahwa jika dua titik dekat satu sama lain (menurut jarak), maka mereka memiliki kesamaan dalam hal output. Mungkin ya mungkin tidak. Dan itu tergantung pada jarak yang Anda gunakan.

Dalam contoh Anda, Anda menentukan jarak antara dua titik dan seperti:( a , b , c )(a,b,c)(a,b,c)

  • ambil jarak kuadrat antara dan :a ( a - a ) 2aa(aa)2
  • Tambahkan +2 jika dan berbeda, +0 jika sama (karena Anda menghitung selisih 1 untuk setiap kategori)b bb
  • Tambahkan +2 jika dan berbeda, +0 sama (sama)c cc

Ini sesuai dengan memberi bobot secara implisit ke setiap fitur.

Perhatikan bahwa jika mengambil nilai besar (seperti 1000, 2000 ...) dengan varians besar maka bobot fitur biner akan diabaikan dibandingkan dengan bobot . Hanya jarak antara dan benar-benar penting. Dan sebaliknya: jika mengambil nilai kecil seperti 0,001: hanya fitur biner yang akan dihitung.a a a ' aaaaaa

Anda dapat menormalkan perilaku dengan menimbang-ulang: membagi setiap fitur dengan standar deviasinya. Ini berlaku untuk variabel kontinu dan biner. Anda juga dapat memberikan bobot pilihan Anda sendiri.

Perhatikan bahwa fungsi R kNN () melakukannya untuk Anda: https://www.rdocumentation.org/packages/DMwR/versions/0.4.1/topics/kNN

Sebagai upaya pertama, cukup gunakan norm = true (normalisasi). Ini akan menghindari sebagian besar non-akal yang mungkin muncul ketika menggabungkan fitur terus menerus dan kategorikal.

Benoit Sanchez
sumber
jawaban yang baik (+1), namun, Anda dapat menyebutkan jika dimensi tinggi, dan ada banyak variabel diskrit, knn dengan jarak Euclidean mungkin tidak berfungsi dengan baik.
Haitao Du
6

Ya, Anda tentu dapat menggunakan KNN dengan data biner dan kontinu, tetapi ada beberapa pertimbangan penting yang harus Anda perhatikan ketika melakukannya.

Hasilnya akan sangat diinformasikan oleh binary splits relatif terhadap dispersi di antara hasil bernilai nyata (untuk skala 0-1, vektor tidak tertimbang), seperti diilustrasikan di bawah ini:

Pemisahan variabel bernilai riil dan biner

Anda dapat melihat dalam contoh ini bahwa tetangga terdekat pengamatan individu berdasarkan jarak akan JAUH lebih banyak diinformasikan oleh variabel biner daripada oleh variabel nilai riil diskalakan.

Lebih jauh lagi, ini meluas ke beberapa variabel biner - jika kita mengubah salah satu variabel bernilai nyata menjadi biner, kita dapat melihat bahwa jarak akan lebih banyak diinformasikan dengan mencocokkan semua variabel biner yang terlibat daripada dalam kedekatan nilai riil:

Pemisahan variabel bernilai riil dan biner

Anda ingin memasukkan hanya variabel biner kritis - Anda, pada dasarnya, bertanya "dari semua pengamatan yang cocok dengan konfigurasi variabel biner ini (jika ada), yang memiliki nilai real-value terdekat?" Ini adalah rumusan yang masuk akal dari banyak masalah yang dapat diatasi dengan KNN, dan perumusan masalah lainnya yang sangat buruk.

#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
sumber