Support Vector Machine (SVM) bertujuan untuk menemukan hyperplane yang memaksimalkan margin pemisah antar kelas data. SVM meminimalkan fungsi objektif berikut:
\[ \min_{w,b,\xi} \frac{1}{2} ||w||^2 + C \sum_{i=1}^n \xi_i \]
Batasan yang berlaku:
\[ y_i (w^T x_i + b) \geq 1 - \xi_i, \quad \xi_i \geq 0 \]
Untuk data yang tidak linear, kernel Radial Basis Function (RBF) digunakan:
\[ K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2) \]
Keterangan:
Menampilkan ringkasan data dan distribusi fitur-fitur dataset. Membantu memahami karakteristik data.
data(BreastCancer, package = "mlbench")
bc <- BreastCancer %>% select(-Id) %>% na.omit()
bc[, 1:9] <- lapply(bc[, 1:9], as.numeric)
summary(bc)
## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.00
## Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.00
## Mean : 4.442 Mean : 3.151 Mean : 3.215 Mean : 2.83
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.00
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.00
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 1.00
## Median : 2.000 Median : 1.000 Median : 3.000 Median : 1.00
## Mean : 3.234 Mean : 3.545 Mean : 3.445 Mean : 2.87
## 3rd Qu.: 4.000 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 4.00
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.00
## Mitoses Class
## Min. :1.000 benign :444
## 1st Qu.:1.000 malignant:239
## Median :1.000
## Mean :1.583
## 3rd Qu.:1.000
## Max. :9.000
bc_long <- melt(bc, id.vars = "Class")
ggplot(bc_long, aes(x = value, fill = Class)) +
geom_histogram(position = "identity", alpha = 0.5, bins = 20) +
facet_wrap(~ variable, scales = "free") +
labs(title = "Distribusi Fitur")
Grafik distribusi fitur di atas memperlihatkan sebaran nilai masing-masing fitur antara dua kelas benign dan malignant. Terlihat bahwa sebagian besar fitur memiliki distribusi yang berbeda secara signifikan antara kedua kelas. Hal ini menunjukkan bahwa fitur-fitur tersebut memiliki potensi yang baik sebagai prediktor dalam pemodelan SVM. Visualisasi ini menjadi dasar untuk pemahaman data dan membantu dalam memilih parameter yang tepat saat membangun model.
K-Fold Cross Validation pada contoh ini menggunakan \(k=10\) untuk konsistensi dengan hasil tuning hyperparameter dan memberikan estimasi performa yang lebih stabil dengan bias yang lebih kecil. Meskipun waktu komputasi menjadi sedikit lebih lama, pemilihan \(k=10\) ini dapat membantu memberikan hasil yang lebih akurat. Langkah-langkahnya sebagai berikut:
set.seed(123)
folds <- createFolds(bc$Class, k=5, list=TRUE)
acc_linear <- c()
acc_rbf <- c()
prec_linear <- c()
prec_rbf <- c()
recall_linear <- c()
recall_rbf <- c()
# Tuning parameter dengan grid search
tune_result <- tune(svm, Class ~ ., data=bc, ranges=list(cost=c(0.1, 1, 10), gamma=c(0.01, 0.1, 1)), kernel="radial")
summary(tune_result)
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## cost gamma
## 1 0.1
##
## - best performance: 0.02783461
##
## - Detailed performance results:
## cost gamma error dispersion
## 1 0.1 0.01 0.03512361 0.02417522
## 2 1.0 0.01 0.02926257 0.02074843
## 3 10.0 0.01 0.02930520 0.02402979
## 4 0.1 0.10 0.03367434 0.01965463
## 5 1.0 0.10 0.02783461 0.02016122
## 6 10.0 0.10 0.03955669 0.02779788
## 7 0.1 1.00 0.06150895 0.03446968
## 8 1.0 1.00 0.04539642 0.02969628
## 9 10.0 1.00 0.03810742 0.02423798
best_model <- tune_result$best.model
for (i in 1:5) {
train <- bc[folds[[i]], ]
test <- bc[-folds[[i]], ]
svm_linear <- svm(Class ~ ., data = train, kernel = "linear", cost = 1)
svm_rbf <- svm(Class ~ ., data = train, kernel = "radial", cost = best_model$cost, gamma = best_model$gamma)
pred_linear <- predict(svm_linear, test)
pred_rbf <- predict(svm_rbf, test)
cm_linear <- confusionMatrix(pred_linear, test$Class, positive="malignant")
cm_rbf <- confusionMatrix(pred_rbf, test$Class, positive="malignant")
acc_linear[i] <- cm_linear$overall["Accuracy"]
acc_rbf[i] <- cm_rbf$overall["Accuracy"]
prec_linear[i] <- cm_linear$byClass["Precision"]
prec_rbf[i] <- cm_rbf$byClass["Precision"]
recall_linear[i] <- cm_linear$byClass["Recall"]
recall_rbf[i] <- cm_rbf$byClass["Recall"]
}
# Tampilkan ringkasan hasil
tabel_ringkasan <- data.frame(
Model = c("SVM Linear", "SVM RBF (Tuned)"),
Akurasi = c(mean(acc_linear), mean(acc_rbf)),
Precision = c(mean(prec_linear), mean(prec_rbf)),
Recall = c(mean(recall_linear), mean(recall_rbf))
)
tabel_ringkasan
## Model Akurasi Precision Recall
## 1 SVM Linear 0.9593695 0.9458706 0.9382962
## 2 SVM RBF (Tuned) 0.9630284 0.9352615 0.9612947
Memvisualisasikan decision boundary (untuk data 2D) dari model SVM untuk melihat bagaimana data diklasifikasikan.
bc_2d <- bc %>% select(Cl.thickness, Cell.size, Class)
model <- svm(Class ~ ., data=bc_2d, kernel="radial", cost=1, gamma=0.1)
plot(model, bc_2d, Cl.thickness ~ Cell.size, slice=list())
Gambar “SVM classification plot” di atas memperlihatkan decision boundary yang dihasilkan oleh SVM dengan kernel RBF. Area merah mewakili prediksi kelas malignant, sedangkan area kuning mewakili kelas benign. Decision boundary memisahkan kedua kelas dengan margin yang lebar, terutama pada wilayah di mana data benign dan malignant saling tumpang tindih. Visualisasi ini mengonfirmasi bahwa SVM dengan kernel RBF mampu menangkap pola nonlinear pada data Breast Cancer dan memisahkan kedua kelas dengan cukup baik.
Dalam SVM, parameter \(C\) dan \(\gamma\) memegang peran yang sangat penting:
Visualisasi dan eksperimen yang dilakukan (misalnya melalui tuning parameter) akan membantu menemukan nilai \(C\) dan \(\gamma\) optimal yang menghasilkan keseimbangan antara akurasi dan generalisasi.
Analisis dataset Breast Cancer menunjukkan bahwa model SVM linear dan SVM RBF sama-sama efektif, dengan RBF lebih unggul untuk data nonlinear. Visualisasi distribusi fitur mendukung temuan ini. Hasil tuning hyperparameter (10-fold CV) menegaskan pentingnya pemilihan parameter \(C\) dan \(\gamma\) untuk kernel RBF. Validasi silang (K-Fold) dan visualisasi decision boundary memberikan pemahaman mendalam tentang performa dan generalisasi model.
Refleksi ini menekankan perlunya pemahaman karakteristik data, validasi model, dan tuning parameter untuk menghasilkan klasifikasi medis yang andal dan akurat.