Pada praktikum sebelumnya, klasifikasi kondisi kanker payudara dilakukan menggunakan satu pohon keputusan dengan metode CART. Pohon keputusan mudah dibaca dan diinterpretasikan, tetapi termasuk metode yang tidak stabil, yaitu perubahan kecil pada data training dapat menghasilkan struktur pohon yang sangat berbeda (Breiman, 1996; Hastie dkk., 2009). Akibatnya, prediksi dari satu pohon memiliki variance yang tinggi. Salah satu cara untuk mengatasi masalah ini adalah dengan menggabungkan banyak model menjadi satu model gabungan, yang dikenal sebagai pendekatan ensemble (Dietterich, 2000; Zhou, 2012).
Bootstrap aggregating atau Bagging adalah salah satu meta-algoritma ensemble yang diusulkan oleh Leo Breiman (1996). Bagging membentuk banyak model dari sampel-sampel bootstrap, yaitu sampel yang diambil secara acak dengan pengembalian dari data training (Efron & Tibshirani, 1993). Setiap model dilatih secara terpisah, kemudian hasil prediksinya digabungkan, yaitu melalui voting mayoritas pada kasus klasifikasi dan rata-rata pada kasus regresi. Cara ini dapat meningkatkan stabilitas dan akurasi model serta mengurangi overfitting. Bagging efektif untuk menurunkan variance, tetapi tidak efektif untuk menurunkan bias, sehingga paling cocok digunakan pada model yang kompleks dengan variance tinggi dan bias rendah, seperti pohon keputusan yang dibiarkan tumbuh penuh (Breiman, 1996; James dkk., 2021). Selain itu, data yang tidak terambil pada setiap sampel bootstrap (out-of-bag) dapat digunakan untuk memperkirakan galat model tanpa memerlukan data uji terpisah.
Kanker payudara merupakan kanker yang paling banyak didiagnosis di dunia pada tahun 2020 dengan sekitar 2,3 juta kasus baru (Sung dkk., 2021), sehingga model yang mampu membedakan tumor jinak (benign) dan ganas (malignant) dengan baik tetap penting untuk dikaji. Dataset BreastCancer pada paket mlbench yang digunakan pada Pertemuan 2 kembali digunakan pada praktikum ini. Jumlah sampel bootstrap (nbagg) yang digunakan perlu sesuai, tidak terlalu sedikit dan tidak terlalu banyak, sehingga pada praktikum ini dibandingkan tiga nilai nbagg, yaitu 25, 50, dan 100. Kemampuan model dievaluasi menggunakan confusion matrix (Sokolova & Lapalme, 2009), out-of-bag error, serta kurva ROC dan AUC (Fawcett, 2006). Berdasarkan hal tersebut, pada praktikum Pertemuan 3 ini dilakukan Bagging Classification untuk mengklasifikasikan kondisi kanker payudara menggunakan RStudio.
Berdasarkan latar belakang di atas, rumusan masalah dalam praktikum ini adalah sebagai berikut:
Berdasarkan rumusan masalah di atas, tujuan praktikum ini adalah sebagai berikut:
Adapun manfaat pada penelitian ini yaitu:
Adapun batasan masalah pada praktikum ini adalah gunakan data breast cancer kemudian lakukan bagging classification dengan bandingkan hasil dengan menggunakan nbagg = c(25, 50, 100). Kemudian hitung metrik evaluasinya.
Adapun sistematika penulisan dari praktikum ini adalah:
BAB IPENDAHULUAN
Bab I terdiri dari latar belakang, rumusan masalah, tujuan penelitian, manfaat penelitian, batasan masalah, dan sistematika penulisan.
BAB IITINJAUAN PUSTAKA
Bab ini berisi kajian pustaka dari jurnal, buku, dan informasi pendukung tentang Bagging dan evaluasi model klasifikasi.
BAB IIIMETODE PENELITIAN
Bab ini terdiri dari sumber data, variabel penelitian, langkah-langkah analisis, dan diagram alir.
BAB IVHASIL DAN PEMBAHASAN
Bab ini merupakan tahapan pencapaian hasil yang diperoleh dari analisis data yang dilakukan serta penjelasan dari hasil tersebut di bagian pembahasan.
BAB VKESIMPULAN DAN SARAN
Bab ini merupakan bagian penutup dalam laporan ini berupa penarikan kesimpulan mengenai hasil analisis dari penelitian serta penyampaian saran oleh penulis.
DAFTAR PUSTAKA
LAMPIRAN
Ensemble learning adalah pendekatan yang menggabungkan beberapa model (base learner) untuk menghasilkan satu prediksi akhir. Gabungan beberapa model umumnya memberikan prediksi yang lebih akurat dan stabil dibandingkan satu model saja, terutama jika model-model penyusunnya cukup beragam (Dietterich, 2000). Berdasarkan cara pembentukannya, metode ensemble dibedakan menjadi metode paralel, yaitu model-model dibangun secara independen seperti pada Bagging, dan metode sekuensial, yaitu model dibangun berurutan dengan memperbaiki kesalahan model sebelumnya seperti pada Boosting (Zhou, 2012).
Bootstrap adalah metode pengambilan sampel ulang (resampling) yang diperkenalkan oleh Efron (1979). Dari data berukuran \(n\), diambil sampel berukuran \(n\) secara acak dengan pengembalian, sehingga satu observasi dapat terambil lebih dari sekali dan observasi lain dapat tidak terambil sama sekali. Peluang suatu observasi tidak terambil pada satu sampel bootstrap adalah \[ \left(1 - \frac{1}{n}\right)^{n} \approx e^{-1} \approx 0{,}368 \tag{2.1} \] untuk \(n\) yang besar (Efron & Tibshirani, 1993). Artinya, setiap sampel bootstrap rata-rata hanya memuat sekitar 63,2% observasi yang berbeda dari data asli, sedangkan sekitar 36,8% sisanya tidak terambil dan disebut data out-of-bag (OOB).
Bagging adalah meta-algoritma ensemble yang menggabungkan model-model yang dilatih pada sampel bootstrap yang berbeda (Breiman, 1996). Metode ini dapat digunakan bersama algoritma apa pun, tetapi paling sering diterapkan pada pohon keputusan. Secara garis besar, langkah-langkah Bagging adalah sebagai berikut.
Alur kerja Bagging dapat dilihat pada Gambar 1.
Gambar 1. Alur kerja Bagging Classification
Pada Gambar 1, data training diambil sampelnya secara bootstrap sebanyak \(B\) kali. Setiap sampel digunakan untuk membangun satu pohon, sehingga terbentuk \(B\) pohon yang dibangun secara paralel dan independen. Ketika ada data baru, setiap pohon memberikan prediksinya sendiri, lalu prediksi akhir ditentukan berdasarkan suara terbanyak.
Pada kasus klasifikasi dengan \(K\) kelas, prediksi akhir Bagging untuk observasi \(x\) adalah kelas yang paling banyak dipilih oleh \(B\) pohon, yaitu \[ \hat{C}_{\text{bag}}(x) = \underset{k}{\arg\max} \sum_{b=1}^{B} I\left(\hat{C}_b(x) = k\right) \tag{2.2} \] dengan \(\hat{C}_b(x)\) adalah kelas hasil prediksi pohon ke-\(b\) dan \(I(\cdot)\) adalah fungsi indikator yang bernilai 1 jika kondisi terpenuhi dan 0 jika tidak. Jika jumlah pohon genap, dapat terjadi suara seri antarkelas. Pada paket ipred, kelas untuk observasi yang seri dipilih secara acak. Probabilitas kelas ke-\(k\) dapat dihitung sebagai proporsi suara, yaitu \[ \hat{p}_k(x) = \frac{1}{B}\sum_{b=1}^{B} I\left(\hat{C}_b(x) = k\right) \tag{2.3} \]
Pada kasus regresi, prediksi akhir adalah rata-rata prediksi seluruh model (Hastie dkk., 2009), yaitu \[ \hat{f}_{\text{bag}}(x) = \frac{1}{B}\sum_{b=1}^{B}\hat{f}_b(x) \tag{2.4} \] dengan \(\hat{f}_b(x)\) adalah nilai prediksi model ke-\(b\).
Alasan Bagging dapat menurunkan variance dapat dilihat dari sifat rata-rata. Jika \(B\) prediksi masing-masing memiliki variance \(\sigma^2\) dan korelasi antarpasangan sebesar \(\rho\), maka variance rata-ratanya adalah \[ \text{Var}\left(\hat{f}_{\text{bag}}\right) = \rho\,\sigma^2 + \frac{1 - \rho}{B}\,\sigma^2 \tag{2.5} \]
Suku kedua pada Persamaan (2.5) mengecil ketika \(B\) bertambah, sedangkan suku pertama tetap (Hastie dkk., 2009). Jadi, menambah jumlah pohon akan menurunkan variance sampai batas tertentu, setelah itu penurunannya tidak berarti lagi. Bias model gabungan sama dengan bias setiap pohon, sehingga Bagging tidak efektif untuk menurunkan bias. Beberapa sifat penting Bagging adalah sebagai berikut.
Random Forest merupakan pengembangan dari Bagging. Selain menggunakan sampel bootstrap, Random Forest hanya mempertimbangkan sebagian variabel prediktor yang dipilih secara acak pada setiap pemisahan, sehingga korelasi antarpohon (\(\rho\)) pada Persamaan (2.5) menjadi lebih kecil (Breiman, 2001).
Perbedaan Bagging Classification dan Bagging Regression dapat dilihat pada Tabel 1.
| Aspek | Bagging Classification Tree | Bagging Regression Tree |
|---|---|---|
| Variabel respon | Kategorik | Numerik atau kontinu |
| Agregasi | Voting mayoritas atau rata-rata probabilitas | Rata-rata nilai prediksi |
| Metrik evaluasi | Accuracy, Precision, Recall, F1-Score, ROC-AUC | MSE, RMSE, MAE, R-Square |
Pada R, Bagging untuk pohon keputusan tersedia pada fungsi bagging() dari paket ipred (Peters dkk., 2002). Argumen nbagg menentukan banyaknya sampel bootstrap sekaligus banyaknya pohon (default 25), sedangkan coob = TRUE digunakan untuk menghitung out-of-bag error. Setiap pohon dibangun menggunakan rpart dengan pengaturan minsplit = 2, cp = 0, dan xval = 0, sehingga pohon dibiarkan tumbuh penuh tanpa pruning.
Karena setiap pohon hanya dilatih menggunakan sekitar 63,2% observasi, sekitar 36,8% observasi sisanya (data OOB) dapat digunakan untuk menguji pohon tersebut. Untuk setiap observasi \(i\), prediksi OOB diperoleh dengan menggabungkan suara dari pohon-pohon yang tidak menggunakan observasi \(i\) saat dilatih. Out-of-bag error untuk klasifikasi dihitung sebagai \[ \text{Err}_{\text{OOB}} = \frac{1}{n}\sum_{i=1}^{n} I\left(y_i \neq \hat{C}_{\text{OOB}}(x_i)\right) \tag{2.6} \] dengan \(y_i\) adalah kelas aktual dan \(\hat{C}_{\text{OOB}}(x_i)\) adalah kelas hasil prediksi OOB. Out-of-bag error merupakan perkiraan galat data uji yang valid tanpa perlu memisahkan data uji maupun melakukan validasi silang (Breiman, 1996; James dkk., 2021).
Missing value dapat ditangani dengan imputasi menggunakan Multivariate Imputation by Chained Equations (MICE), yaitu mengisi data kosong secara berantai menggunakan model dari variabel-variabel lain. Pada paket mice, variabel kategorik tidak berurutan dengan lebih dari dua kategori diimputasi menggunakan regresi logistik multinomial (polyreg) (van Buuren & Groothuis-Oudshoorn, 2011). Setelah data lengkap, data dibagi menjadi data training untuk melatih model dan data testing untuk menguji model pada data yang belum pernah dilihat (Muraina, 2022). Pembagian dilakukan secara stratified menggunakan fungsi createDataPartition() dari paket caret agar proporsi kelas pada data training dan testing sama dengan data awal (Kuhn, 2008).
Evaluasi model klasifikasi dilakukan dengan membandingkan kelas aktual dan kelas hasil prediksi dalam confusion matrix (Sokolova & Lapalme, 2009) seperti pada Tabel 2.
| Predicted Positive | Predicted Negative | |
|---|---|---|
| Actual Positive | True Positive (TP) | False Negative (FN) |
| Actual Negative | False Positive (FP) | True Negative (TN) |
Ukuran evaluasi yang digunakan adalah sebagai berikut. \[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \tag{2.7} \] \[ \text{Precision} = \frac{TP}{TP + FP} \tag{2.8} \] \[ \text{Recall} = \frac{TP}{TP + FN} \tag{2.9} \] \[ \text{Specificity} = \frac{TN}{TN + FP} \tag{2.10} \] \[ \text{F1-Score} = 2\left(\frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}\right) \tag{2.11} \]
Accuracy adalah proporsi prediksi yang benar, precision adalah proporsi prediksi positif yang benar-benar positif, recall adalah kemampuan model mengenali kelas positif, specificity adalah kemampuan model mengenali kelas negatif, dan F1-Score adalah rata-rata harmonik dari precision dan recall. Kelas positif yang digunakan adalah malignant (ganas), sehingga False Negative berarti tumor ganas yang diprediksi jinak dan False Positive berarti tumor jinak yang diprediksi ganas.
Kurva ROC menggambarkan hubungan antara True Positive Rate (TPR) dan False Positive Rate (FPR) pada berbagai nilai ambang batas probabilitas, dengan \[ \text{TPR} = \frac{TP}{TP + FN} \tag{2.12} \] \[ \text{FPR} = \frac{FP}{FP + TN} = 1 - \text{Specificity} \tag{2.13} \]
TPR pada Persamaan (2.12) sama dengan recall pada Persamaan (2.9). Kurva yang semakin mendekati sudut kiri atas menunjukkan model yang semakin baik (Fawcett, 2006). Area Under the Curve (AUC) adalah luas di bawah kurva ROC dengan nilai antara 0 dan 1. Nilai AUC 0,5 berarti model tidak mampu membedakan kedua kelas. Menurut Hosmer dkk. (2013), nilai AUC 0,7 sampai kurang dari 0,8 tergolong cukup baik (acceptable), 0,8 sampai kurang dari 0,9 tergolong sangat baik (excellent), dan 0,9 atau lebih tergolong luar biasa (outstanding).
Data yang digunakan adalah data sekunder berupa dataset BreastCancer yang tersedia pada paket mlbench di R (Leisch & Dimitriadou, 2010). Data ini berasal dari penelitian Wolberg dan Mangasarian (1990) yang dikumpulkan di University of Wisconsin Hospitals, Madison. Data terdiri dari 699 observasi dan 11 variabel, yaitu satu variabel pengenal, sembilan variabel karakteristik sel, dan satu variabel kelas.
Variabel yang digunakan terdiri dari satu variabel target dan sembilan variabel prediktor. Variabel target (Y) adalah Class yang terdiri dari dua kategori, yaitu benign (jinak) dan malignant (ganas). Variabel prediktor (X) berupa hasil penilaian karakteristik sel dengan skor 1 sampai 10 yang pada R terbaca sebagai data kategorik (factor). Variabel Id hanya berupa kode pengenal sampel sehingga tidak digunakan dalam analisis. Rincian variabel dapat dilihat pada Tabel 3.
| Variabel | Keterangan | Peran |
|---|---|---|
| Id | Kode sampel | Tidak digunakan |
| Cl.thickness | Ketebalan gumpalan sel (clump thickness) | Prediktor (X1) |
| Cell.size | Keseragaman ukuran sel | Prediktor (X2) |
| Cell.shape | Keseragaman bentuk sel | Prediktor (X3) |
| Marg.adhesion | Adhesi marginal (marginal adhesion) | Prediktor (X4) |
| Epith.c.size | Ukuran sel epitel tunggal | Prediktor (X5) |
| Bare.nuclei | Inti sel telanjang (bare nuclei) | Prediktor (X6) |
| Bl.cromatin | Kromatin halus (bland chromatin) | Prediktor (X7) |
| Normal.nucleoli | Nukleolus normal | Prediktor (X8) |
| Mitoses | Mitosis | Prediktor (X9) |
| Class | Kondisi tumor: benign atau malignant | Target (Y) |
Langkah-langkah analisis yang dilakukan adalah sebagai berikut.
Gambar 2. Diagram alir penelitian
Library yang digunakan adalah MASS, survival, ipred, mlbench, mice, caret, ROCR, dan ggplot2. Paket ipred digunakan untuk membangun model Bagging (paket MASS dan survival dipanggil sesuai sintaks modul karena dibutuhkan oleh ipred), mlbench untuk mengambil dataset, mice untuk imputasi, caret untuk membagi data, ROCR untuk AUC dan kurva ROC, serta ggplot2 untuk visualisasi.
library(MASS)
library(survival)
library(ipred)
library(mlbench)
library(mice)
library(caret)
library(ROCR)
library(ggplot2)## 'data.frame': 699 obs. of 11 variables:
## $ Id : chr "1000025" "1002945" "1015425" "1016277" ...
## $ Cl.thickness : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
## $ Class : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
## [1] 699 10
##
## benign malignant
## 458 241
##
## benign malignant
## 65.52 34.48
Data terdiri dari 699 observasi dan 11 variabel. Seluruh variabel karakteristik sel bertipe kategorik (Ord.factor atau Factor) dengan skor 1 sampai 10, sedangkan Class memiliki dua level, yaitu benign dan malignant. Setelah Id dihapus, data tersisa 10 variabel dengan 458 observasi benign (65,52%) dan 241 observasi malignant (34,48%).
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 16 0 0 0 0
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## "" "" "" "" ""
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## "polyreg" "" "" "" ""
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 0 0 0 0 0
Missing value hanya terdapat pada Bare.nuclei sebanyak 16 data. Sebenarnya fungsi bagging() tetap dapat dijalankan tanpa imputasi, seperti pada sintaks modul, karena setiap pohon dibangun dengan rpart yang dapat menangani data kosong melalui surrogate split. Namun, data kosong tetap diisi menggunakan mice dengan pengaturan yang sama seperti Pertemuan 2 (m = 5, maxit = 5, seed = 234) agar penanganan data tetap konsisten dan seluruh observasi memiliki nilai lengkap, baik saat model dibangun maupun saat prediksi. Bare.nuclei diimputasi menggunakan metode polyreg dan setelah imputasi tidak ada lagi data kosong.
set.seed(234)
train <- createDataPartition(data_imp$Class, p = 0.7, list = FALSE)
BC.train <- data_imp[train, ]
BC.test <- data_imp[-train, ]
dim(BC.train)## [1] 490 10
## [1] 209 10
##
## benign malignant
## 321 169
##
## benign malignant
## 137 72
Data dibagi menjadi 490 data training (321 benign dan 169 malignant) dan 209 data testing (137 benign dan 72 malignant). Proporsi kelas pada kedua data hampir sama dengan data awal, yaitu sekitar 65,5% benign dan 34,5% malignant. Ketiga model Bagging dilatih dan diuji menggunakan data training dan testing yang sama, sehingga perbedaan hasilnya hanya berasal dari nilai nbagg.
Model dibangun menggunakan fungsi bagging() dengan formula yang sama seperti sintaks modul. Tiga model dibentuk dengan nbagg = 25, 50, dan 100, dan coob = TRUE digunakan agar out-of-bag error dihitung.
fml <- Class ~ Cl.thickness + Cell.size + Cell.shape + Marg.adhesion +
Epith.c.size + Bare.nuclei + Bl.cromatin + Normal.nucleoli + Mitoses
set.seed(234)
bag25 <- bagging(fml, data = BC.train, nbagg = 25, coob = TRUE)
set.seed(234)
bag50 <- bagging(fml, data = BC.train, nbagg = 50, coob = TRUE)
set.seed(234)
bag100 <- bagging(fml, data = BC.train, nbagg = 100, coob = TRUE)
print(bag25)##
## Bagging classification trees with 25 bootstrap replications
##
## Call: bagging.data.frame(formula = fml, data = BC.train, nbagg = 25,
## coob = TRUE)
##
## Out-of-bag estimate of misclassification error: 0.049
##
## Bagging classification trees with 50 bootstrap replications
##
## Call: bagging.data.frame(formula = fml, data = BC.train, nbagg = 50,
## coob = TRUE)
##
## Out-of-bag estimate of misclassification error: 0.0449
##
## Bagging classification trees with 100 bootstrap replications
##
## Call: bagging.data.frame(formula = fml, data = BC.train, nbagg = 100,
## coob = TRUE)
##
## Out-of-bag estimate of misclassification error: 0.0429
Out-of-bag error untuk nbagg = 25, 50, dan 100 berturut-turut adalah 0,0490, 0,0449, dan 0,0429, atau setara dengan akurasi OOB sebesar 95,10%, 95,51%, dan 95,71%. Galat turun ketika jumlah pohon bertambah, tetapi penurunannya kecil, yaitu 0,0061 dari nbagg 25 ke 100 atau sekitar 3 dari 490 observasi. Karena seed yang digunakan sama, 25 sampel bootstrap pertama pada model nbagg 50 dan 100 sama dengan sampel pada model nbagg 25, sehingga perbedaan hasil hanya berasal dari pohon-pohon tambahan.
Fungsi summary() pada modul akan menampilkan seluruh pohon sehingga output-nya sangat panjang. Oleh karena itu, karakteristik pohon pada model nbagg = 100 dilihat secara ringkas melalui ukuran pohon, variabel pemisah pertama, dan proporsi data OOB.
# banyaknya simpul akhir pada setiap pohon
uk <- sapply(bag100$mtrees, function(t) sum(t$btree$frame$var == "<leaf>"))
summary(uk)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 9.00 12.00 13.00 13.47 15.00 20.00
# variabel pemisah pertama (root node) pada setiap pohon
table(sapply(bag100$mtrees, function(t) as.character(t$btree$frame$var[1])))##
## Bare.nuclei Bl.cromatin Cell.shape Cell.size Normal.nucleoli
## 15 12 9 61 3
# proporsi data out-of-bag pada setiap sampel bootstrap
oob <- sapply(bag100$mtrees, function(t) mean(!(1:nrow(BC.train) %in% t$bindx)))
summary(oob)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.3347 0.3571 0.3694 0.3687 0.3796 0.4122
Pohon-pohon pada model nbagg = 100 memiliki 9 sampai 20 simpul akhir dengan rata-rata 13,47. Ukuran ini cukup besar karena pohon pada Bagging dibiarkan tumbuh penuh tanpa pruning. Variabel pemisah pertama juga tidak selalu sama. Cell.size menjadi pemisah pertama pada 61 pohon, sedangkan sisanya menggunakan Bare.nuclei (15 pohon), Bl.cromatin (12 pohon), Cell.shape (9 pohon), dan Normal.nucleoli (3 pohon). Ini menunjukkan sifat tidak stabil dari pohon keputusan, yaitu sampel bootstrap yang sedikit berbeda dapat menghasilkan pohon yang berbeda. Variasi antarpohon inilah yang diredam melalui voting mayoritas. Proporsi data OOB pada setiap sampel bootstrap berkisar antara 33,47% sampai 41,22% dengan rata-rata 36,87%, sesuai dengan nilai teoritis pada Persamaan (2.1), yaitu sekitar 36,8%.
Ukuran evaluasi dihitung dengan cara yang sama seperti sintaks modul, yaitu mengambil nilai TN, FP, FN, dan TP dari confusion matrix, kemudian ditambah F1-Score sesuai Persamaan (2.7) sampai (2.11).
evaluasi <- function(aktual, prediksi) {
cm <- table(Aktual = aktual, Prediksi = prediksi)
TN <- cm[1, 1]; FP <- cm[1, 2]; FN <- cm[2, 1]; TP <- cm[2, 2]
accuracy <- (TP + TN) / (TP + TN + FP + FN)
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
specificity <- TN / (TN + FP)
f1 <- 2 * precision * recall / (precision + recall)
round(c(Accuracy = accuracy, Precision = precision, Recall = recall,
Specificity = specificity, F1 = f1), 4)
}
set.seed(234)
pred25 <- predict(bag25, newdata = BC.test)
pred50 <- predict(bag50, newdata = BC.test)
pred100 <- predict(bag100, newdata = BC.test)
table(Aktual = BC.test$Class, Prediksi = pred25)## Prediksi
## Aktual benign malignant
## benign 128 9
## malignant 1 71
## Prediksi
## Aktual benign malignant
## benign 128 9
## malignant 1 71
## Prediksi
## Aktual benign malignant
## benign 129 8
## malignant 1 71
# banyaknya observasi testing dengan suara seri (50% : 50%)
sapply(list(bag25, bag50, bag100),
function(m) sum(predict(m, newdata = BC.test, type = "prob")[, "malignant"] == 0.5))## [1] 0 1 0
hasil <- rbind("nbagg = 25" = evaluasi(BC.test$Class, pred25),
"nbagg = 50" = evaluasi(BC.test$Class, pred50),
"nbagg = 100" = evaluasi(BC.test$Class, pred100))
hasil## Accuracy Precision Recall Specificity F1
## nbagg = 25 0.9522 0.8875 0.9861 0.9343 0.9342
## nbagg = 50 0.9522 0.8875 0.9861 0.9343 0.9342
## nbagg = 100 0.9569 0.8987 0.9861 0.9416 0.9404
Model nbagg = 25 dan 50 menghasilkan confusion matrix yang sama, yaitu 128 tumor jinak dan 71 tumor ganas diprediksi benar, 9 tumor jinak diprediksi ganas (False Positive), dan 1 tumor ganas diprediksi jinak (False Negative). Pada nbagg = 100, False Positive turun menjadi 8, sedangkan False Negative tetap 1. Akibatnya, accuracy naik dari 0,9522 menjadi 0,9569, specificity dari 0,9343 menjadi 0,9416, precision dari 0,8875 menjadi 0,8987, dan F1-Score dari 0,9342 menjadi 0,9404, sedangkan recall sama pada ketiga model, yaitu 0,9861. Perbedaan antara nbagg = 100 dengan dua model lainnya hanya terletak pada satu observasi.
Pada nbagg = 50 terdapat satu observasi data testing yang mendapat suara seri, yaitu 25 pohon memilih benign dan 25 pohon memilih malignant. Fungsi predict() pada paket ipred menentukan kelas observasi yang seri secara acak, sehingga set.seed() diberikan sebelum prediksi agar hasilnya dapat diulang. Tanpa set.seed(), akurasi nbagg = 50 dapat berubah antara 0,9522 dan 0,9474 tergantung hasil pengacakan tersebut. Suara seri tidak mungkin terjadi pada nbagg = 25 karena jumlah pohonnya ganjil, sedangkan pada nbagg = 100 kebetulan tidak ada observasi yang seri.
prob25 <- predict(bag25, newdata = BC.test, type = "prob")
prob50 <- predict(bag50, newdata = BC.test, type = "prob")
prob100 <- predict(bag100, newdata = BC.test, type = "prob")
head(prob100)## benign malignant
## [1,] 1.0 0.0
## [2,] 0.6 0.4
## [3,] 1.0 0.0
## [4,] 1.0 0.0
## [5,] 0.0 1.0
## [6,] 1.0 0.0
## [1] 39
hitung_auc <- function(prob) {
performance(prediction(prob[, "malignant"], BC.test$Class == "malignant"), "auc")@y.values[[1]]
}
auc <- c("nbagg = 25" = hitung_auc(prob25),
"nbagg = 50" = hitung_auc(prob50),
"nbagg = 100" = hitung_auc(prob100))
round(auc, 4)## nbagg = 25 nbagg = 50 nbagg = 100
## 0.9764 0.9795 0.9795
roc_df <- function(prob, model) {
p <- performance(prediction(prob[, "malignant"], BC.test$Class == "malignant"), "tpr", "fpr")
data.frame(FPR = p@x.values[[1]], TPR = p@y.values[[1]], Model = model)
}
roc_all <- rbind(roc_df(prob25, "nbagg = 25"), roc_df(prob50, "nbagg = 50"),
roc_df(prob100, "nbagg = 100"))
roc_all$Model <- factor(roc_all$Model, levels = c("nbagg = 25", "nbagg = 50", "nbagg = 100"))
ggplot(roc_all, aes(FPR, TPR, colour = Model)) +
geom_path(linewidth = 0.8) +
geom_abline(linetype = "dashed", colour = "grey60") +
scale_colour_manual(values = c("nbagg = 25" = "#E07B00", "nbagg = 50" = "#7B5EA7",
"nbagg = 100" = "#008080")) +
coord_equal() +
labs(x = "False Positive Rate (1 - Specificity)", y = "True Positive Rate (Sensitivity)", colour = "") +
theme_minimal() +
theme(legend.position = "bottom")Gambar 3. Kurva ROC model Bagging dengan nbagg = 25, 50, dan 100 pada data testing
Probabilitas pada Bagging merupakan proporsi suara dari seluruh pohon sesuai Persamaan (2.3). Misalnya, observasi kedua pada data testing mendapat 60% suara benign dan 40% suara malignant dari 100 pohon sehingga diprediksi benign, tetapi dengan keyakinan yang rendah. Model nbagg = 100 menghasilkan 39 nilai probabilitas yang berbeda, sehingga kurva ROC yang terbentuk memiliki banyak titik ambang batas. Nilai AUC untuk nbagg = 25, 50, dan 100 berturut-turut adalah 0,9764, 0,9795, dan 0,9795, sehingga ketiganya tergolong luar biasa (outstanding) menurut Hosmer dkk. (2013). AUC naik sedikit dari nbagg 25 ke 50, lalu tidak berubah pada nbagg 100. Pada Gambar 3, ketiga kurva ROC berada dekat sudut kiri atas dan hampir berimpit. Hal ini menunjukkan bahwa ketiga model memiliki kemampuan yang hampir sama dalam membedakan tumor jinak dan tumor ganas.
Sintaks modul memprediksi data yang sama dengan data yang digunakan untuk melatih model. Untuk melihat pengaruhnya, akurasi pada data training dibandingkan dengan akurasi OOB dan akurasi data testing.
set.seed(234)
akurasi <- data.frame(
nbagg = c(25, 50, 100),
Training = sapply(list(bag25, bag50, bag100),
function(m) mean(predict(m, newdata = BC.train) == BC.train$Class)),
OOB = 1 - c(bag25$err, bag50$err, bag100$err),
Testing = hasil[, "Accuracy"])
round(akurasi, 4)## nbagg Training OOB Testing
## nbagg = 25 25 0.998 0.9510 0.9522
## nbagg = 50 50 0.998 0.9551 0.9522
## nbagg = 100 100 1.000 0.9571 0.9569
Akurasi pada data training hampir sempurna (0,9980, 0,9980, dan 1,0000) karena setiap pohon tumbuh penuh dan sebagian besar observasi training sudah digunakan saat membangun pohon-pohon tersebut. Sebaliknya, akurasi OOB (0,9510 sampai 0,9571) sangat dekat dengan akurasi data testing (0,9522 sampai 0,9569). Jadi, akurasi dari memprediksi data training terlalu optimis dan tidak dapat digunakan untuk menilai model, sedangkan out-of-bag error memberikan perkiraan yang jauh lebih sesuai dengan kemampuan model pada data baru.
Hasil ketiga model kemudian dirangkum pada Tabel 4.
ringkasan <- data.frame(nbagg = c(25, 50, 100), OOB = c(bag25$err, bag50$err, bag100$err),
hasil, AUC = auc, row.names = NULL)
knitr::kable(ringkasan, digits = 4, align = "c", format.args = list(decimal.mark = ","),
col.names = c("nbagg", "OOB error", "Accuracy", "Precision", "Recall",
"Specificity", "F1-Score", "AUC"),
caption = "Tabel 4. Perbandingan hasil *Bagging* pada *nbagg* = 25, 50, dan 100")| nbagg | OOB error | Accuracy | Precision | Recall | Specificity | F1-Score | AUC |
|---|---|---|---|---|---|---|---|
| 25 | 0,0490 | 0,9522 | 0,8875 | 0,9861 | 0,9343 | 0,9342 | 0,9764 |
| 50 | 0,0449 | 0,9522 | 0,8875 | 0,9861 | 0,9343 | 0,9342 | 0,9795 |
| 100 | 0,0429 | 0,9569 | 0,8987 | 0,9861 | 0,9416 | 0,9404 | 0,9795 |
Berdasarkan Tabel 4, model nbagg = 25 dan 50 menghasilkan ukuran evaluasi data testing yang sama, sedangkan nbagg = 100 sedikit lebih baik pada accuracy, precision, specificity, dan F1-Score. Recall sama pada ketiga model, artinya penambahan pohon tidak mengubah kemampuan model dalam mengenali tumor ganas. Dari nbagg 25 ke 100, out-of-bag error turun dari 0,0490 menjadi 0,0429 dan AUC naik dari 0,9764 menjadi 0,9795, tetapi perubahan ini kecil, yaitu sekitar 3 observasi pada data training (OOB) dan 1 observasi pada data testing. Hal ini sesuai dengan Persamaan (2.5), yaitu penambahan pohon hanya mengecilkan suku kedua variance, sehingga manfaatnya semakin kecil, sedangkan waktu komputasi bertambah karena pohon yang dibangun semakin banyak. Di antara ketiga nilai nbagg, nbagg = 100 memiliki out-of-bag error terkecil sehingga dipilih sebagai model terbaik. Pemilihan ini didasarkan pada galat OOB yang dihitung dari data training, sedangkan data testing hanya digunakan untuk memastikan hasilnya.
Bagging (bootstrap aggregating) adalah meta-algoritma ensemble yang membentuk banyak model dari sampel bootstrap data training, melatih setiap model secara paralel dan independen, lalu menggabungkan hasilnya melalui voting mayoritas pada klasifikasi atau rata-rata pada regresi. Metode ini menurunkan variance tetapi tidak menurunkan bias, sehingga cocok untuk model yang kompleks seperti pohon keputusan tanpa pruning. Data yang tidak terambil pada setiap sampel bootstrap (sekitar 36,8%) dapat digunakan untuk menghitung out-of-bag error sebagai perkiraan galat pada data baru.
Bagging Classification diimplementasikan di RStudio menggunakan fungsi bagging() dari paket ipred dengan argumen nbagg untuk menentukan banyaknya pohon dan coob = TRUE untuk menghitung out-of-bag error. Prediksi kelas dan probabilitas diperoleh dengan predict(), evaluasi dilakukan dengan menghitung nilai TN, FP, FN, dan TP dari confusion matrix, sedangkan AUC dan kurva ROC dihitung dengan paket ROCR.
Berdasarkan hasil praktikum, model Bagging dengan nbagg = 25, 50, dan 100 menghasilkan out-of-bag error berturut-turut 0,0490, 0,0449, dan 0,0429. Model nbagg = 25 dan 50 menghasilkan ukuran evaluasi data testing yang sama, yaitu accuracy 0,9522, precision 0,8875, recall 0,9861, specificity 0,9343, dan F1-Score 0,9342, dengan AUC berturut-turut 0,9764 dan 0,9795. Model terbaik adalah nbagg = 100 dengan accuracy 0,9569, precision 0,8987, recall 0,9861, specificity 0,9416, F1-Score 0,9404, dan AUC 0,9795 yang termasuk kategori luar biasa. Namun, perbedaan ketiga model sangat kecil, yaitu hanya satu observasi pada data testing, sehingga penambahan pohon dari 25 menjadi 100 hanya memberikan perbaikan yang kecil. Akurasi pada data training hampir sempurna, sedangkan akurasi OOB sangat dekat dengan akurasi data testing, sehingga evaluasi sebaiknya menggunakan out-of-bag error atau data testing.
Pada praktikum Machine Learning berikutnya, disarankan agar praktikan lebih teliti dalam penggunaan sintaks dan interpretasi output di RStudio, terutama dalam membedakan akurasi pada data training, out-of-bag error, dan akurasi pada data testing. Model sebaiknya tidak dinilai dari prediksi terhadap data yang digunakan untuk melatihnya karena hasilnya terlalu optimis. Pemilihan nilai nbagg juga perlu mempertimbangkan kestabilan galat dan waktu komputasi, serta sebaiknya menggunakan set.seed() sebelum prediksi atau jumlah pohon ganjil agar hasil prediksi tidak berubah karena suara seri. Selain itu, hasil Bagging dapat dibandingkan dengan classification tree tunggal maupun metode ensemble lain seperti Random Forest untuk melihat seberapa besar manfaat penggabungan pohon dan pengurangan korelasi antarpohon.
Breiman, L. (1996). Bagging predictors. Machine Learning, 24(2), 123–140. https://doi.org/10.1007/BF00058655
Breiman, L. (2001). Random forests. Machine Learning, 45(1), 5–32. https://doi.org/10.1023/A:1010933404324
Dietterich, T. G. (2000). Ensemble methods in machine learning. Dalam Multiple Classifier Systems (Lecture Notes in Computer Science, Vol. 1857, hlm. 1–15). Springer. https://doi.org/10.1007/3-540-45014-9_1
Efron, B. (1979). Bootstrap methods: Another look at the jackknife. The Annals of Statistics, 7(1), 1–26. https://doi.org/10.1214/aos/1176344552
Efron, B., & Tibshirani, R. J. (1993). An introduction to the bootstrap. Chapman & Hall/CRC.
Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8), 861–874. https://doi.org/10.1016/j.patrec.2005.10.010
Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining, inference, and prediction (2nd ed.). Springer.
Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied logistic regression (3rd ed.). Wiley.
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.
Kuhn, M. (2008). Building predictive models in R using the caret package. Journal of Statistical Software, 28(5), 1–26. https://doi.org/10.18637/jss.v028.i05
Leisch, F., & Dimitriadou, E. (2010). mlbench: Machine learning benchmark problems [R package]. The Comprehensive R Archive Network.
Muraina, I. O. (2022). Ideal dataset splitting ratios in machine learning algorithms: General concerns for data scientists and data analysts. Dalam Proceedings of the 7th International Mardin Artuklu Scientific Research Conference (hlm. 496–504).
Peters, A., Hothorn, T., & Lausen, B. (2002). ipred: Improved predictors. R News, 2(2), 33–36.
Sokolova, M., & Lapalme, G. (2009). A systematic analysis of performance measures for classification tasks. Information Processing & Management, 45(4), 427–437. https://doi.org/10.1016/j.ipm.2009.03.002
Sung, H., Ferlay, J., Siegel, R. L., Laversanne, M., Soerjomataram, I., Jemal, A., & Bray, F. (2021). Global cancer statistics 2020: GLOBOCAN estimates of incidence and mortality worldwide for 36 cancers in 185 countries. CA: A Cancer Journal for Clinicians, 71(3), 209–249. https://doi.org/10.3322/caac.21660
van Buuren, S., & Groothuis-Oudshoorn, K. (2011). mice: Multivariate imputation by chained equations in R. Journal of Statistical Software, 45(3), 1–67. https://doi.org/10.18637/jss.v045.i03
Wolberg, W. H., & Mangasarian, O. L. (1990). Multisurface method of pattern separation for medical diagnosis applied to breast cytology. Proceedings of the National Academy of Sciences, 87(23), 9193–9196. https://doi.org/10.1073/pnas.87.23.9193
Zhou, Z.-H. (2012). Ensemble methods: Foundations and algorithms. CRC Press.