Klasifikasi menggunakan K-Nearest Neighbor (KNN) (part-2)

Andaikan dipunyai data seperti berikut,

X1 —– X2 —– Keputusan

3 —– 4 —– Ya

1 —– 3 —– Ya

3 —– 3 —– Ya

3 —– 7 —– Ya

4 —– 1 —– Ya

6 —– 5 —– Ya

5 —– 6 —– Ya

3 —– 7 —– Ya

6 —– 2 —– Ya

7 —– 4 —– Ya

4 —– 6 —– Tidak

4 —– 4 —– Tidak

5 —– 8 —– Tidak

7 —– 8 —– Tidak

5 —– 6 —– Tidak

10 —– 5 —– Tidak

4 —– 10 —– Tidak

7 —– 6 —– Tidak

5 —– 4 —– Tidak

8 —– 5 —– Tidak

6 —– 6 —– Tidak

7 —– 4 —– Tidak

8 —– 8 —– Tidak

9 —– 7 —– Tidak

6 —– 5 —– ?

dengan baris terakhir adalah data baru yang akan dicari kelasnya.

Andaikan dipilih K= 8 (artinya akan digunakan 8 titik data persekitaran) sebagai parameter dalam algoritma ini. Kemudian dihitung jarak kuadrat antara titik data yang ditanyakan dengan seluruh data pelatihan. Contoh baris pertama adalah jarak kuadrat (3,4) ke (6,5) yakni (3-6)^2 + (4-5)^2 = 3^2 + 1^2 = 10.

Langkah berikutnya adalah mencari K= 8 titik-titik data persekitaran. Kita masukkan data pelatihan sebagai persekitaran terdekat jika jarak antara data pelatihan dengan titik data yang ditanyakan mempunyai nilai jarak terkecil yang berada dalam 8 titik persekitaran. Dengan kata lain, jarak yang mempunyai nilai terkecil akan diurutkan sampai dengan 8 titik data persekitaran.

Jarak — Keputusan

10 —– Ya

29 —– Ya

13 —– Ya

13 —– Ya

20 —– Ya

0 —– Ya (Masuk)

2 —– Ya (Masuk)

13 —– Ya

9 —– Ya

2 —– Ya (Masuk)

5 —– Tidak

5 —– Tidak

10 —– Tidak

10 —– Tidak

2 —– Tidak (Masuk)

16 —– Tidak

29 —– Tidak

2 —– Tidak (Masuk)

2 —– Tidak (Masuk)

4 —– Tidak

1 —– Tidak (Masuk)

2 —– Tidak (Masuk)

13 —– Tidak

13 —– Tidak

Hasil prediksi dari KNN didasarkan pada jumlah terbanyak yang terdapat pada 8 persekitaran tersebut, pada contoh diatas jumlah “Ya” adalah 3 dan jumlah “Tidak” adalah 5 sehingga “data baru”" yang ditanyakan ditetapkan sebagai “Tidak”.

sehingga peluang “data baru”" adalah “Tidak”" sebesar 5/8 = 0.625

Jika dimisalkan dalam 8 persekitaran mempunyai jumlah “Ya” dan “Tidak” adalah sama maka kita dapat memilih secara bebas salah satu prediksi. Dalam contoh diatas nilai dari Y memuat data kategorik dan hasil prediksi diperkirakan dengan menggunakan jumlah terbanyak dalam persekitaran tersebut. Jika nilai Y adalah kuantitatif, maka dapat kita ambil nilai rata-rata tengahnya atau median sebagai hasil prediksi.

library(class)

X1<-c(3,1,3,3,4,6,5,3,6,7,4,4,5,7,5,10,4,7,5,8,6,7,8,9)

X2<-c(4,3,3,7,1,5,6,7,2,4,6,4,8,8,6,5,10,6,4,5,6,4,8,7)

X<-cbind(X1,X2)

X
##       X1 X2
##  [1,]  3  4
##  [2,]  1  3
##  [3,]  3  3
##  [4,]  3  7
##  [5,]  4  1
##  [6,]  6  5
##  [7,]  5  6
##  [8,]  3  7
##  [9,]  6  2
## [10,]  7  4
## [11,]  4  6
## [12,]  4  4
## [13,]  5  8
## [14,]  7  8
## [15,]  5  6
## [16,] 10  5
## [17,]  4 10
## [18,]  7  6
## [19,]  5  4
## [20,]  8  5
## [21,]  6  6
## [22,]  7  4
## [23,]  8  8
## [24,]  9  7

kemudian kita masukkan variabel keputusan sebagai target klasifikasi

keputusan<-factor(c(rep("ya",10),rep("tidak",14)))

keputusan
##  [1] ya    ya    ya    ya    ya    ya    ya    ya    ya    ya    tidak
## [12] tidak tidak tidak tidak tidak tidak tidak tidak tidak tidak tidak
## [23] tidak tidak
## Levels: tidak ya

