Pendahuluan

Support Vector Machine (SVM) merupakan salah satu algoritma pembelajaran mesin yang berlandaskan pada prinsip margin maksimum untuk menghasilkan fungsi pemisah yang optimal. Metode ini efektif digunakan dalam permasalahan klasifikasi baik linear maupun non-linear.

Apabila data tidak dapat dipisahkan secara linear, pendekatan kernel trick memungkinkan SVM memetakan data ke ruang berdimensi lebih tinggi tanpa melakukan transformasi eksplisit, sehingga pemisahan antar kelas dapat dilakukan secara efisien.

Penelitian ini bertujuan untuk menganalisis performa berbagai jenis fungsi kernel SVM terhadap dua dataset, yaitu data1.csv dan data2.csv, dengan fokus pada tingkat akurasi dan ketepatan klasifikasi.

Dataset yang digunakan tersedia pada tautan berikut:

Akses Dataset
- data1.csv
- data2.csv

Analisis dilakukan dengan menggunakan enam jenis kernel, yaitu: 1. Linear (Vanilla) 2. Radial Basis Function (RBF) 3. Tanh (Sigmoid) 4. Bessel 5. Laplace 6. ANOVA RBF


Persamaan Model Kernel SVM

Model umum dari Support Vector Machine dengan fungsi kernel dinyatakan sebagai:

\[ f(x) = \sum_{i=1}^{n} \alpha_i y_i K(x_i, x) + b \]

dengan \(K(x_i, x)\) merupakan fungsi kernel yang mengukur kemiripan antara dua vektor fitur \(x_i\) dan \(x\).
Berikut merupakan bentuk eksplisit dari berbagai kernel yang digunakan, mengacu pada dokumentasi kernlab (Karatzoglou et al., 2004) dalam Journal of Statistical Software, Vol. 11(9):

No Jenis Kernel Persamaan \(K(x, x_0)\) Keterangan
1 Linear (Vanilla) \(K(x, x_0) = \langle x, x_0 \rangle\) Kernel paling sederhana, berguna untuk data berdimensi besar dan jarang (sparse data), seperti dalam klasifikasi teks.
2 Gaussian Radial Basis (RBF) \(K(x, x_0) = \exp(-\sigma \|x - x_0\|^2)\) Kernel serbaguna yang umum digunakan ketika tidak terdapat pengetahuan awal tentang struktur data.
3 Polynomial \(K(x, x_0) = (\text{scale} \cdot \langle x, x_0 \rangle + \text{offset})^{\text{degree}}\) Umumnya digunakan dalam klasifikasi citra dan permasalahan dengan interaksi non-linear.
4 Hyperbolic Tangent (Tanh) \(K(x, x_0) = \tanh(\text{scale} \cdot \langle x, x_0 \rangle + \text{offset})\) Sering digunakan sebagai pendekatan terhadap jaringan saraf tiruan.
5 Bessel Function of the First Kind \(K(x, x_0) = \frac{\text{Bessel}_{\nu+1}(\sigma \|x - x_0\|)}{(\|x - x_0\|)^{\nu+1}}\) Kernel bersifat umum dan populer dalam komunitas Gaussian Process, terutama ketika tidak ada pengetahuan awal tentang data.
6 Laplace Radial Basis \(K(x, x_0) = \exp(-\sigma \|x - x_0\|)\) Kernel serbaguna lain yang digunakan pada kasus non-linear tanpa asumsi awal terhadap distribusi data.
7 ANOVA Radial Basis \(K(x, x_0) = \left( \sum_{k=1}^{n} \exp(-\sigma (x_k - x_{0k})^2) \right)^d\) Kernel yang memberikan performa baik pada permasalahan regresi multidimensi.

Persiapan Data

library(e1071)
library(kernlab)
library(caret)
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:kernlab':
## 
##     alpha
## The following object is masked from 'package:e1071':
## 
##     element
## Loading required package: lattice
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)

# Membaca dataset
data1 <- read.csv("C:/Users/ASUS/Downloads/data1.csv")
data2 <- read.csv("C:/Users/ASUS/Downloads/data2.csv")

# Memastikan variabel respon bertipe faktor
data1$y <- as.factor(data1$y)
data2$y <- as.factor(data2$y)

