Klasifikasi merupakan salah satu metode machine learning yang digunakan untuk mengelompokkan objek ke dalam kelas berdasarkan variabel prediktor. Metode ensemble menggabungkan beberapa model untuk memperoleh prediksi yang lebih stabil. Salah satu metode ensemble adalah Bootstrap Aggregating atau Bagging, yang membangun model dari beberapa sampel bootstrap yang diambil dari data latih.
Jumlah model bootstrap dapat memengaruhi hasil prediksi dan waktu
komputasi. Oleh karena itu, praktikum ini membandingkan Bagging
Classification dengan jumlah bootstrap (nbagg) sebesar 25,
50, dan 100 pada dataset Breast Cancer. Kinerja model dinilai
menggunakan confusion matrix, accuracy, precision, recall, specificity,
dan F1-score.
nbagg
sebesar 25, 50, dan 100?nbagg sebesar 25, 50, dan
100.Praktikum ini diharapkan menambah pemahaman mengenai metode ensemble, penerapan Bagging Classification, serta penggunaan confusion matrix dan metrik evaluasi untuk membandingkan model klasifikasi.
BreastCancer dari paket
mlbench.Id dihapus karena hanya merupakan identitas
pengamatan.ipred::bagging()
dengan nbagg = 25, 50, dan 100.malignant ditetapkan sebagai kelas positif.Laporan terdiri dari pendahuluan, tinjauan pustaka, metode penelitian, hasil dan pembahasan, kesimpulan dan saran, daftar pustaka, serta lampiran kode.
Klasifikasi adalah metode pembelajaran terawasi (supervised learning) yang mempelajari hubungan antara variabel prediktor dan variabel respons kategorik. Model yang diperoleh digunakan untuk memprediksi kelas pada data baru.
Bagging membangun sejumlah model dari sampel bootstrap, yaitu sampel
yang diambil dari data latih dengan pengembalian. Pada klasifikasi,
prediksi akhir ditentukan dengan menggabungkan prediksi model-model
tersebut melalui voting. Parameter nbagg pada fungsi
ipred::bagging() menentukan banyaknya model bootstrap yang
dibangun.
Dengan malignant sebagai kelas positif, confusion matrix
terdiri dari:
Metrik yang digunakan adalah:
\[ Accuracy = \frac{TP+TN}{TP+TN+FP+FN} \]
\[ Precision = \frac{TP}{TP+FP} \]
\[ Recall = \frac{TP}{TP+FN} \]
\[ Specificity = \frac{TN}{TN+FP} \]
\[ F1 = 2 \times \frac{Precision \times Recall}{Precision+Recall} \]
Accuracy mengukur proporsi prediksi yang benar secara keseluruhan. Precision mengukur ketepatan prediksi positif, recall mengukur kemampuan menemukan kasus positif, specificity mengukur kemampuan mengenali kelas negatif, dan F1-score merupakan rata-rata harmonik precision dan recall.
Data yang digunakan adalah data sekunder berupa dataset
BreastCancer dari paket mlbench pada R. Data
memiliki variabel respons Class dengan kategori
benign dan malignant, serta sembilan variabel
prediktor setelah variabel identitas Id dihapus.
var_tab <- data.frame(
Variabel = c("Class", "Cl.thickness", "Cell.size", "Cell.shape",
"Marg.adhesion", "Epith.c.size", "Bare.nuclei",
"Bl.cromatin", "Normal.nucleoli", "Mitoses"),
Peran = c("Respons (Y)", rep("Prediktor", 9)),
Keterangan = c(
"Kelas sampel: benign atau malignant",
"Ketebalan gumpalan sel",
"Keseragaman ukuran sel",
"Keseragaman bentuk sel",
"Perlekatan marginal",
"Ukuran sel epitel tunggal",
"Inti sel telanjang",
"Kromatin",
"Nukleolus normal",
"Mitosis"
)
)
knitr::kable(var_tab, caption = "Tabel 3.1 Variabel penelitian")
| Variabel | Peran | Keterangan |
|---|---|---|
| Class | Respons (Y) | Kelas sampel: benign atau malignant |
| Cl.thickness | Prediktor | Ketebalan gumpalan sel |
| Cell.size | Prediktor | Keseragaman ukuran sel |
| Cell.shape | Prediktor | Keseragaman bentuk sel |
| Marg.adhesion | Prediktor | Perlekatan marginal |
| Epith.c.size | Prediktor | Ukuran sel epitel tunggal |
| Bare.nuclei | Prediktor | Inti sel telanjang |
| Bl.cromatin | Prediktor | Kromatin |
| Normal.nucleoli | Prediktor | Nukleolus normal |
| Mitoses | Prediktor | Mitosis |
Tahapan analisis meliputi pemanggilan data, pembersihan data,
pembagian data menjadi data latih dan data uji, pembangunan model
Bagging dengan tiga nilai nbagg, prediksi kelas data uji,
penghitungan metrik evaluasi, serta perbandingan hasil model.
Gambar 3.1. Diagram alir penerapan Bagging Classification.
# Memuat dataset ke environment tersendiri
env_data <- new.env()
data("BreastCancer", package = "mlbench", envir = env_data)
data_awal <- env_data$BreastCancer
cat("Jumlah baris awal:", nrow(data_awal), "\n")
## Jumlah baris awal: 699
cat("Jumlah kolom awal:", ncol(data_awal), "\n")
## Jumlah kolom awal: 11
# Menghapus kolom identitas
data_analisis <- data_awal
data_analisis$Id <- NULL
# Mengatur kelas respons
data_analisis$Class <- factor(
as.character(data_analisis$Class),
levels = c("benign", "malignant")
)
# Mengubah variabel prediktor menjadi numerik
for (k in setdiff(names(data_analisis), "Class")) {
data_analisis[[k]] <- suppressWarnings(
as.numeric(as.character(data_analisis[[k]]))
)
}
# Menghapus pengamatan yang memiliki nilai hilang
n_awal <- nrow(data_analisis)
data_analisis <- na.omit(data_analisis)
n_akhir <- nrow(data_analisis)
# Membagi data secara terstratifikasi: 70% latih dan 30% uji
set.seed(234)
idx <- caret::createDataPartition(
data_analisis$Class, p = 0.70, list = FALSE
)
data_train <- data_analisis[idx, , drop = FALSE]
data_test <- data_analisis[-idx, , drop = FALSE]
ringkasan_data <- data.frame(
Keterangan = c("Data awal", "Data setelah menghapus NA", "Data latih", "Data uji"),
Jumlah = c(n_awal, n_akhir, nrow(data_train), nrow(data_test))
)
knitr::kable(ringkasan_data, caption = "Tabel 4.1 Ringkasan jumlah pengamatan")
| Keterangan | Jumlah |
|---|---|
| Data awal | 699 |
| Data setelah menghapus NA | 683 |
| Data latih | 479 |
| Data uji | 204 |
Setelah variabel identitas dihapus dan baris dengan data hilang dikeluarkan, data dibagi menjadi data latih sebesar 70% dan data uji sebesar 30%. Pembagian terstratifikasi dilakukan agar proporsi kelas pada data latih dan data uji relatif terjaga.
# Menetapkan jumlah bootstrap yang dibandingkan
nilai_nbagg <- c(25, 50, 100)
hasil_model <- list()
confusion_list <- list()
prediksi_list <- list()
# Membuat model dengan data latih yang sama
for (i in seq_along(nilai_nbagg)) {
n <- nilai_nbagg[i]
nama_model <- paste0("Bagging_", n)
set.seed(234)
model <- ipred::bagging(
Class ~ .,
data = data_train,
nbagg = n,
coob = TRUE
)
prediksi <- predict(model, newdata = data_test, type = "class")
prediksi <- factor(as.character(prediksi), levels = c("benign", "malignant"))
# Confusion matrix dengan malignant sebagai kelas positif
cm <- caret::confusionMatrix(
data = prediksi,
reference = data_test$Class,
positive = "malignant",
mode = "everything"
)
confusion_list[[nama_model]] <- cm
prediksi_list[[nama_model]] <- prediksi
# Mengambil metrik evaluasi
hasil_model[[i]] <- data.frame(
Model = nama_model,
nbagg = n,
Accuracy = unname(cm$overall["Accuracy"]),
Precision = unname(cm$byClass["Precision"]),
Recall = unname(cm$byClass["Recall"]),
Specificity = unname(cm$byClass["Specificity"]),
F1_Score = unname(cm$byClass["F1"]),
TP = unname(cm$table["malignant", "malignant"]),
TN = unname(cm$table["benign", "benign"]),
FP = unname(cm$table["malignant", "benign"]),
FN = unname(cm$table["benign", "malignant"])
)
}
tabel_metrik <- do.call(rbind, hasil_model)
rownames(tabel_metrik) <- NULL
# Membulatkan metrik agar tabel lebih mudah dibaca
tabel_tampil <- tabel_metrik
kolom_numerik <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")
tabel_tampil[kolom_numerik] <- lapply(
tabel_tampil[kolom_numerik], round, digits = 4
)
knitr::kable(
tabel_tampil,
caption = "Tabel 4.2 Perbandingan metrik evaluasi Bagging Classification"
)
| Model | nbagg | Accuracy | Precision | Recall | Specificity | F1_Score | TP | TN | FP | FN |
|---|---|---|---|---|---|---|---|---|---|---|
| Bagging_25 | 25 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_50 | 50 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_100 | 100 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
Nilai metrik berada pada rentang 0 sampai 1. Nilai yang lebih besar
menunjukkan hasil lebih baik untuk metrik tersebut. Pada konteks ini,
recall penting diperhatikan karena menunjukkan kemampuan model mengenali
kasus malignant.
for (nama_model in names(confusion_list)) {
cat("\n\n### ", nama_model, "\n\n", sep = "")
print(knitr::kable(
as.data.frame.matrix(confusion_list[[nama_model]]$table),
caption = paste("Confusion matrix", nama_model)
))
cat("\n\n")
}
| benign | malignant | |
|---|---|---|
| benign | 130 | 5 |
| malignant | 3 | 66 |
| benign | malignant | |
|---|---|---|
| benign | 130 | 5 |
| malignant | 3 | 66 |
| benign | malignant | |
|---|---|---|
| benign | 130 | 5 |
| malignant | 3 | 66 |
Confusion matrix memperlihatkan jumlah prediksi benar dan salah untuk
masing-masing kelas. FP adalah kasus benign yang diprediksi
malignant, sedangkan FN adalah kasus malignant yang
diprediksi benign.
kolom_metrik <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")
data_plot <- data.frame(
Model = rep(tabel_metrik$Model, times = length(kolom_metrik)),
Metrik = rep(kolom_metrik, each = nrow(tabel_metrik)),
Nilai = as.vector(as.matrix(tabel_metrik[, kolom_metrik]))
)
ggplot(data_plot, aes(x = Model, y = Nilai, fill = Metrik)) +
geom_col(position = position_dodge(width = 0.8), width = 0.7) +
scale_fill_brewer(palette = "Set2") +
coord_cartesian(ylim = c(0, 1)) +
labs(
title = "Perbandingan Metrik Evaluasi Model Bagging",
x = "Model",
y = "Nilai metrik"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "bottom"
)
Grafik digunakan untuk membandingkan accuracy, precision, recall, specificity, dan F1-score pada ketiga model. Perbedaan nilai metrik menunjukkan perubahan kinerja ketika jumlah bootstrap ditingkatkan.
Model terbaik ditentukan berdasarkan accuracy tertinggi. Jika accuracy sama, F1-score menjadi kriteria pembanding. Pemilihan ini hanya digunakan untuk keperluan praktikum dan tidak menjamin performa terbaik pada data lain.
# Mengurutkan model berdasarkan accuracy, lalu F1-score
peringkat <- tabel_metrik[
order(-tabel_metrik$Accuracy, -tabel_metrik$F1_Score),
]
rownames(peringkat) <- NULL
peringkat_tampil <- peringkat
peringkat_tampil[kolom_metrik] <- lapply(
peringkat_tampil[kolom_metrik], round, digits = 4
)
knitr::kable(
peringkat_tampil,
caption = "Tabel 4.3 Peringkat model berdasarkan accuracy dan F1-score"
)
| Model | nbagg | Accuracy | Precision | Recall | Specificity | F1_Score | TP | TN | FP | FN |
|---|---|---|---|---|---|---|---|---|---|---|
| Bagging_25 | 25 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_50 | 50 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_100 | 100 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
model_terbaik <- peringkat[1, ]
cat(
"\nModel terbaik berdasarkan aturan evaluasi adalah",
model_terbaik$Model,
"dengan accuracy",
round(model_terbaik$Accuracy, 4),
"dan F1-score",
round(model_terbaik$F1_Score, 4),
".\n"
)
##
## Model terbaik berdasarkan aturan evaluasi adalah Bagging_25 dengan accuracy 0.9608 dan F1-score 0.9429 .
Berdasarkan aturan tersebut, model pada peringkat pertama merupakan
model dengan accuracy tertinggi dan, jika diperlukan, F1-score tertinggi
sebagai pemecah nilai seri. Interpretasi akhir sebaiknya juga
mempertimbangkan recall dan jumlah FN, khususnya karena
kelas positif yang digunakan adalah malignant.
Bagging Classification diterapkan pada dataset Breast Cancer
menggunakan fungsi ipred::bagging() dengan jumlah bootstrap
25, 50, dan 100. Data dibersihkan dan dibagi menjadi data latih dan data
uji secara terstratifikasi. Kinerja setiap model dibandingkan
menggunakan confusion matrix, accuracy, precision, recall, specificity,
dan F1-score.
Model terbaik ditentukan berdasarkan accuracy tertinggi, dengan F1-score sebagai pembanding jika terdapat nilai accuracy yang sama. Model yang memperoleh peringkat pertama dan nilai metriknya dapat dilihat pada Tabel 4.3. Kesimpulan berlaku untuk pembagian data dan pengaturan yang digunakan pada praktikum ini.
Analisis berikutnya dapat menggunakan validasi silang atau beberapa pembagian data untuk memeriksa kestabilan hasil. Perbandingan dengan metode klasifikasi lain juga dapat dilakukan menggunakan data uji dan metrik evaluasi yang sama. Untuk kasus klasifikasi kesehatan, recall dan jumlah false negative sebaiknya turut diperhatikan, bukan hanya accuracy.
Breiman, L. (1996). Bagging predictors. Machine Learning, 24(2), 123–140.
Kuhn, M. (2008). Building predictive models in R using the caret package. Journal of Statistical Software, 28(5), 1–26.
R Core Team. (2026). R: A language and environment for statistical computing. R Foundation for Statistical Computing.
Kode program tersedia pada setiap bagian kode dalam laporan ini. Jalankan dokumen menggunakan tombol Knit di RStudio untuk menghasilkan laporan HTML yang memuat tabel, diagram alir, confusion matrix, grafik, dan hasil evaluasi berdasarkan perhitungan aktual.