kemudian kita masukkan juga data baru (6, 5)

databaru<-cbind(6,5)

databaru
##      [,1] [,2]
## [1,]    6    5
hasil1<-knn(X,databaru,keputusan,k=8)

hasil1
## [1] tidak
## Levels: tidak ya

Untuk k=8 persekitaran maka didapatkan keputusannya adalah “tidak”. Untuk mengetahui besarnya probabilitas databaru dengan keputusan “tidak” digunakan tambahan peritnah (prob=T) seperti berikut,

hasil2<-knn(X,databaru,keputusan,k=8,prob=T)

hasil2
## [1] tidak
## attr(,"prob")
## [1] 0.625
## Levels: tidak ya

Didapatkan nilai probabilitas = 0.625 untuk k=8 persekitaran. sama seperti perhitungan manual diatas. Untuk nilai k persekitaran yang lain dapat kita cobakan skrip berikut, untuk k=1 persekitaran

hasil3<-knn(X,databaru,keputusan,k=1,prob=T)

hasil3
## [1] ya
## attr(,"prob")
## [1] 1
## Levels: tidak ya

Didapatkan nilai probabilitas = 1 untuk k=1 persekitaran. Hal ini dikarenakan ada nilai dalam data asli yaitu (6,5) dengan keputusan ‘Ya’ yang sama persis dengan data yang dicari yakni (6,5).

Sehingga kita bisa menentukan berapa banyak persekitaran yang akan digunakan dan besaran probabilitasnya.

Berikut akan dicobakan dengan data yang terdapat dalam R. Data yang digunakan adalah data bunga iris. (lihat help(iris)).

Data bunga iris terdiri dari 150 data bunga iris yang diukur menurut panjang dan lebar kelopak bunganya serta panjang dan lebar kuncup bunganya (sepal dan petal) dengan 3 species yang berbeda yakni 50 bunga iris ‘setosa’, 50 bunga iris ‘versicolor’ dan 50 bunga iris ‘virginica’.

iris.kelas<-c(rep("s",50),rep("c",50),rep("v",50))

perintah diatas adalah membuat terlebih dahulu kelas data sebagai targetnya.

data(iris)

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

nampak 6 data iris perama (perintah ‘head’) terdapat 5 variabel yakni sepal.length sepal.width, petal.length petal.width serta spesiesnya masing-masing

iris.data<-data.frame(iris[,1:4],species=iris.kelas)

dalam contoh kali ini, data iris akan diambil 4 variabel pertamanya saja, sementara variabel spesiesnya diganti dengan iris.kelas

ganjil<-2*(1:75)-1

iris.latihan<-iris.data[ganjil,]

perintah diatas digunakan untuk mengambil urutan data iris bernomor ganjil saja yang akan digunakan sebagai data pelatihan

iris.uji<-iris.data[-ganjil,]

sedangkan sisanya, data bernomor genap atau (-ganjil) digunakan sebagai data uji.

hasil.iris.knn<-knn(iris.latihan[,-5],iris.uji[,-5],iris.latihan[,5],k=5)

pada perintah knn urutan syntax yang dipakai adalah

knn(data.latihan, data.uji, target.kelas, banyak.kelas, probabilitas= T atau F),

sehingga pada data latihan dan data uji tidak disertakan target spesiesnya ([,-5]), namun diletakkan tersendiri pada target.kelas yakni perintah iris.latihan[,5].

hasil.iris.knn
##  [1] s s s s s s s s s s s s s s s s s s s s s s s s s c c c c c c c c c c
## [36] c c c c c c v c c c c c c c c v v v v v v v v v v v v v v v v v v v v
## [71] v v v v v
## Levels: c s v

kemudian untuk memudahkan melihat hasilnya dapat kita tampilkan dalam bentuk tabel hasil klasifikasi seperti berikut

(table(hasil.iris.knn,iris.uji[,5]))
##               
## hasil.iris.knn  c  s  v
##              c 24  0  0
##              s  0 25  0
##              v  1  0 25

nampak bahwa terdapat satu bunga spesies c atau versicolor yang tidak sesuai dan masuk menjadi spesies v atau virginica. Dengan demikian terdapat misklasifikasi sebesar 1/75.

untuk melihat plot hasil klasifikasi dapat menggunakan perintah berikut

pairs(iris.uji[,1:4],pch=as.character(iris.uji[,5]),col=c(3,2)
[(iris.uji$species!=hasil.iris.knn)+1])

dari plot pasangan variabel diatas nampak bahwa ada satu warna merah dari spesies c atau versicolor yang tidak sesuai klasifikasinya.

semoga bermanfaat

Salam

RB Fajriya Hakim

Department of Statistics Universitas Islam Indonesia

email: hakimf@uii.ac.id