Pembagian Data

split_data <- function(df){
  train <- df[1:400, ]
  test <- df[401:500, ]
  list(train=train, test=test)
}

set1 <- split_data(data1)
set2 <- split_data(data2)

Fungsi Evaluasi Model

evaluate_svm <- function(train, test, kernel_type, ...){
  model <- ksvm(y ~ ., data=train, kernel=kernel_type, ...)
  pred <- predict(model, test[, c("x1","x2")])
  cm <- confusionMatrix(pred, test$y, positive="1")
  result <- data.frame(
    Kernel = kernel_type,
    Accuracy = cm$overall["Accuracy"],
    Precision = cm$byClass["Precision"],
    Recall = cm$byClass["Recall"],
    F1 = cm$byClass["F1"]
  )
  return(result)
}

Pemodelan Kernel SVM

kernels <- c("vanilladot", "rbfdot", "tanhdot", "besseldot", "laplacedot", "anovadot")

results_data1 <- do.call(rbind, lapply(kernels, function(k){
  evaluate_svm(set1$train, set1$test, k)
}))
##  Setting default kernel parameters  
##  Setting default kernel parameters  
##  Setting default kernel parameters  
##  Setting default kernel parameters
results_data2 <- do.call(rbind, lapply(kernels, function(k){
  evaluate_svm(set2$train, set2$test, k)
}))
##  Setting default kernel parameters  
##  Setting default kernel parameters  
##  Setting default kernel parameters  
##  Setting default kernel parameters
results_data1$Dataset <- "data1.csv"
results_data2$Dataset <- "data2.csv"

all_results <- rbind(results_data1, results_data2)
all_results
##                Kernel Accuracy Precision    Recall        F1   Dataset
## Accuracy   vanilladot     0.79 0.7900000 1.0000000 0.8826816 data1.csv
## Accuracy1      rbfdot     0.98 0.9753086 1.0000000 0.9875000 data1.csv
## Accuracy2     tanhdot     0.73 0.7765957 0.9240506 0.8439306 data1.csv
## Accuracy3   besseldot     0.90 0.8876404 1.0000000 0.9404762 data1.csv
## Accuracy4  laplacedot     0.99 0.9875000 1.0000000 0.9937107 data1.csv
## Accuracy5    anovadot     0.98 0.9753086 1.0000000 0.9875000 data1.csv
## Accuracy6  vanilladot     0.99 1.0000000 0.9900000 0.9949749 data2.csv
## Accuracy11     rbfdot     1.00 1.0000000 1.0000000 1.0000000 data2.csv
## Accuracy21    tanhdot     0.80 1.0000000 0.8000000 0.8888889 data2.csv
## Accuracy31  besseldot     0.99 1.0000000 0.9900000 0.9949749 data2.csv
## Accuracy41 laplacedot     1.00 1.0000000 1.0000000 1.0000000 data2.csv
## Accuracy51   anovadot     1.00 1.0000000 1.0000000 1.0000000 data2.csv

Tabel Hasil Evaluasi per Dataset

kernel_labels <- c("Vanilla Kernel",
                   "Radial Basis Kernel",
                   "Tanh Kernel",
                   "Bessel Kernel",
                   "Laplace Kernel",
                   "Anova Radial Basis Kernel")

results_data1$Kernel <- kernel_labels
results_data2$Kernel <- kernel_labels

results_data1 <- results_data1[, c("Kernel", "Accuracy", "Precision", "Recall", "F1")]
results_data2 <- results_data2[, c("Kernel", "Accuracy", "Precision", "Recall", "F1")]

# Tampilkan tabel hasil untuk data1
cat("### Hasil Evaluasi Kernel pada data1.csv\n")
## ### Hasil Evaluasi Kernel pada data1.csv
knitr::kable(results_data1, caption = "Performa Kernel SVM pada Dataset 1",
             digits = 4, align = "c")
