6.
SUPPORT VECTOR MACHINE
Dipilih distribusi F dengan derajat bebas 9 dan 9, dengan contoh visualisasi distribusi
sebagai berikut :
Gambar Visualisasi Distribusi F
Distribusi F bersifat positif skewed (miring ke kanan), namun tingkat kemiringannya
berkurang saat derajat bebas meningkat. Untuk derajat bebas d1, d2 = 9 distribusi akan
cenderung miring ke kanan. Peubah acak X dikatakan mempunyai distribusi F jika dan hanya
jika fungsi densitasnya berbentuk :
{ ( )( )
d1
d 1 +d 2 d1 2
Γ d1
−1
2 d2 f 2
. ; 0< x <∞
f ( x )=
( )
d1 d2 (d1 +d2 )
d1 x
Γ( ) Γ( ) 1+ r
2 2 d2
0; x lainnya
Lalu, untuk Ekspektasi dan Varians dari distribusi F berbentuk :
d2
E [ X ]=
d 2−2
2 d 22 (d 2 +d 1−2)
Var [ X ] = 2
d 1 ( d 2−2 ) (d 2−4)
1
Sehingga, untuk X F (9 , 9) nilai dari Ekspektasi dan Varians distribusi bilangan acaknyanya
menjadi :
E [ X ] ≈ 1.2857142857
Var [ X ]≈ 1.1755102041
Dari distribusi ini akan dibangkitkan bilangan acak sebanyak 200 buah dan dibentuk matriks
kovariat atau fitur x yang berdimensi 100 ×2. Sebelumnya, berdasarkan informasi
Ekspektasi dan Varians diatas, maka dapat diambil kesimpulan bahwa rata-rata dari populasi
dari 200 angka acak tersebut yang dibangkitkan dari distribusi F(9,9) akan mendekati nilai
1.2857142857 . Lalu, semakin besar jumlah bilangan acak yang dibangkitkan maka rata-rata
populasinya akan semakin mendekati 1.2857142857 . Selain itu, bilangan acak yang
dihasilkan akan menyebar disekitar E [ X ] dengan tingkat penyebaran :
Standard Deviasi=√ Var [ X ]= √ 1.1755102041 ≈ 1.0842094835
Lalu, akan dibentuk label y yang terbagi menjadi dua kelas 1 dan -1. Berikut adalah sintaks
beserta output-nya :
Sintaks
### STEP 1: Bangkitkan Data dari Distribusi F(9,9)
[Link](123) # Replikasi hasil
# Bangkitkan 200 angka dari distribusi F(9,9)
data_f <- rf(200, df1 = 9, df2 = 9)
x <- matrix(data_f, ncol = 2)
# Membentuk dataset y dengan label (-1) dan (1) yang seimbang
y <- c(rep(-1, 50), rep(1, 50))
x[y == 1, ] <- x[y == 1, ] + 1
# menggeser separuh data (yang berlabel 1) agar memiliki nilai fitur lebih besar
# untuk menciptakan dua kelompok data yang lebih bisa dipisahkan secara visual
plot(x, col = (3 - y))
# col = (3 - y) digunakan untuk menentukan warna titik dalam plot berdasarkan indeks
warna di R.
Output dari pembagian data training x1, x2, dan pelabelan y
2
Gambar Plot Pembagian Data Training
Selanjutnya, akan dilakukan svmfit dengan kernel linear dengan biaya (cost): 0.001, 0.01, 0.1,
1, 5, 10, 100. Sebelumnya, perlu diketahui bahwa metode pemisahan dari Support Vector
Machine diawali dari Maximal Margin Classifier (MMC), namun metode MMC
mengharuskan kedua kelas terpisah secara sempurna dan akan memaksimalkan margin
(jarak) dari titik terdekat kedua kelas. Pada data nyata, hal ini sulit ditemukan, sehingga
dibentuk Support Vector Classifier (SVC) atau Soft Margin Classifier yang memperbolehkan
beberapa amatan pada sisi yang salah atau bahkan pada sisi yang salah pada hyperplane.
SVC mengklasifikasikan amatan uji bergantung pada sisi mana hyperplane terletak dan
merupakan solusi dari masalah optimisasi.
n
y i ( β 0+ β1 x i2 + β 2 x i 2 +…+ β p xip ) ≥ M ( 1−ϵ i ) , ϵ i ≥ 0 , ∑ ϵ i ≤ C
i =1
p
Dengan ∑ β j=1
2
j=1
SVC menggunakan slack variable (ϵ 1 , … , ϵ n ¿, M sebagai lebar margin, dan C parameter
tunning nonnegatif. Dalam hal ini, C merupakan cost. Diketahui bahwa :
Slack variable memberikan informasi lokasi amatan relatif terhadap hyperplane dan margin.
- Jika ϵ i=0, amatan berada pada di sisi yang benar pada margin.
- Jika ϵ i >0 , amatan berada pada sisi yang salah pada margin dan dikatakan melanggar
margin.
- Jika ϵ i >1, amatan berada pada sisi yang salah pada hyperplane.
3
Lalu, parameter C dipilih melalui cross-validation dan mengontrol bias-varians. Dalam kasus
ini, parameter C dipilih dengan menggunakan fungsi tune() pada R. Diketahui bahwa :
- Jika C besar, margin lebar dan lebih banyak pelanggaran (toleransi tinggi pada amatan
untuk berada pada sisi yang salah pada margin).
- Jika C kecil, support vektor lebih sedikit dan pengklasifikasi memiliki bias yang
rendah tetapi varians yang tinggi dan kesalahan pada margin kecil.
Selanjutnya, akan dipilih model terbaik dan biaya cost yang terpilih, serta akan dibuatkan
plotnya. Berikut adalah sintaks beserta output-nya :
Sintaks
### STEP 2: Buat Data Frame untuk Training dan uji coba SVMFIT dengan cost 10
dat <- [Link](x = x, y = [Link](y))
library(e1071)
svmfit <- svm(y ~ ., data = dat, kernel = "linear", cost = 10, scale = FALSE)
plot(svmfit, dat)
svmfit$index
summary(svmfit)
### STEP 3 : Uji coba SVMFIT dengan cost 0.1
svmfit2 <- svm(y ~ ., data = dat, kernel = "linear", cost = 2, scale = FALSE)
plot(svmfit2, dat)
svmfit2$index
summary(svmfit2)
### STEP 4 : Tune SVM dengan banyak cost berbeda dan melihat model terbaik
[Link] <- tune(svm, y ~ ., data = dat, kernel = "linear",
ranges = list(cost = c(0.001, 0.01, 0.1, 1, 5, 10, 100)))
summary([Link])
bestmod <- [Link]$[Link]
bestmod
summary(bestmod)
svmfit3 <- svm(y ~ ., data = dat, kernel = "linear",
cost = 1, scale = FALSE)
plot(svmfit3, dat)
4
svmfit3$index
summary(svmfit3)
Output dari SVMFIT dengan cost 10 dan cost 0.1, beserta model terbaik
1.) SVMFIT dengan cost 10
> svmfit$index
[1] 3 4 5 6 13 15 16 18 19 21 22 24 25
26 28 30 32 34 35 36 38 39 40 43 44
[26] 45 46 47 55 56 59 60 63 64 66 67 72
73 74 75 76 77 79 81 82 84 88 89 90 92
[51] 93 96 97 98 99
> summary(svmfit)
Call:
svm(formula = y ~ ., data = dat, kernel =
"linear", cost = 10, scale = FALSE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 10
Number of Support Vectors: 55
( 28 27 )
Number of Classes: 2
Levels:
-1 1
2.) SVMFIT dengan cost 0.1
5
> svmfit2$index
[1] 3 4 5 6 8 13 15 16 17 18 19 21 22
23 24 25 26 28 30 32 33 34 35 36 37
[26] 38 39 40 42 43 44 45 46 47 52 53 55
56 59 60 63 64 66 67 70 72 73 74 75 76
[51] 77 79 80 81 82 84 85 87 88 89 90 92
93 95 96 97 98 99
> summary(svmfit2)
Call:
svm(formula = y ~ ., data = dat, kernel =
"linear", cost = 0.1, scale = FALSE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 0.1
Number of Support Vectors: 68
( 34 34 )
Number of Classes: 2
Levels:
-1 1
3.) Model terbaik
6
> svmfit3$index
[1] 3 4 5 6 13 15 16 18 19 21 22 24 25
26 28 30 32 34 35 36 38 39 40 43 44
[26] 45 46 47 53 55 56 59 60 63 64 66 67
72 73 74 75 76 77 79 81 82 84 87 88 89
[51] 90 92 93 96 97 98 99
> summary(svmfit3)
Call:
svm(formula = y ~ ., data = dat, kernel =
"linear", cost = 1, scale = FALSE)
Parameters:
SVM-Type: C-classification
SVM-Kernel: linear
cost: 1
Number of Support Vectors: 57
( 28 29 )
Number of Classes: 2
Levels:
-1 1
Interpretasi dari ketiga hasil :
Berdasarkan output dari model terbaik, yaitu model dengan cost 1, didapatkan sebanyak 57
support vector dengan 28 untuk label (1) dan 29 untuk label (-1). Jika dilihat dua uji coba
cost sebelumnya (10 dan 0.1), dapat dilihat bahwa fitting model dengan cost 10 mendapatkan
support vector sebanyak 55 dengan 28 untuk label (1) dan 27 untuk label (-1), serta untuk
fitting model dengan cost 0.1 mendapatkan support vector sebanyak 68 dengan 34 untuk
label (1) dan 34 untuk label (-1). Terlihat bahwa semakin besar cost maka support vector
akan semakin sedikit dan semakin kecil cost maka support vector akan semakin banyak.
Diketahui sebelumnya bahwa total support vector yang diperoleh model terbaik adalah 57,
akan dilihat pembagian ϵ i dari masing-masing support vector tersebut :
7
Sintaks
### STEP 5 : Melihat representase epsilon_i pada support vector
pred <- predict(svmfit3, dat, [Link] = TRUE) #Prediksi
attributes(pred) #Isi dari variabel pred
fx <- attributes(pred)$[Link] #Mengambil keputusan dari
pred
nilai_y <- [Link]([Link](dat$y)) #Mengambil nilai y dari dataset
epsilon_i <- pmax(0, 1 - nilai_y * fx) #Membentuk epsilon_i, dan
memastikan hanya nilai positif
index_sv <- svmfit3$index
length(index_sv)
epsilon_i[index_sv]
# Jumlah epsilon_i dari support vector berdasarkan kategori
sum(epsilon_i[sv_idx] > 1)
sum(epsilon_i[sv_idx] > 0 & epsilon_i[sv_idx] < 1)
sum(epsilon_i[sv_idx] == 0)
Output
> fx <- attributes(pred)$[Link]#Mengambil keputusan dari pred
> nilai_y <- [Link]([Link](dat$y)) #Mengambil nilai y dari dataset
>
> epsilon_i <- pmax(0, 1 - nilai_y * fx)#Membentuk epsilon_i, dan memastikan hanya
nilai positif
> index_sv <- svmfit3$index
> length(index_sv)
[1] 57
> epsilon_i[index_sv]
[1] 1.80534206 1.51733271 2.00023994 1.27736215 1.72621853 1.92291370
[7] 0.73098495 0.00000000 1.26577358 0.05956128 0.00000000 1.21990961
[13] 0.00000000 0.20920565 0.00000000 1.73251111 1.97457587 1.98920491
[19] 1.86742008 1.81461791 0.87322343 0.57828266 1.90941003 1.31516880
[25] 1.72735328 0.98335746 1.57998687 1.22468948 2.00048357 0.84502264
[31] 0.23845603 1.40427390 1.11449675 1.39594327 1.62820218 1.92106330
[37] 1.64789962 1.15818599 0.45992717 0.97844886 0.86609486 1.46005989
[43] 0.54337853 0.10546467 0.63775485 0.82292003 1.55635041 1.99975991
[49] 0.81130473 1.77602650 0.50926603 1.64701772 1.86979238 0.75976427
[55] 1.05486750 0.73529560 1.25431369
>
> # Jumlah epsilon_i dari support vector berdasarkan kategori
> sum(epsilon_i[sv_idx] > 1)
[1] 34
> sum(epsilon_i[sv_idx] > 0 & epsilon_i[sv_idx] < 1)
[1] 19
> sum(epsilon_i[sv_idx] == 0)
[1] 4
Dapat dilihat bahwa :
- Jumlah ϵ i=0 adalah 4 support vector
- Jumlah 0< ϵ i<1 adalah 19 support vector
- Jika ϵ i >1 adalah 34 support vector
8
Dari hasil ini, dapat disimpulkan bahwa dari model SVM dengan cost 1 akan menghasilkan
57 support vector dengan pembagian variabel slack (ϵ i) seperti diatas yang mengindikasikan
parameter cost pada svm() menghasilkan 4 support vector yang tepat pada margin, 19 support
vector berada pada sisi yang salah pada margin dan dikatakan melanggar margin, dan 34
support vector berada pada sisi yang salah pada hyperplane.
Selanjutnya, akan dilihat hasil dari metrik evaluasi matriks konfusi :
Gambar Contoh dari Matriks Konfusi
Matriks ini memperhitungkan hasil prediksi dari SVM terhadap data uji, dimana jika data
sebenarnya positif (misalkan ‘1’) dan prediksinya untuk data tersebut adalah data positif
(prediksinya juga ‘1’), maka elemen dari True Positive akan tersisi. Lalu, jika data
sebenarnya negatif (misalkan ‘-1’) dan prediksi untuk data tersebut adalah data negatif
(prediksinya juga ‘-1’), maka elemen dari True Negative akan terisi. Selanjutnya, jika data
sebenarnya negatif (misalkan ‘-1’) dan predikisinya untuk data tersebut adalah data positif
(prediksinya ‘1’), maka elemen dari False Positive akan terisi. Terakhir, jika data sebenarnya
positif (misalkan ‘1’) dan prediksi untuk data tersebut adalah data negatif (prediksinya ‘-1’),
maka elemen dari False Negative akan terisi. Dalam pengujian model SVM terbaik dengan
cost 1, akan digunakan data uji baru yang berbeda dengan data sebelumnya. Berikut adalah
sintaks dan luarnya :
Sintaks R
## Testing dan metrik evaluasi
x2 <- matrix(data_f, ncol = 2)
y2 <- sample(c(-1,1), 100, rep=TRUE)
x2[y2 == 1, ] <- x2[y2 == 1, ] + 1
plot(x2, col = (3 - y2))
plot(x, col = (3 - y))
testdat <- [Link](x = x2, y = [Link](y2))
9
Output R
> ypred <- predict(bestmod, testdat)
> table(predict = ypred, truth = testdat$y)
truth
predict -1 1
-1 43 6
1 6 45
Dapat dilihat bahwa data (-1) yang berhasil diprediksi sebagai data (-1) terdapat sebanyak 43
buah dan data (1) yang berhasil diprediksi sebagai data (1) terdapat sebanyak 45 buah.
Sedangkan, sisanya yang salah terdapat 12 buah. Hal ini mengindikasikan model SVM
dengan cost 1 dapat memprediksi data akurat dengan persentase 88%. Lalu, berikut adalah
contoh hasil prediksi dengan cost lainnya selain 1, misalkan cost 0.01:
Sintaks R
## Dibandingkan dengan cost 0.01
svmfit <- svm(y ~ ., data = dat, kernel = "linear",
cost = .01, scale = FALSE)
ypred <- predict(svmfit, testdat)
table(predict = ypred, truth = testdat$y)
Output R
> ypred <- predict(svmfit, testdat)
> table(predict = ypred, truth = testdat$y)
truth
predict -1 1
-1 45 26
1 4 25
Dapat dilihat bahwa hasil prediksi data yang akurat adalah 70 data yang berarti persentase
akurasi model SVM dengan cost 0.01 adalah 70%. Hal ini konsisten dengan hasil tunning
dari nilai cost dimana didapatkan hasil model terbaik adalah dengan cost 1, dan setelah di uji
dengan data uji, didapatkan persentase akurasi model sebesar 88%.
10