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:
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
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. |
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)
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)
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)
}
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
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")
| 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")
| 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 |
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()
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.
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.