Performa Kernel SVM pada Dataset 1
Kernel Accuracy Precision Recall F1
Accuracy Vanilla Kernel 0.79 0.7900 1.0000 0.8827
Accuracy1 Radial Basis Kernel 0.98 0.9753 1.0000 0.9875
Accuracy2 Tanh Kernel 0.73 0.7766 0.9241 0.8439
Accuracy3 Bessel Kernel 0.90 0.8876 1.0000 0.9405
Accuracy4 Laplace Kernel 0.99 0.9875 1.0000 0.9937
Accuracy5 Anova Radial Basis Kernel 0.98 0.9753 1.0000 0.9875
# Tampilkan tabel hasil untuk data2
cat("\n### Hasil Evaluasi Kernel pada data2.csv\n")
## 
## ### Hasil Evaluasi Kernel pada data2.csv
knitr::kable(results_data2, caption = "Performa Kernel SVM pada Dataset 2",
             digits = 4, align = "c")
Performa Kernel SVM pada Dataset 2
Kernel Accuracy Precision Recall F1
Accuracy Vanilla Kernel 0.99 1 0.99 0.9950
Accuracy1 Radial Basis Kernel 1.00 1 1.00 1.0000
Accuracy2 Tanh Kernel 0.80 1 0.80 0.8889
Accuracy3 Bessel Kernel 0.99 1 0.99 0.9950
Accuracy4 Laplace Kernel 1.00 1 1.00 1.0000
Accuracy5 Anova Radial Basis Kernel 1.00 1 1.00 1.0000

Visualisasi Perbandingan Kernel

ggplot(all_results, aes(x = Kernel, y = Accuracy, fill = Dataset)) +
  geom_bar(stat = "identity", position = "dodge") +
  scale_fill_manual(values = c("data1.csv" = "#FADADD",   # pink muda
                               "data2.csv" = "#C8E6C9")) + # hijau muda
  labs(title = "Perbandingan Akurasi Kernel SVM",y = "Akurasi",x = "Kernel", fill = "Dataset") +
  theme_minimal()


Interpretasi Hasil

Berdasarkan hasil pengujian, dapat dilihat bahwa performa masing-masing kernel SVM menunjukkan variasi yang cukup jelas pada kedua dataset. Pada Dataset 1, kernel dengan akurasi tertinggi adalah Laplace Kernel dengan nilai akurasi sebesar 0.99, diikuti oleh Radial Basis Kernel dan Anova Radial Basis Kernel yang sama-sama memiliki akurasi 0.98. Kernel dengan performa terendah adalah Tanh Kernel, dengan akurasi sebesar 0.73. Hal ini menunjukkan bahwa kernel berbasis fungsi radial dan turunannya lebih mampu memisahkan data secara optimal dibandingkan kernel linier atau tanh.

Sementara itu, pada Dataset 2, hampir seluruh kernel menunjukkan performa yang sangat tinggi, dengan Radial Basis Kernel, Laplace Kernel, dan Anova Radial Basis Kernel mencapai akurasi sempurna sebesar 1.00. Kernel lain seperti Vanilla dan Bessel juga memberikan hasil yang sangat baik dengan akurasi 0.99, sedangkan Tanh Kernel kembali menjadi yang terendah dengan akurasi 0.80. Secara keseluruhan, hasil ini memperkuat bahwa kernel non-linear seperti RBF, Laplace, dan Anova RBF lebih unggul dalam menangani data yang kompleks dan tidak terpisah secara linier.

Kesimpulan

Berdasarkan hasil evaluasi performa berbagai kernel SVM pada dua dataset, dapat disimpulkan bahwa kernel non-linear seperti Radial Basis Function (RBF), Laplace, dan Anova RBF menunjukkan performa yang paling unggul dibandingkan kernel lainnya. Ketiganya mampu memberikan akurasi yang sangat tinggi, bahkan mencapai nilai sempurna pada Dataset 2, menandakan kemampuannya dalam menangani pola data yang kompleks dan tidak terpisah secara linier.

Sebaliknya, Tanh Kernel konsisten menunjukkan performa terendah pada kedua dataset, mengindikasikan bahwa kernel ini kurang efektif dalam membentuk batas pemisah optimal untuk data dengan kompleksitas tinggi. Dengan demikian, pemilihan kernel non-linear seperti RBF, Laplace, atau Anova RBF menjadi pilihan yang lebih tepat untuk model klasifikasi berbasis SVM pada data dengan karakteristik non-linear.