Kanker payudara merupakan kanker dengan jumlah kasus tertinggi pada perempuan di dunia. Pada tahun 2022 tercatat sekitar 2,3 juta kasus baru dan lebih dari 670 ribu kematian akibat kanker payudara secara global. Tingginya angka kejadian dan kematian tersebut menunjukkan pentingnya deteksi dini yang akurat. Kesalahan diagnosis, terutama ketika tumor ganas (malignant) diklasifikasikan sebagai tumor jinak (benign), dapat menyebabkan keterlambatan penanganan dan menurunkan peluang keberhasilan terapi (WHO, 2026).
Karakteristik inti sel hasil pemeriksaan aspirasi jarum halus atau fine needle aspiration (FNA) dapat direpresentasikan dalam bentuk data numerik yang menggambarkan ukuran, bentuk, tekstur, dan kompleksitas permukaan sel. Data Breast Cancer Wisconsin (Diagnostic) (WDBC) dari UCI Machine Learning Repository memuat 569 observasi dan 30 prediktor numerik yang digunakan untuk membedakan tumor malignant dan benign (Wolberg et al., 1993).
Salah satu metode yang dapat digunakan untuk menangani data dengan banyak prediktor adalah Support Vector Machine (SVM). Metode ini membangun bidang pemisah atau hyperplane dengan margin terbesar antarkelas. SVM juga dapat menangani hubungan nonlinier melalui fungsi kernel. Analisis ini menggunakan SVM dengan kernel linear dan kernel radial basis function (RBF).
Tujuan analisis ini adalah:
Pertanyaan analisis yang diajukan adalah: Dapatkah karakteristik inti sel digunakan untuk mengklasifikasikan tumor sebagai malignant atau benign menggunakan Support Vector Machine?
Data diperoleh dari UCI Machine Learning Repository. Setiap
baris merepresentasikan satu sampel massa payudara. Variabel
diagnosis merupakan target klasifikasi dengan kode asli
M untuk malignant dan B untuk
benign. Variabel id merupakan pengenal observasi
sehingga tidak digunakan sebagai prediktor.
Data memiliki sepuluh karakteristik dasar inti sel berikut:
radius: rata-rata jarak dari pusat inti sel ke
titik-titik pada batas sel;texture: variasi intensitas warna abu-abu pada citra
inti sel;perimeter: panjang keliling batas inti sel;area: luas wilayah yang ditempati inti sel;smoothness: variasi lokal panjang radius yang
menggambarkan kehalusan batas sel;compactness: ukuran kepadatan bentuk berdasarkan
hubungan keliling dan luas;concavity: tingkat atau besarnya bagian cekung pada
kontur inti sel;concave_points: jumlah titik cekung pada kontur inti
sel;symmetry: tingkat kesimetrisan bentuk inti sel;
danfractal_dimension: ukuran kompleksitas atau
ketidakteraturan batas inti sel.Setiap karakteristik diringkas menjadi tiga kelompok, yaitu nilai
rata-rata (_mean), galat baku (_se), dan nilai
terburuk atau terbesar (_worst). Dengan demikian, terdapat
30 prediktor numerik (Wolberg et al., 1993).
url_wdbc <- paste0(
"https://archive.ics.uci.edu/ml/machine-learning-databases/",
"breast-cancer-wisconsin/wdbc.data"
)
feature_names <- c(
"radius", "texture", "perimeter", "area", "smoothness",
"compactness", "concavity", "concave_points", "symmetry",
"fractal_dimension"
)
col_names <- c(
"id",
"diagnosis",
paste0(feature_names, "_mean"),
paste0(feature_names, "_se"),
paste0(feature_names, "_worst")
)
wdbc <- readr::read_csv(
url_wdbc,
col_names = col_names,
col_types = cols(
id = col_character(),
diagnosis = col_character(),
.default = col_double()
),
show_col_types = FALSE
) |>
mutate(
diagnosis = factor(
if_else(diagnosis == "M", "Malignant", "Benign"),
levels = c("Malignant", "Benign")
)
)
stopifnot(
nrow(wdbc) == 569,
ncol(wdbc) == 32,
identical(
levels(wdbc$diagnosis),
c("Malignant", "Benign")
)
)Data yang berhasil dibaca terdiri atas 569 observasi, 30 prediktor numerik, satu variabel target, dan satu variabel pengenal.
wdbc |>
slice_head(n = 5) |>
select(
id,
diagnosis,
radius_mean,
texture_mean,
area_mean,
concavity_mean,
radius_worst
) |>
knitr::kable(
digits = 3,
caption = "Lima Observasi Pertama dan Beberapa Variabel WDBC"
)| id | diagnosis | radius_mean | texture_mean | area_mean | concavity_mean | radius_worst |
|---|---|---|---|---|---|---|
| 842302 | Malignant | 17.99 | 10.38 | 1001.0 | 0.300 | 25.38 |
| 842517 | Malignant | 20.57 | 17.77 | 1326.0 | 0.087 | 24.99 |
| 84300903 | Malignant | 19.69 | 21.25 | 1203.0 | 0.197 | 23.57 |
| 84348301 | Malignant | 11.42 | 20.38 | 386.1 | 0.241 | 14.91 |
| 84358402 | Malignant | 20.29 | 14.34 | 1297.0 | 0.198 | 22.54 |
data_quality <- tibble(
Pemeriksaan = c(
"Jumlah observasi",
"Jumlah variabel",
"Jumlah nilai hilang",
"Jumlah ID duplikat",
"Jumlah baris duplikat"
),
Hasil = c(
nrow(wdbc),
ncol(wdbc),
sum(is.na(wdbc)),
sum(duplicated(wdbc$id)),
sum(duplicated(wdbc))
)
)
knitr::kable(
data_quality,
caption = "Ringkasan Pemeriksaan Kualitas Data"
)| Pemeriksaan | Hasil |
|---|---|
| Jumlah observasi | 569 |
| Jumlah variabel | 32 |
| Jumlah nilai hilang | 0 |
| Jumlah ID duplikat | 0 |
| Jumlah baris duplikat | 0 |
Tidak terdapat nilai hilang pada data (0 nilai hilang). Jumlah ID duplikat adalah 0, sehingga setiap ID merupakan pengenal observasi yang unik.
class_distribution <- wdbc |>
count(diagnosis, name = "Jumlah") |>
mutate(
Proporsi = Jumlah / sum(Jumlah),
Persentase = scales::percent(
Proporsi,
accuracy = 0.1
)
)
knitr::kable(
class_distribution |>
select(
Diagnosis = diagnosis,
Jumlah,
Persentase
),
caption = "Distribusi Kelas Diagnosis"
)| Diagnosis | Jumlah | Persentase |
|---|---|---|
| Malignant | 212 | 37.3% |
| Benign | 357 | 62.7% |
ggplot(
class_distribution,
aes(
x = diagnosis,
y = Jumlah,
fill = diagnosis
)
) +
geom_col(
width = 0.65,
show.legend = FALSE
) +
geom_text(
aes(
label = paste0(
Jumlah,
" (",
Persentase,
")"
)
),
vjust = -0.4,
color = "#4F3A48",
fontface = "bold"
) +
scale_fill_manual(
values = c(
"Malignant" = "#C65A82",
"Benign" = "#E7B8D2"
)
) +
scale_y_continuous(
expand = expansion(
mult = c(0, 0.12)
)
) +
labs(
x = "Diagnosis",
y = "Jumlah observasi"
)Distribusi Kelas Diagnosis pada Seluruh Data
Kelas benign berjumlah 357 observasi, sedangkan kelas malignant berjumlah 212 observasi. Perbedaan proporsi tersebut menjadi alasan pembagian data dilakukan secara berstrata atau stratified.
selected_features <- c(
"radius_mean",
"texture_mean",
"area_mean",
"concavity_mean",
"concave_points_mean",
"radius_worst"
)
feature_labels <- c(
"radius mean" = "Rata-rata radius",
"texture mean" = "Rata-rata tekstur",
"area mean" = "Rata-rata luas",
"concavity mean" = "Rata-rata konkavitas",
"concave points mean" = "Rata-rata titik cekung",
"radius worst" = "Radius terburuk"
)
wdbc |>
select(
diagnosis,
all_of(selected_features)
) |>
pivot_longer(
cols = -diagnosis,
names_to = "feature",
values_to = "value"
) |>
mutate(
feature = str_replace_all(
feature,
"_",
" "
),
feature = recode(
feature,
!!!feature_labels
)
) |>
ggplot(
aes(
x = diagnosis,
y = value,
fill = diagnosis
)
) +
geom_boxplot(
alpha = 0.85,
outlier.alpha = 0.35,
show.legend = FALSE
) +
facet_wrap(
~ feature,
scales = "free_y",
ncol = 2
) +
scale_fill_manual(
values = c(
"Malignant" = "#D66A7F",
"Benign" = "#D7B5E5"
)
) +
labs(
x = "Diagnosis",
y = "Nilai prediktor"
)Distribusi Prediktor Terpilih Menurut Diagnosis
Dibandingkan kelompok benign, kelompok malignant cenderung memiliki radius terburuk, rata-rata radius, rata-rata luas, rata-rata tekstur, rata-rata konkavitas, dan rata-rata titik cekung yang lebih tinggi. Radius dan luas yang lebih tinggi menunjukkan bahwa inti sel pada kelompok malignant cenderung berukuran lebih besar.
Konkavitas dan titik cekung yang lebih tinggi menunjukkan bahwa kontur inti sel kelompok malignant cenderung memiliki lekukan yang lebih besar dan lebih banyak. Rata-rata tekstur juga cenderung lebih tinggi pada kelas malignant, meskipun pemisahan kedua kelas pada prediktor tersebut terlihat lebih lemah karena distribusinya masih cukup bertumpang tindih. Oleh karena itu, klasifikasi diagnosis perlu mempertimbangkan kombinasi beberapa prediktor dan tidak hanya didasarkan pada satu karakteristik.
Data dibagi menjadi 80% data latih dan 20% data uji menggunakan pembagian berstrata. Data uji disimpan dan tidak digunakan untuk menentukan hyperparameter model.
set.seed(15062026)
split_obj <- initial_split(
wdbc,
prop = 0.80,
strata = diagnosis
)
train_dat <- training(split_obj)
test_dat <- testing(split_obj)
split_distribution <- bind_rows(
train_dat |>
count(diagnosis) |>
mutate(Data = "Latih"),
test_dat |>
count(diagnosis) |>
mutate(Data = "Uji")
) |>
group_by(Data) |>
mutate(
Proporsi = n / sum(n)
) |>
ungroup()
split_distribution |>
mutate(
Proporsi = scales::percent(
Proporsi,
accuracy = 0.1
)
) |>
select(
Data,
Diagnosis = diagnosis,
Jumlah = n,
Proporsi
) |>
knitr::kable(
format = "html",
align = c("l", "l", "r", "r"),
caption = "Distribusi Kelas pada Data Latih dan Data Uji"
) |>
collapse_rows(
columns = 1,
valign = "middle"
)| Data | Diagnosis | Jumlah | Proporsi |
|---|---|---|---|
| Latih | Malignant | 169 | 37.2% |
| Benign | 285 | 62.8% | |
| Uji | Malignant | 43 | 37.4% |
| Benign | 72 | 62.6% |
Data latih berisi 454 observasi dan data uji berisi 115 observasi. Pembagian berstrata mempertahankan komposisi kelas pada kedua bagian data.
SVM sensitif terhadap perbedaan skala karena pembentukan margin melibatkan jarak antarobservasi. Oleh karena itu, prediktor numerik dinormalisasi agar memiliki rata-rata nol dan simpangan baku satu.
Parameter normalisasi hanya dipelajari dari data latih. Variabel
id diubah perannya menjadi pengenal agar tidak digunakan
sebagai prediktor. Sebagai bagian dari prapemrosesan,
step_zv() digunakan untuk menghapus prediktor dengan
variasi nol apabila ditemukan pada data latih.
Support Vector Machine (SVM) merupakan metode klasifikasi yang membentuk hyperplane sebagai batas pemisah antara dua kelas. Untuk data yang dapat dipisahkan secara linear atau linearly separable, SVM mencari hyperplane yang tidak hanya memisahkan kedua kelas, tetapi juga menghasilkan margin maksimum.
Jika diberikan data latih \((\mathbf{x}_i,y_i)\) dengan \(y_i \in \{-1,+1\}\), fungsi keputusan linear dituliskan sebagai:
\[ f(\mathbf{x})= \mathbf{w}^{T}\mathbf{x}+b \]
dengan \(\mathbf{w}\) sebagai vektor bobot dan \(b\) sebagai bias. Kelas prediksi ditentukan berdasarkan tanda fungsi keputusan:
\[ \widehat{y}= \operatorname{sign} \left( \mathbf{w}^{T}\mathbf{x}+b \right) \]
Pada data yang dapat dipisahkan secara sempurna, setiap observasi memenuhi:
\[ y_i \left( \mathbf{w}^{T}\mathbf{x}_i+b \right) \geq 1 \]
Margin antara kedua kelas dirumuskan sebagai:
\[ \rho= \frac{2} {\lVert\mathbf{w}\rVert} \]
Memaksimumkan margin ekuivalen dengan meminimumkan norma vektor bobot:
\[ \min_{\mathbf{w},b} \frac{1}{2} \lVert\mathbf{w}\rVert^2 \]
Observasi yang terletak paling dekat dengan hyperplane disebut support vectors. Observasi tersebut menentukan posisi dan lebar margin model.
Untuk data yang tidak dapat dipisahkan secara sempurna, SVM menggunakan soft margin dengan variabel kelonggaran \(\xi_i\):
\[ y_i \left( \mathbf{w}^{T}\mathbf{x}_i+b \right) \geq 1-\xi_i, \qquad \xi_i\geq 0 \]
Fungsi optimasinya menjadi:
\[ \min_{\mathbf{w},b,\boldsymbol{\xi}} \left[ \frac{1}{2} \lVert\mathbf{w}\rVert^2 + C\sum_{i=1}^{n}\xi_i \right] \]
Parameter \(C\), yang dalam
implementasi disebut cost, mengatur keseimbangan antara
lebar margin dan penalti terhadap kesalahan klasifikasi. Nilai
cost yang besar memberikan penalti lebih kuat terhadap
kesalahan, sedangkan nilai yang kecil memberikan toleransi lebih besar
terhadap pelanggaran margin (Cortes & Vapnik, 1995).
Untuk hubungan nonlinier, SVM menggunakan fungsi kernel. Fungsi keputusan berbasis kernel dituliskan sebagai:
\[ f(\mathbf{x})= \sum_{i=1}^{n} \alpha_i y_i K(\mathbf{x}_i,\mathbf{x})+b \]
Analisis ini menggunakan kernel linear dan RBF. Kernel linear dirumuskan sebagai:
\[ K(\mathbf{x}_i,\mathbf{x}_j) = \mathbf{x}_i^{T}\mathbf{x}_j \]
Kernel RBF dirumuskan sebagai:
\[ K(\mathbf{x}_i,\mathbf{x}_j) = \exp \left( -\sigma \lVert \mathbf{x}_i-\mathbf{x}_j \rVert^2 \right) \]
Parameter \(\sigma\), yang
direpresentasikan sebagai rbf_sigma, mengatur jangkauan
pengaruh observasi. Nilai yang lebih besar menghasilkan pengaruh lebih
lokal dan batas keputusan yang lebih fleksibel, sedangkan nilai yang
lebih kecil menghasilkan batas keputusan yang lebih halus. Nilai
cost dan rbf_sigma ditentukan melalui
cross-validation (Al-Mejibli et al., 2020).
Analisis ini menggunakan 5-fold stratified cross-validation pada data latih untuk mengevaluasi performa model selama proses tuning. Pada metode ini, data latih dibagi menjadi lima lipatan (fold) dengan proporsi kelas yang tetap terjaga pada setiap lipatan. Secara bergantian, empat lipatan digunakan untuk melatih model dan satu lipatan digunakan sebagai data validasi hingga seluruh lipatan pernah berperan sebagai data validasi. Nilai performa model kemudian diperoleh dari rata-rata performa dari kelima lipatan validasi tersebut. Selama proses ini, data uji tidak digunakan sehingga evaluasi model tetap bersifat objektif dan terhindar dari data leakage (Szeghalmy & Fazekas, 2023).
Ilustrasi 5-Fold Cross-Validation (Sumber: Allgaier dan Pryss, 2024)
Gambar berikut memperlihatkan skema penerapan 5-fold stratified cross-validation dalam penelitian ini. Seluruh pelatihan model dan pemilihan hyperparameter dilakukan menggunakan data latih, sedangkan data uji dipisahkan sejak awal dan hanya digunakan pada tahap evaluasi akhir. Pendekatan ini memungkinkan kemampuan generalisasi model dievaluasi pada data yang benar-benar belum pernah digunakan selama proses pengembangan model.
## # 5-fold cross-validation using stratification
## # A tibble: 5 × 2
## splits id
## <list> <chr>
## 1 <split [363/91]> Fold1
## 2 <split [363/91]> Fold2
## 3 <split [363/91]> Fold3
## 4 <split [363/91]> Fold4
## 5 <split [364/90]> Fold5
Dalam penelitian ini, diagnosis malignant ditetapkan sebagai kelas positif, sedangkan diagnosis benign ditetapkan sebagai kelas negatif. Dengan demikian, \(TP\) merupakan kasus malignant yang diprediksi malignant, \(TN\) merupakan kasus benign yang diprediksi benign, \(FP\) merupakan kasus benign yang diprediksi malignant, dan \(FN\) merupakan kasus malignant yang diprediksi benign.
Akurasi merupakan proporsi seluruh observasi yang diklasifikasikan dengan benar:
\[ \text{Accuracy} = \frac{TP+TN} {TP+TN+FP+FN} \]
Nilai akurasi berada pada rentang nol hingga satu. Akurasi perlu diinterpretasikan bersama metrik lain karena dapat kurang informatif ketika distribusi kelas tidak seimbang (Tharwat, 2020).
Sensitivitas atau recall mengukur proporsi kasus positif aktual yang diidentifikasi dengan benar:
\[ \text{Sensitivity} = \frac{TP} {TP+FN} \]
Dalam penelitian ini, sensitivitas menunjukkan proporsi kasus malignant yang berhasil diprediksi sebagai malignant. Sensitivitas yang rendah menunjukkan lebih banyak kasus tumor ganas menjadi false negative.
Spesifisitas mengukur proporsi kasus negatif aktual yang diidentifikasi dengan benar:
\[ \text{Specificity} = \frac{TN} {TN+FP} \]
Dalam penelitian ini, spesifisitas menunjukkan proporsi kasus benign yang berhasil diprediksi sebagai benign. Spesifisitas yang rendah menunjukkan lebih banyak kasus benign menjadi false positive.
Kurva Receiver Operating Characteristic (ROC) menggambarkan hubungan antara sensitivitas dan tingkat false positive atau \(1-\text{specificity}\) pada berbagai ambang klasifikasi. Luas area di bawah kurva ROC atau AUC merangkum kemampuan diskriminasi model pada seluruh ambang tersebut.
Nilai 0,5 menunjukkan kemampuan diskriminasi yang setara dengan pengurutan acak, sedangkan nilai yang mendekati satu menunjukkan kemampuan diskriminasi yang semakin baik. ROC AUC tidak menentukan ambang keputusan terbaik sehingga tetap perlu diinterpretasikan bersama akurasi, sensitivitas, spesifisitas, dan jumlah false negative (Tharwat, 2020).
svm_linear_spec <- svm_linear(
cost = tune()
) |>
set_engine(
"kernlab",
prob.model = TRUE
) |>
set_mode("classification")
svm_rbf_spec <- svm_rbf(
cost = tune(),
rbf_sigma = tune()
) |>
set_engine(
"kernlab",
prob.model = TRUE
) |>
set_mode("classification")
svm_linear_wf <- workflow() |>
add_recipe(rec_svm) |>
add_model(svm_linear_spec)
svm_rbf_wf <- workflow() |>
add_recipe(rec_svm) |>
add_model(svm_rbf_spec)
linear_grid <- grid_regular(
cost(
range = c(-5, 5)
),
levels = 5
)
rbf_grid <- grid_regular(
cost(
range = c(-5, 5)
),
rbf_sigma(
range = c(-10, 0)
),
levels = 5
)
svm_metrics <- metric_set(
roc_auc,
accuracy,
sens,
spec
)Jumlah nilai pada grid merupakan keputusan analitik dalam
rancangan pencarian hyperparameter, sehingga rentang dan jumlah
tingkat grid SVM radial mengikuti template syntax yang
diberikan. Parameter cost diuji pada rentang \(2^{-5}\) hingga \(2^5\), sedangkan rbf_sigma
diuji pada rentang \(10^{-10}\) hingga
\(10^0\). Dengan
levels = 5, masing-masing parameter dievaluasi pada lima
tingkat.
Agar konsisten dengan template, SVM linear juga menggunakan
lima tingkat cost pada rentang \(2^{-5}\) hingga \(2^5\). Dengan demikian, SVM linear
mengevaluasi lima konfigurasi, sedangkan SVM radial mengevaluasi \(5 \times 5 = 25\) kombinasi
cost dan rbf_sigma.
ROC AUC digunakan sebagai metrik utama dalam pemilihan hyperparameter karena metrik ini mengukur kemampuan model membedakan kelas malignant dan benign pada berbagai ambang probabilitas.
set.seed(15062026)
linear_tuned <- tune_grid(
svm_linear_wf,
resamples = folds,
grid = linear_grid,
metrics = svm_metrics,
control = control_grid(
save_pred = TRUE
)
)
set.seed(15062026)
rbf_tuned <- tune_grid(
svm_rbf_wf,
resamples = folds,
grid = rbf_grid,
metrics = svm_metrics,
control = control_grid(
save_pred = TRUE
)
)linear_best_table <- show_best(
linear_tuned,
metric = "roc_auc",
n = 5
)
knitr::kable(
linear_best_table |>
select(
cost,
mean,
std_err,
n
) |>
mutate(
across(
c(cost, mean, std_err),
~ round(.x, 6)
)
),
caption = "Lima Konfigurasi Terbaik SVM Linear Berdasarkan ROC AUC"
)| cost | mean | std_err | n |
|---|---|---|---|
| 0.031250 | 0.993486 | 0.003651 | 5 |
| 0.176777 | 0.993486 | 0.003525 | 5 |
| 1.000000 | 0.992354 | 0.004733 | 5 |
| 5.656854 | 0.988335 | 0.005451 | 5 |
| 32.000000 | 0.984458 | 0.004865 | 5 |
Berdasarkan hasil cross-validation, SVM linear menghasilkan
nilai ROC AUC rata-rata tertinggi sebesar 0,99349 pada nilai
cost 0,03125 dan 0,17678. Nilai ROC AUC yang mendekati 1
menunjukkan bahwa model memiliki kemampuan yang sangat baik dalam
membedakan diagnosis malignant dan benign. Selain itu,
nilai standard error yang relatif kecil menunjukkan bahwa
performa model cukup konsisten pada berbagai lipatan validasi.
Secara umum, perbedaan ROC AUC antar nilai cost relatif
kecil pada rentang nilai rendah hingga menengah. Namun, performa model
cenderung menurun ketika nilai cost semakin besar, yang
terlihat dari penurunan ROC AUC pada cost 5,65685 dan
32,00. Hasil ini menunjukkan bahwa pemberian penalti yang terlalu tinggi
tidak meningkatkan kemampuan diskriminasi SVM linear pada data ini. Oleh
karena itu, cost sebesar 0,03125 dipilih sebagai
hyperparameter terbaik karena menghasilkan ROC AUC tertinggi
dengan kompleksitas model yang lebih sederhana dibandingkan alternatif
lainnya.
collect_metrics(linear_tuned) |>
filter(.metric == "roc_auc") |>
ggplot(
aes(
x = cost,
y = mean
)
) +
geom_ribbon(
aes(
ymin = mean - std_err,
ymax = mean + std_err
),
fill = "#F4C7D9",
alpha = 0.65
) +
geom_line(
color = "#A83E72",
linewidth = 1
) +
geom_point(
size = 2.8,
color = "#C65A82"
) +
scale_x_log10() +
labs(
x = "Cost (skala logaritmik)",
y = "Rata-rata ROC AUC"
)Performa Validasi Silang SVM Linear pada Berbagai Nilai Cost
Grafik menunjukkan bahwa performa SVM linear relatif stabil pada
nilai cost rendah hingga menengah, kemudian cenderung
menurun ketika cost semakin besar. Hal tersebut menunjukkan
bahwa peningkatan penalti terhadap kesalahan klasifikasi tidak selalu
meningkatkan kemampuan diskriminasi model. Area bayangan menunjukkan
kisaran rata-rata ROC AUC ditambah dan dikurangi standard error
pada lima lipatan. Area tersebut terlihat lebih lebar pada nilai
cost yang besar, yang mengindikasikan bahwa performa
antarlipatan cenderung lebih bervariasi. Oleh karena itu,
cost sekitar 0,03125 dipilih sebagai nilai terbaik
berdasarkan rata-rata ROC AUC tertinggi selama proses validasi
silang.
rbf_best_table <- show_best(
rbf_tuned,
metric = "roc_auc",
n = 10
)
knitr::kable(
rbf_best_table |>
select(
cost,
rbf_sigma,
mean,
std_err,
n
) |>
transmute(
cost = signif(cost, 6),
rbf_sigma = formatC(
rbf_sigma,
format = "e",
digits = 3
),
mean = round(mean, 6),
std_err = round(std_err, 6),
n
),
caption = "Sepuluh Konfigurasi Terbaik SVM Radial Berdasarkan ROC AUC"
)| cost | rbf_sigma | mean | std_err | n |
|---|---|---|---|---|
| 32.000000 | 3.162e-03 | 0.993799 | 0.003813 | 5 |
| 1.000000 | 3.162e-03 | 0.992973 | 0.003124 | 5 |
| 5.656850 | 3.162e-03 | 0.992870 | 0.004181 | 5 |
| 0.176777 | 3.162e-03 | 0.989148 | 0.003694 | 5 |
| 32.000000 | 1.000e-05 | 0.989042 | 0.003709 | 5 |
| 0.031250 | 3.162e-08 | 0.987078 | 0.004138 | 5 |
| 0.176777 | 3.162e-08 | 0.987078 | 0.004138 | 5 |
| 1.000000 | 3.162e-08 | 0.987078 | 0.004138 | 5 |
| 5.656850 | 3.162e-08 | 0.987078 | 0.004138 | 5 |
| 32.000000 | 3.162e-08 | 0.987078 | 0.004138 | 5 |
Berdasarkan hasil validasi silang, kombinasi hyperparameter
terbaik untuk SVM radial adalah cost sebesar 32 dan
rbf_sigma sebesar \(3{,}162
\times 10^{-3}\). Kombinasi tersebut menghasilkan rata-rata ROC
AUC tertinggi, yaitu 0,993799, dengan standard error sebesar
0,003813 pada lima lipatan.
Beberapa kombinasi cost dan rbf_sigma
menghasilkan nilai ROC AUC yang relatif tinggi, khususnya pada
rbf_sigma sebesar \(3{,}162
\times 10^{-3}\). Namun, perbedaan ROC AUC antarkombinasi terbaik
relatif kecil sehingga tidak menunjukkan pola peningkatan performa yang
konsisten hanya akibat perubahan nilai cost. Hasil ini
mengindikasikan bahwa performa model dipengaruhi oleh kombinasi kedua
hyperparameter secara bersamaan.
Sebaliknya, kombinasi dengan rbf_sigma yang sangat
kecil, yaitu \(3{,}162 \times
10^{-8}\), cenderung menghasilkan ROC AUC yang lebih rendah
dibandingkan kombinasi terbaik. Dengan demikian, performa SVM radial
dipengaruhi oleh interaksi antara cost dan
rbf_sigma, bukan hanya oleh satu hyperparameter.
Oleh karena itu, kombinasi cost = 32 dan
rbf_sigma = 0,003162 dipilih sebagai
hyperparameter final karena menghasilkan rata-rata ROC AUC
tertinggi selama proses validasi silang.
rbf_plot_data <- collect_metrics(
rbf_tuned
) |>
filter(.metric == "roc_auc")
ggplot(
rbf_plot_data,
aes(
x = cost,
y = rbf_sigma,
fill = mean
)
) +
geom_tile(
color = "white",
linewidth = 1
) +
geom_text(
aes(
label = sprintf(
"%.3f",
mean
)
),
color = "#493A45",
size = 3.2,
fontface = "bold"
) +
scale_x_log10() +
scale_y_log10() +
scale_fill_gradientn(
colors = c(
"#FDE8EF",
"#F8C7D8",
"#F6B8A8",
"#DFC2EA",
"#C4B5E8",
"#B65C8A"
),
name = "ROC AUC"
) +
labs(
x = "Cost (skala logaritmik)",
y = "RBF sigma (skala logaritmik)"
) +
theme(
legend.key.width = grid::unit(
1.8,
"cm"
),
panel.grid = element_blank()
)Performa Validasi Silang SVM Radial pada Kombinasi Cost dan RBF Sigma
Heatmap menunjukkan bahwa performa SVM radial dipengaruhi
oleh kombinasi cost dan rbf_sigma. Rata-rata
ROC AUC tertinggi, yaitu sekitar 0,994, diperoleh pada kombinasi
cost = 32 dan rbf_sigma = \(3{,}162 \times 10^{-3}\). Pada nilai
rbf_sigma tersebut, ROC AUC cenderung meningkat ketika
cost dinaikkan, meskipun peningkatannya relatif kecil pada
beberapa kombinasi. Hal ini menunjukkan bahwa kombinasi kedua
hyperparameter berperan dalam menentukan kemampuan diskriminasi
model.
Nilai rbf_sigma yang sangat besar, yaitu sekitar 1,
menghasilkan ROC AUC yang lebih rendah dibandingkan kombinasi terbaik,
yaitu sekitar 0,959. Sementara itu, nilai rbf_sigma yang
sangat kecil menghasilkan ROC AUC yang relatif seragam terhadap
perubahan cost, yaitu sekitar 0,982–0,989. Hasil ini
menunjukkan bahwa pengaruh cost terhadap performa model
bergantung pada nilai rbf_sigma yang digunakan.
Secara keseluruhan, konfigurasi terbaik diperoleh pada kombinasi
rbf_sigma tingkat menengah dan cost yang
tinggi. Oleh karena itu, cost = 32 dan
rbf_sigma = \(3{,}162 \times
10^{-3}\) dipilih untuk memfinalisasi SVM radial karena
menghasilkan rata-rata ROC AUC tertinggi selama proses validasi
silang.
best_linear <- select_best(
linear_tuned,
metric = "roc_auc"
)
best_rbf <- select_best(
rbf_tuned,
metric = "roc_auc"
)
cv_comparison <- bind_rows(
show_best(
linear_tuned,
metric = "roc_auc",
n = 1
) |>
mutate(Model = "SVM Linear"),
show_best(
rbf_tuned,
metric = "roc_auc",
n = 1
) |>
mutate(Model = "SVM Radial")
) |>
select(
Model,
cost,
rbf_sigma = any_of("rbf_sigma"),
ROC_AUC_CV = mean,
Standard_Error = std_err
)
selected_kernel <- cv_comparison |>
slice_max(
ROC_AUC_CV,
n = 1,
with_ties = FALSE
) |>
pull(Model)
knitr::kable(
cv_comparison |>
transmute(
Model,
Cost = signif(cost, 6),
`RBF Sigma` = if_else(
is.na(rbf_sigma),
"-",
formatC(
rbf_sigma,
format = "e",
digits = 3
)
),
`ROC AUC CV` = round(
ROC_AUC_CV,
6
),
`Galat baku` = round(
Standard_Error,
6
)
),
caption = "Perbandingan Konfigurasi Terbaik Berdasarkan Validasi Silang"
)| Model | Cost | RBF Sigma | ROC AUC CV | Galat baku |
|---|---|---|---|---|
| SVM Linear | 0.03125 | - | 0.993486 | 0.003651 |
| SVM Radial | 32.00000 | 3.162e-03 | 0.993799 | 0.003813 |
Berdasarkan hasil validasi silang, konfigurasi terbaik SVM radial menghasilkan rata-rata ROC AUC sebesar 0,993799, sedikit lebih tinggi dibandingkan SVM linear yang menghasilkan ROC AUC sebesar 0,993486. Selisih ROC AUC kedua model hanya sekitar 0,000313 sehingga kemampuan diskriminasi keduanya dapat dikatakan sangat serupa.
Nilai galat baku kedua model juga relatif kecil, yaitu 0,003651 untuk SVM linear dan 0,003813 untuk SVM radial. Hasil ini menunjukkan bahwa performa kedua model cukup konsisten antarlipatan validasi. Meskipun SVM radial menghasilkan rata-rata ROC AUC tertinggi, keunggulannya terhadap SVM linear sangat kecil.
Oleh karena itu, SVM radial dengan cost = 32 dan
rbf_sigma = 0,003162 dipilih sebagai model utama
berdasarkan nilai ROC AUC tertinggi. Namun, perbedaan performanya
terhadap SVM linear tidak bersifat substantif.
linear_final_wf <- finalize_workflow(
svm_linear_wf,
best_linear
)
rbf_final_wf <- finalize_workflow(
svm_rbf_wf,
best_rbf
)
linear_final_fit <- last_fit(
linear_final_wf,
split = split_obj,
metrics = svm_metrics
)
rbf_final_fit <- last_fit(
rbf_final_wf,
split = split_obj,
metrics = svm_metrics
)
linear_pred <- collect_predictions(
linear_final_fit
)
rbf_pred <- collect_predictions(
rbf_final_fit
)
test_metrics <- bind_rows(
collect_metrics(
linear_final_fit
) |>
mutate(Model = "SVM Linear"),
collect_metrics(
rbf_final_fit
) |>
mutate(Model = "SVM Radial")
) |>
select(
Model,
.metric,
.estimate
) |>
pivot_wider(
names_from = .metric,
values_from = .estimate
) |>
arrange(
desc(roc_auc)
)
knitr::kable(
test_metrics |>
mutate(
across(
where(is.numeric),
~ round(.x, 6)
)
) |>
rename(
Akurasi = accuracy,
`ROC AUC` = roc_auc,
`Sensitivitas malignant` = sens,
Spesifisitas = spec
),
caption = "Metrik Performa SVM pada Data Uji"
)| Model | Akurasi | Sensitivitas malignant | Spesifisitas | ROC AUC |
|---|---|---|---|---|
| SVM Radial | 0.973913 | 0.953488 | 0.986111 | 0.996447 |
| SVM Linear | 0.973913 | 0.953488 | 0.986111 | 0.995801 |
Berdasarkan tabel metrik performa, SVM radial dan SVM linear menunjukkan kinerja yang sangat baik dalam mengklasifikasikan diagnosis kanker payudara pada data uji. Kedua model menghasilkan akurasi sebesar 97,39%, yang menunjukkan bahwa 97,39% observasi pada data uji berhasil diklasifikasikan dengan benar.
Nilai sensitivitas sebesar 95,35% menunjukkan bahwa sebagian besar kasus malignant berhasil dideteksi dengan benar. Meskipun demikian, terdapat dua kasus malignant yang diprediksi sebagai benign (false negative). Di sisi lain, spesifisitas sebesar 98,61% menunjukkan bahwa hampir seluruh kasus benign berhasil diklasifikasikan dengan benar.
Nilai ROC AUC yang mendekati 1 menunjukkan bahwa kedua model memiliki kemampuan diskriminasi yang sangat baik dalam membedakan kelas malignant dan benign. SVM radial memperoleh ROC AUC sedikit lebih tinggi, yaitu 0,9964, dibandingkan SVM linear sebesar 0,9958. Namun, selisih sebesar 0,0006 tersebut sangat kecil sehingga performa kedua model pada data uji dapat dikatakan hampir setara secara praktis.
Dengan demikian, pemilihan SVM radial sebagai model utama tetap didasarkan pada hasil validasi silang, bukan pada performa data uji. SVM radial dipilih karena menghasilkan rata-rata ROC AUC validasi silang yang sedikit lebih tinggi dibandingkan SVM linear.
cm_linear <- conf_mat(
linear_pred,
truth = diagnosis,
estimate = .pred_class
)
cm_rbf <- conf_mat(
rbf_pred,
truth = diagnosis,
estimate = .pred_class
)
cm_table <- bind_rows(
as.data.frame(
cm_linear$table
) |>
mutate(Model = "SVM Linear"),
as.data.frame(
cm_rbf$table
) |>
mutate(Model = "SVM Radial")
) |>
select(
Model,
Prediction,
Truth,
Freq
)
ggplot(
cm_table,
aes(
x = Truth,
y = Prediction,
fill = Freq
)
) +
geom_tile(
color = "white",
linewidth = 1.2
) +
geom_text(
aes(label = Freq),
size = 5,
fontface = "bold",
color = "#493A45"
) +
facet_wrap(~ Model) +
scale_fill_gradientn(
colors = c(
"#FDECF2",
"#F4C6D8",
"#DABEE7",
"#B45A87"
)
) +
coord_equal() +
labs(
x = "Kelas aktual",
y = "Kelas prediksi",
fill = "Jumlah"
)Confusion Matrix SVM Linear dan SVM Radial pada Data Uji
Confusion matrix menunjukkan bahwa kedua model menghasilkan klasifikasi yang identik pada data uji. Dari 43 kasus malignant, sebanyak 41 kasus diklasifikasikan dengan benar sebagai malignant, sedangkan dua kasus diprediksi sebagai benign (false negative). Hasil ini sejalan dengan sensitivitas sebesar 95,35%, yang menunjukkan bahwa sebagian besar kasus kanker payudara ganas berhasil dideteksi oleh model.
Untuk kelas benign, sebanyak 71 dari 72 kasus diklasifikasikan dengan benar, sedangkan satu kasus benign diprediksi sebagai malignant (false positive). Kesalahan tersebut menyebabkan spesifisitas tidak mencapai 100%, tetapi tetap sangat tinggi, yaitu 98,61%.
Secara keseluruhan, kedua model menghasilkan tiga kesalahan klasifikasi dari 115 observasi pada data uji sehingga memperoleh akurasi sebesar 97,39%. Meskipun jumlah false negative relatif kecil dibandingkan total kasus malignant, performa agregat yang tinggi tidak menjamin bahwa seluruh kasus malignant dapat dideteksi.
Dalam konteks medis, dua kasus false negative tersebut tetap perlu mendapat perhatian karena pasien dengan tumor ganas dapat memperoleh hasil prediksi benign. Kesalahan semacam ini berpotensi menimbulkan rasa aman yang keliru serta menunda pemeriksaan dan penanganan lebih lanjut. Oleh karena itu, sensitivitas dan jumlah false negative perlu dipertimbangkan bersama dengan akurasi dan ROC AUC ketika mengevaluasi kelayakan model.
roc_test <- bind_rows(
roc_curve(
linear_pred,
truth = diagnosis,
.pred_Malignant
) |>
mutate(Model = "SVM Linear"),
roc_curve(
rbf_pred,
truth = diagnosis,
.pred_Malignant
) |>
mutate(Model = "SVM Radial")
)
ggplot(
roc_test,
aes(
x = 1 - specificity,
y = sensitivity,
color = Model
)
) +
geom_path(linewidth = 1.2) +
geom_abline(
slope = 1,
intercept = 0,
linetype = 2,
color = "#A990A1"
) +
coord_equal() +
scale_color_manual(
values = c(
"SVM Linear" = "#A83E72",
"SVM Radial" = "#B394D6"
)
) +
labs(
x = "1 - spesifisitas",
y = "Sensitivitas",
color = "Model"
)Kurva ROC SVM Linear dan SVM Radial pada Data Uji
Kurva ROC kedua model berada dekat dengan sudut kiri atas dan jauh dari garis diagonal klasifikasi acak. Semakin dekat kurva ke sudut kiri atas, semakin tinggi sensitivitas yang dapat dicapai dengan tingkat kesalahan klasifikasi yang rendah. Hal tersebut menunjukkan bahwa kedua model memiliki kemampuan diskriminasi yang sangat baik. Kurva yang hampir bertumpuk juga menunjukkan bahwa perbedaan performa kedua model relatif kecil, sehingga secara praktis tidak menunjukkan perbedaan performa yang substantif.
False negative merupakan kasus dengan diagnosis aktual malignant, tetapi diprediksi sebagai benign. Kesalahan ini penting karena dapat menyebabkan kasus tumor ganas tidak terdeteksi oleh model.
false_negative_summary <- bind_rows(
linear_pred |>
summarise(
Model = "SVM Linear",
False_Negative = sum(
diagnosis == "Malignant" &
.pred_class == "Benign"
),
Total_Malignant = sum(
diagnosis == "Malignant"
)
),
rbf_pred |>
summarise(
Model = "SVM Radial",
False_Negative = sum(
diagnosis == "Malignant" &
.pred_class == "Benign"
),
Total_Malignant = sum(
diagnosis == "Malignant"
)
)
) |>
mutate(
False_Negative_Rate =
False_Negative / Total_Malignant
)
knitr::kable(
false_negative_summary |>
mutate(
False_Negative_Rate =
scales::percent(
False_Negative_Rate,
accuracy = 0.1
)
),
caption = "Kasus Malignant yang Salah Diprediksi sebagai Benign"
)| Model | False_Negative | Total_Malignant | False_Negative_Rate |
|---|---|---|---|
| SVM Linear | 2 | 43 | 4.7% |
| SVM Radial | 2 | 43 | 4.7% |
Analisis false negative menunjukkan bahwa kedua model menghasilkan dua kasus false negative dari total 43 kasus malignant pada data uji sehingga diperoleh false negative rate sebesar 4,7%. Artinya, dua kasus kanker payudara ganas salah diklasifikasikan sebagai benign.
Proporsi false negative tersebut relatif rendah dan konsisten dengan sensitivitas sebesar 95,35%. Hasil ini menunjukkan bahwa SVM linear dan SVM radial memiliki kemampuan yang sangat baik dalam mendeteksi kasus malignant, meskipun belum mampu mengidentifikasi seluruh kasus secara sempurna.
Dalam konteks diagnosis kanker payudara, keberadaan false negative tetap perlu mendapat perhatian karena pasien yang sebenarnya memiliki tumor ganas berpotensi tidak memperoleh pemeriksaan lanjutan dan penanganan medis yang diperlukan. Oleh karena itu, meskipun performa kedua model secara keseluruhan sangat baik, keberadaan dua kasus false negative menunjukkan bahwa prediksi model tidak dapat digunakan sebagai pengganti diagnosis klinis dan perlu dipertimbangkan bersama hasil pemeriksaan medis lainnya.
Model utama yang dipilih melalui cross-validation adalah SVM Radial. Pada data uji, model tersebut menghasilkan akurasi sebesar 97.4%, sensitivitas kelas malignant sebesar 95.3%, spesifisitas sebesar 98.6%, dan ROC AUC sebesar 0.996447. Hasil tersebut menunjukkan bahwa model memiliki kemampuan yang sangat baik dalam membedakan diagnosis malignant dan benign pada data uji.
Sensitivitas kelas malignant menunjukkan proporsi kasus tumor ganas yang berhasil dikenali oleh model. Pada model utama terdapat 2 kasus malignant yang diprediksi sebagai benign (false negative). Kesalahan tersebut lebih kritis dibandingkan false positive karena berpotensi menyebabkan keterlambatan pemeriksaan lanjutan pada pasien yang sebenarnya memiliki tumor ganas.
Meskipun jumlah false negative relatif kecil, keberadaan kasus tersebut menunjukkan bahwa model belum mampu mendeteksi seluruh kasus malignant secara sempurna. Oleh karena itu, performa model perlu dievaluasi tidak hanya berdasarkan akurasi dan ROC AUC, tetapi juga berdasarkan implikasi praktis dari kesalahan klasifikasi yang dihasilkan.
Pada proses cross-validation, ROC AUC rata-rata SVM linear dan SVM radial praktis setara, yaitu 0.9935 dan 0.9938. Model utama tetap ditetapkan berdasarkan nilai numerik tertinggi tanpa menggunakan data uji. Pada data uji, ROC AUC kedua kernel juga praktis setara. Data uji hanya digunakan untuk evaluasi akhir dan tidak digunakan untuk mengulang proses hyperparameter tuning.
Analisis ini memiliki beberapa keterbatasan. Pertama, ukuran data relatif kecil dan evaluasi akhir hanya menggunakan satu pembagian data latih dan data uji sehingga hasil dapat dipengaruhi oleh variasi sampel. Kedua, model belum divalidasi menggunakan data eksternal dari institusi atau populasi yang berbeda sehingga kemampuan generalisasinya di luar dataset penelitian belum dapat dipastikan. Ketiga, SVM merupakan model yang berfokus pada akurasi prediksi dan tidak memberikan interpretasi pengaruh masing-masing prediktor secara langsung seperti model parametrik. Keempat, model ini dikembangkan untuk tujuan akademik dan tidak dimaksudkan untuk menggantikan diagnosis klinis maupun pemeriksaan patologis yang dilakukan oleh tenaga medis.
Hasil analisis menunjukkan bahwa karakteristik morfologi inti sel pada data WDBC mampu memberikan informasi diskriminatif yang kuat untuk membedakan diagnosis malignant dan benign. Prediktor yang menggambarkan ukuran dan ketidakteraturan kontur inti sel, seperti radius, luas, konkavitas, dan titik cekung, menunjukkan perbedaan distribusi yang jelas antara kedua kelas. Meskipun demikian, adanya tumpang tindih pada beberapa prediktor menunjukkan bahwa diagnosis tidak dapat ditentukan hanya berdasarkan satu karakteristik, tetapi memerlukan kombinasi beberapa informasi secara simultan.
Berdasarkan rata-rata ROC AUC dari 5-fold cross-validation pada data latih, model yang dipilih adalah SVM Radial. Pada data uji, model tersebut menghasilkan akurasi sebesar 97.4%, sensitivitas kelas malignant sebesar 95.3%, spesifisitas sebesar 98.6%, dan ROC AUC sebesar 0.996. Hasil tersebut menunjukkan bahwa model memiliki kemampuan diskriminasi yang sangat baik dalam membedakan kedua kelas pada data uji.
Meskipun demikian, performa agregat yang tinggi tidak berarti bahwa model terbebas dari kesalahan yang penting secara klinis. Model utama masih menghasilkan 2 kasus false negative, yaitu sampel malignant yang diprediksi sebagai benign. Kesalahan ini lebih serius dibandingkan false positive karena berpotensi memberikan keyakinan yang keliru bahwa pasien tidak memiliki keganasan sehingga dapat menunda pemeriksaan lanjutan maupun penanganan yang diperlukan. Dengan kata lain, meskipun tingkat false negative hanya sekitar 4,7%, konsekuensi dari setiap kasus yang tidak terdeteksi tetap perlu menjadi perhatian utama dalam evaluasi model untuk aplikasi medis.
Perbandingan SVM linear dan SVM radial menunjukkan bahwa kedua model memiliki performa yang hampir setara, baik pada tahap validasi silang maupun pada data uji. Keunggulan SVM radial berdasarkan ROC AUC relatif kecil sehingga tidak menunjukkan peningkatan performa yang substantif dibandingkan SVM linear. Hasil ini mengindikasikan bahwa fleksibilitas batas keputusan nonlinier tidak selalu memberikan keuntungan yang berarti pada data yang telah memiliki pemisahan kelas cukup baik.
Temuan penelitian ini masih terbatas pada satu pembagian data latih dan data uji serta belum divalidasi pada populasi eksternal. Oleh karena itu, model yang dihasilkan belum dapat digunakan sebagai pengganti diagnosis klinis. Penelitian selanjutnya perlu mengevaluasi strategi untuk menurunkan jumlah false negative, misalnya melalui penyesuaian ambang klasifikasi, pemberian bobot yang lebih besar pada kelas malignant, atau penggunaan metode lain yang lebih berorientasi pada sensitivitas. Dengan demikian, pengembangan model tidak hanya berfokus pada peningkatan akurasi dan ROC AUC, tetapi juga pada pengurangan risiko tidak terdeteksinya kasus keganasan.
WHO. (2026, April 16). Breast cancer. World Health Organization. https://www.who.int/news-room/fact-sheets/detail/breast-cancer
Wolberg, W., Mangasarian, O., Street, N., & Street, W. (1993). Breast Cancer Wisconsin (Diagnostic) [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C5DW2B
Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning, 20, 273–297. https://doi.org/10.1007/BF00994018
Al-Mejibli, I. S., Alwan, J. K., & Abd, D. H. (2020). The effect of gamma value on support vector machine performance with different kernels. International Journal of Electrical and Computer Engineering, 10(5), 5497–5506. https://doi.org/10.11591/ijece.v10i5.pp5497-5506
Szeghalmy, S., & Fazekas, A. (2023). A comparative study of stratified cross-validation and distribution-balanced stratified cross-validation in imbalanced learning. Sensors, 23(4), 2333. https://doi.org/10.3390/s23042333
Allgaier, J., & Pryss, R. (2024). Cross-validation visualized: A narrative guide to advanced methods. Machine Learning and Knowledge Extraction, 6(2), 1378–1388. https://doi.org/10.3390/make6020065
Tharwat, A. (2020). Classification assessment methods. Applied Computing and Informatics, 17(1), 168–192. https://doi.org/10.1016/j.aci.2018.08.003
parsnip. Linear support vector machines. https://parsnip.tidymodels.org/reference/svm_linear.html
parsnip. Radial basis function support vector
machines. https://parsnip.tidymodels.org/reference/svm_rbf.html
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 26200)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=English_Indonesia.utf8 LC_CTYPE=English_Indonesia.utf8
## [3] LC_MONETARY=English_Indonesia.utf8 LC_NUMERIC=C
## [5] LC_TIME=English_Indonesia.utf8
##
## time zone: Asia/Jakarta
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] kableExtra_1.4.0 kernlab_0.9-32 yardstick_1.3.2 workflowsets_1.1.0
## [5] workflows_1.3.0 tune_1.3.0 rsample_1.3.2 recipes_1.3.3
## [9] parsnip_1.6.0 modeldata_1.5.1 infer_1.1.0 dials_1.4.3
## [13] scales_1.4.0 broom_1.0.13 tidymodels_1.3.0 lubridate_1.9.4
## [17] forcats_1.0.0 stringr_1.5.0 dplyr_1.1.4 purrr_1.0.4
## [21] readr_2.1.5 tidyr_1.3.1 tibble_3.2.1 ggplot2_4.0.3
## [25] tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] conflicted_1.2.0 rlang_1.1.5 magrittr_2.0.3
## [4] furrr_0.3.1 compiler_4.3.1 systemfonts_1.2.2
## [7] vctrs_0.6.5 lhs_1.2.0 crayon_1.5.2
## [10] pkgconfig_2.0.3 fastmap_1.2.0 backports_1.5.0
## [13] labeling_0.4.3 utf8_1.2.3 rmarkdown_2.29
## [16] prodlim_2024.06.25 tzdb_0.4.0 bit_4.0.5
## [19] xfun_0.52 cachem_1.1.0 jsonlite_2.0.0
## [22] parallel_4.3.1 R6_2.5.1 bslib_0.8.0
## [25] stringi_1.7.12 RColorBrewer_1.1-3 parallelly_1.43.0
## [28] rpart_4.1.19 jquerylib_0.1.4 Rcpp_1.0.13-1
## [31] iterators_1.0.14 knitr_1.49 future.apply_1.11.3
## [34] Matrix_1.6-1 splines_4.3.1 nnet_7.3-19
## [37] timechange_0.3.0 tidyselect_1.2.1 rstudioapi_0.19.0
## [40] dichromat_2.0-0.1 yaml_2.3.10 timeDate_4041.110
## [43] codetools_0.2-19 curl_5.0.2 listenv_0.9.1
## [46] lattice_0.21-8 withr_2.5.0 S7_0.2.0
## [49] evaluate_1.0.5 future_1.34.0 survival_3.5-5
## [52] xml2_1.3.6 pillar_1.9.0 foreach_1.5.2
## [55] generics_0.1.4 vroom_1.6.5 hms_1.1.3
## [58] globals_0.18.0 class_7.3-22 glue_1.8.0
## [61] tools_4.3.1 data.table_1.16.2 gower_1.0.2
## [64] grid_4.3.1 ipred_0.9-15 cli_3.6.4
## [67] DiceDesign_1.10 fansi_1.0.4 viridisLite_0.4.2
## [70] svglite_2.1.3 lava_1.8.1 gtable_0.3.6
## [73] GPfit_1.0-8 sass_0.4.9 digest_0.6.37
## [76] farver_2.1.2 memoise_2.0.1 htmltools_0.5.8.1
## [79] lifecycle_1.0.5 hardhat_1.4.3 sparsevctrs_0.3.2
## [82] bit64_4.0.5 MASS_7.3-60