Kanker payudara merupakan salah satu jenis kanker yang paling sering didiagnosis pada perempuan di dunia, bahkan pada tahun 2020 tercatat sebagai kanker dengan kasus baru terbanyak secara global (Sung et al., 2021). Keberhasilan penanganannya sangat bergantung pada deteksi dini dan ketepatan diagnosis, yaitu membedakan tumor jinak (benign) dan tumor ganas (malignant). Salah satu cara yang lazim digunakan adalah pemeriksaan sitologi jaringan payudara melalui biopsi jarum halus, yang menghasilkan karakteristik sel seperti ketebalan gumpalan sel, keseragaman ukuran dan bentuk sel, serta jumlah inti sel yang terlihat. Karakteristik tersebut dapat dimanfaatkan sebagai variabel prediktor untuk mengklasifikasikan kondisi kanker payudara melalui pendekatan machine learning.
Ensemble learning merupakan pendekatan yang menggabungkan beberapa model dasar (base learner) agar diperoleh model gabungan dengan kemampuan prediksi yang lebih baik dibandingkan model tunggal (Mienye & Sun, 2022). Dua pendekatan ensemble berbasis pohon yang banyak digunakan adalah Bagging dan Boosting. Pada Bagging, banyak model dibentuk secara relatif independen dari sampel bootstrap, sedangkan pada Boosting model-model sederhana dibentuk secara berurutan (sequential) dengan setiap model baru berusaha memperbaiki kesalahan model sebelumnya. Dengan demikian, kekuatan Boosting bukan berasal dari satu model yang sangat kompleks, melainkan dari gabungan banyak model sederhana (weak learner) yang secara bertahap menghasilkan model akhir yang lebih kuat (strong learner).
Salah satu algoritma Boosting untuk kasus klasifikasi adalah
Adaptive Boosting (AdaBoost), yang memberikan perhatian lebih
besar pada observasi yang masih salah diklasifikasikan dan menggabungkan
seluruh learner melalui pemungutan suara terbobot (Bentéjac et
al., 2021). Kinerja Boosting dipengaruhi oleh beberapa
parameter, antara lain jumlah iterasi (jumlah learner),
kedalaman pohon, dan learning rate, sehingga pemilihan jumlah
learner perlu dikaji. Pada praktikum ini digunakan dataset
BreastCancer dari package mlbench
untuk mengklasifikasikan variabel Class (benign
atau malignant) menggunakan AdaBoost dengan decision
stump sebagai weak learner melalui fungsi
boosting() pada package adabag.
Jumlah learner dibandingkan pada 50, 100, dan 200, dan kinerja
model dievaluasi berdasarkan confusion matrix,
Accuracy, Precision, Recall,
Specificity, dan F1-score.
BreastCancer, terutama
terkait missing value dan keseimbangan kelas pada variabel
Class?BreastCancer serta
menyiapkan data untuk pemodelan.Adapun manfaat pada penelitian ini yaitu:
Bagi penulis
Bagi pembaca
Menambah ilmu pengetahuan dan pemahaman yang berkaitan dengan Boosting (AdaBoost) dan penerapannya dengan RStudio.
Adapun batasan masalah pada praktikum ini yaitu menggunakan dataset BreastCancer dari package mlbench untuk klasifikasi kondisi kanker payudara dengan AdaBoost menggunakan fungsi adabag::boosting() dengan decision stump sebagai weak learner. Kolom Id dihapus, observasi yang mengandung missing value dihapus, data dibagi menjadi training (70%) dan testing (30%) dengan set.seed(234), jumlah learner yang dibandingkan adalah 50, 100, dan 200, dan evaluasi dilakukan berdasarkan confusion matrix, Accuracy, Precision, Recall, Specificity, dan F1-score.
Adapun sistematika penulisan dari praktikum ini adalah sebagai berikut.
BAB IPENDAHULUAN
Bab ini terdiri dari latar belakang, rumusan masalah, tujuan penelitian, manfaat penelitian, batasan masalah, dan sistematika penulisan.
BAB IITINJAUAN PUSTAKA
Bab ini berisi kajian pustaka yang terdiri dari ensemble learning, Boosting, AdaBoost, parameter penting dalam Boosting, dan evaluasi model klasifikasi.
BAB IIIMETODE PENELITIAN
Bab ini terdiri dari jenis dan sumber data, variabel penelitian, algoritma penelitian, dan diagram alir.
BAB IVHASIL DAN PEMBAHASAN
Bab ini berisi hasil yang diperoleh dari analisis data beserta penjelasannya pada bagian pembahasan.
BAB VKESIMPULAN
Bab ini merupakan bagian penutup laporan yang berisi kesimpulan dari hasil analisis serta saran dari penulis.
DAFTAR PUSTAKA
Ensemble learning merupakan pendekatan yang menggabungkan beberapa model dasar (base learner) agar diperoleh model gabungan yang memiliki kemampuan prediksi lebih baik (Fransiska, 2026). Bagging membentuk banyak model dari sampel bootstrap kemudian menggabungkan hasil prediksinya. Boosting memiliki tujuan yang sama, yaitu meningkatkan performa prediksi melalui gabungan beberapa model, tetapi cara model-model tersebut dibentuk berbeda secara mendasar. Perbedaan cara pembentukan model inilah yang menjadi karakter utama Boosting dan membedakannya dari Bagging (James et al., 2021).
Boosting adalah metode ensemble yang membentuk serangkaian model sederhana secara berurutan (sequential), dengan model berikutnya dibangun memperhatikan kesalahan yang masih dilakukan oleh model sebelumnya (Fransiska, 2026). Model-model sederhana pada setiap tahap disebut weak learner, yaitu model dengan kemampuan prediksi terbatas bila digunakan sendiri. Setelah sejumlah weak learner digabungkan, diperoleh model akhir yang lebih kuat, yang disebut strong learner. Pada Boosting berbasis pohon, decision tree sering digunakan sebagai base learner dengan kedalaman yang dibatasi (misalnya decision stump, yaitu pohon dengan satu pemisahan) sehingga setiap pohon tetap sederhana (James et al., 2021).
Karena Bagging dan Boosting sama-sama termasuk metode ensemble learning, perbedaan keduanya dirangkum sebagai berikut (Fransiska, 2026).
| Aspek | Bagging | Boosting |
|---|---|---|
| Cara membangun model | Paralel/relatif independen | Sequential; learner berikutnya bergantung pada hasil sebelumnya |
| Data tiap learner | Umumnya sampel bootstrap | Data, bobot, atau target dapat disesuaikan berdasarkan kesalahan sebelumnya |
| Fokus utama | Mengurangi variance melalui agregasi | Memperbaiki kesalahan secara bertahap |
| Kontribusi learner | Umumnya setara pada Bagging dasar | Dapat berbeda; misalnya pada AdaBoost melalui \(\alpha_m\) |
| Base learner | Sering menggunakan pohon yang relatif besar | Umumnya learner sederhana/pohon dangkal |
| Komputasi | Mudah diparalelkan | Lebih sulit diparalelkan karena bersifat sequential |
| Parameter penting | Jumlah model/bootstrap | Jumlah iterasi, learning rate, dan kompleksitas learner |
AdaBoost (Adaptive Boosting) merupakan salah satu algoritma Boosting yang banyak digunakan untuk kasus klasifikasi. Prinsip utamanya adalah memberikan perhatian lebih besar pada observasi yang masih salah diklasifikasikan (Fransiska, 2026). Untuk klasifikasi biner dengan data latih \((x_i, y_i)\), \(i = 1, 2, \ldots, n\), proses AdaBoost dilakukan sebagai berikut.
\[ w_i^{(1)} = \frac{1}{n}, \qquad i = 1, 2, \ldots, n \]
dengan \(w_i^{(1)}\) adalah bobot observasi ke-\(i\) pada iterasi pertama.
\[ err_m = \frac{\sum_{i=1}^{n} w_i^{(m)}\, I\{y_i \neq G_m(x_i)\}}{\sum_{i=1}^{n} w_i^{(m)}} \]
dengan \(err_m\) adalah kesalahan klasifikasi terbobot pada learner ke-\(m\), \(w_i^{(m)}\) adalah bobot observasi ke-\(i\) pada iterasi ke-\(m\), \(G_m(x_i)\) adalah kelas hasil prediksi learner ke-\(m\), dan \(I\{\cdot\}\) adalah fungsi indikator yang bernilai 1 apabila observasi salah diklasifikasikan dan 0 apabila benar.
Memperbarui bobot. Observasi yang salah diklasifikasikan memperoleh bobot yang lebih besar sehingga learner berikutnya memberikan perhatian lebih besar pada observasi tersebut.
Menggabungkan learner. Setiap learner diberi bobot berdasarkan performanya:
\[ \alpha_m = \log\left(\frac{1 - err_m}{err_m}\right) \]
dengan \(\alpha_m\) adalah tingkat kontribusi learner ke-\(m\) terhadap prediksi akhir. Prediksi akhir diperoleh melalui weighted voting:
\[ G(x) = \text{sign}\left[\sum_{m=1}^{M} \alpha_m G_m(x)\right] \]
dengan \(M\) adalah jumlah seluruh weak learner. Dengan demikian, pada AdaBoost terdapat dua jenis bobot, yaitu bobot observasi yang mengatur perhatian terhadap data latih dan bobot learner yang mengatur kontribusi setiap learner terhadap prediksi akhir.
Kinerja Boosting dipengaruhi oleh beberapa parameter berikut (Fransiska, 2026).
| Parameter | Peran |
|---|---|
| Jumlah iterasi / jumlah learner | Menentukan berapa banyak learner yang ditambahkan |
| Learning rate \(\nu\) | Mengatur besar kontribusi setiap learner baru |
| Kedalaman pohon | Mengatur kompleksitas setiap weak learner |
Jumlah iterasi yang terlalu sedikit dapat menyebabkan underfitting, sedangkan model yang terlalu kompleks berpotensi mengalami overfitting. Oleh karena itu, jumlah iterasi perlu dipilih dengan hati-hati (James et al., 2021).
Evaluasi model klasifikasi dilakukan dengan membandingkan kelas aktual dan kelas hasil prediksi yang disajikan dalam confusion matrix:
| Predicted Positive | Predicted Negative | |
|---|---|---|
| Actual Positive | True Positive (TP) | False Negative (FN) |
| Actual Negative | False Positive (FP) | True Negative (TN) |
Berdasarkan confusion matrix, ukuran evaluasi yang digunakan adalah:
\[ Accuracy = \frac{TP+TN}{TP+TN+FP+FN} \qquad Precision = \frac{TP}{TP+FP} \qquad Recall = \frac{TP}{TP+FN} \]
\[ Specificity = \frac{TN}{TN+FP} \qquad F1\text{-}Score = 2\left(\frac{Precision \times Recall}{Precision + Recall}\right) \]
Recall (sensitivitas) menunjukkan kemampuan model mendeteksi kelas positif, sedangkan specificity menunjukkan kemampuan mendeteksi kelas negatif (Fransiska, 2026). Pada kasus ini, kelas positif adalah malignant, sehingga recall yang tinggi berarti sedikit tumor ganas yang terlewat (false negative).
Data yang digunakan adalah dataset BreastCancer dari
package mlbench, yang berasal dari Wisconsin
Breast Cancer Database hasil pemeriksaan sitologi biopsi jarum
halus pada jaringan payudara. Dataset ini terdiri dari 699 observasi dan
11 variabel (satu di antaranya, Id, dihapus pada analisis
sehingga tersisa 10 variabel).
| Variabel | Jenis | Keterangan |
|---|---|---|
Class |
Kategorik biner (target) | Kondisi tumor: benign (jinak) atau malignant (ganas) |
Cl.thickness |
Ordinal (skala 1–10) | Ketebalan gumpalan sel (clump thickness) |
Cell.size |
Ordinal (skala 1–10) | Keseragaman ukuran sel |
Cell.shape |
Ordinal (skala 1–10) | Keseragaman bentuk sel |
Marg.adhesion |
Ordinal (skala 1–10) | Perlekatan pada tepi sel (marginal adhesion) |
Epith.c.size |
Ordinal (skala 1–10) | Ukuran sel epitel tunggal |
Bare.nuclei |
Ordinal (skala 1–10) | Inti sel yang tidak terbungkus sitoplasma (memiliki missing value) |
Bl.cromatin |
Ordinal (skala 1–10) | Kehalusan kromatin (bland chromatin) |
Normal.nucleoli |
Ordinal (skala 1–10) | Kondisi anak inti sel normal (normal nucleoli) |
Mitoses |
Ordinal (skala 1–10) | Tingkat pembelahan sel (mitoses) |
Id |
Identitas | Nomor identitas sampel (dihapus, tidak dipakai sebagai prediktor) |
Algoritma AdaBoost membentuk model melalui tahapan yang diulang sebanyak \(M\) kali (jumlah learner):
Langkah-langkah analisis pada praktikum ini adalah:
BreastCancer, melihat
struktur dan ringkasan data.Id dan observasi yang mengandung
missing value (na.omit), serta memastikan
Class bertipe factor.Class dan
set.seed(234).adabag::boosting,
boos = FALSE, coeflearn = "Freund",
maxdepth = 1) dengan 100 learner sebagai model
acuan.errorevol) dan
variable importance.Diagram alir pada penelitian ini menggunakan simbol standar: oval untuk terminator (mulai dan selesai), jajargenjang untuk input dan output, serta persegi panjang untuk proses.
Diagram Alir Penelitian
# install.packages(c("adabag", "mlbench", "caret", "rpart", "knitr"))
library(adabag)
library(mlbench)
library(caret)
library(rpart)
library(knitr)
data(BreastCancer, package = "mlbench")
bc <- BreastCancer
str(bc)## '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 ...
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## Length :699 1 :145 1 :384 1 :353 1 :407
## N.unique :645 5 :130 10 : 67 2 : 59 2 : 58
## N.blank : 0 3 :108 3 : 52 10 : 58 3 : 58
## Min.nchar: 5 4 : 80 2 : 45 3 : 56 10 : 55
## Max.nchar: 8 10 : 69 4 : 40 4 : 44 4 : 33
## 2 : 50 5 : 30 5 : 34 8 : 25
## (Other):117 (Other): 81 (Other): 95 (Other): 63
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 2 :386 1 :402 2 :166 1 :443 1 :579
## 3 : 72 10 :132 3 :165 10 : 61 2 : 35
## 4 : 48 2 : 30 1 :152 3 : 44 3 : 33
## 1 : 47 5 : 30 7 : 73 2 : 36 10 : 14
## 6 : 41 3 : 28 4 : 40 8 : 24 4 : 12
## 5 : 39 (Other): 61 5 : 34 6 : 22 7 : 9
## (Other): 66 NAs : 16 (Other): 69 (Other): 69 (Other): 17
## Class
## benign :458
## malignant:241
##
##
##
##
##
Interpretasi. Data BreastCancer
berhasil dimuat ke dalam R dan berisi 699 observasi dengan 11 variabel.
Setiap baris mewakili satu sampel pemeriksaan jaringan payudara. Fungsi
str menunjukkan bahwa kolom Id bertipe
karakter (nomor identitas sampel), 5 variabel karakteristik sel bertipe
ordered factor dengan skala 1 sampai 10, dan Class
bertipe factor dengan dua level, yaitu benign dan malignant.
Variabel Class adalah target klasifikasi sehingga kasus ini
sesuai untuk AdaBoost. Ringkasan data (summary)
memperlihatkan adanya NA pada variabel
Bare.nuclei sebanyak 16 data, yang ditangani pada sub-bab
berikutnya.
# Menghapus Id karena hanya merupakan identifier
bc$Id <- NULL
cat("Jumlah observasi sebelum na.omit:", nrow(bc), "\n")## Jumlah observasi sebelum na.omit: 699
## Jumlah missing value : 16
# Menghapus observasi yang mengandung missing value
bc <- na.omit(bc)
cat("Jumlah observasi sesudah na.omit :", nrow(bc), "\n")## Jumlah observasi sesudah na.omit : 683
## [1] "benign" "malignant"
##
## benign malignant
## 444 239
##
## benign malignant
## 65.01 34.99
Interpretasi.
Id. Kolom Id
dihapus karena hanya berupa nomor identitas sampel dan tidak membawa
informasi untuk klasifikasi. Jika dibiarkan, algoritma dapat membentuk
aturan pemisahan yang tidak bermakna secara medis.NA dihapus dengan na.omit, sehingga
data berkurang dari 699 menjadi 683 observasi (16 observasi dihapus atau
2.29%). Persentase data yang dibuang tergolong kecil sehingga
pengaruhnya terhadap hasil analisis relatif terbatas.Class berurutan benign kemudian
malignant, sehingga kelas malignant ditetapkan secara
eksplisit sebagai kelas positif.set.seed(234)
idx.cls <- createDataPartition(bc$Class, p = 0.70, list = FALSE)
bc.train <- bc[idx.cls, ]
bc.test <- bc[-idx.cls, ]
dim(bc.train)## [1] 479 10
## [1] 204 10
##
## benign malignant
## 311 168
##
## benign malignant
## 133 71
##
## benign malignant
## 64.93 35.07
##
## benign malignant
## 65.2 34.8
Interpretasi.
Class menggunakan
createDataPartition (p = 0.7,
set.seed(234)) menjadi 479 observasi data latih (70.1%) dan
204 observasi data uji (29.9%). Keduanya memiliki 10 kolom (9 prediktor
dan 1 target).Model acuan dibentuk dengan 100 learner. Argumen
maxdepth = 1 membuat setiap pohon hanya memiliki satu
pemisahan (decision stump), boos = FALSE berarti
data latih tidak di-resample sehingga bobot observasi dipakai
langsung, dan coeflearn = "Freund" memakai rumus \(\alpha_m =
\log\left(\frac{1-err_m}{err_m}\right)\) seperti pada dasar
teori.
set.seed(234)
boost.ada <- boosting(Class ~ ., data = bc.train,
boos = FALSE, mfinal = 100, coeflearn = "Freund",
control = rpart.control(maxdepth = 1, minsplit = 10, cp = 0))
# Ringkasan model (hanya bagian awal)
boost.ada$formula## Class ~ .
## [1] "benign" "benign" "benign" "malignant" "benign"
## [1] 2.5717138 1.9856256 1.5321449 1.0064655 1.0698480 0.5801999
Interpretasi.
adabag::boosting() menggunakan mfinal = 100
learner, dengan decision stump
(maxdepth = 1) sebagai weak learner. Setiap
stump hanya memakai satu variabel dan satu ambang batas
sehingga sangat sederhana dan kemampuan prediksinya terbatas bila
berdiri sendiri; kekuatan model berasal dari penggabungan 100
stump secara berurutan.weights
menyimpan nilai \(\alpha_m\) untuk
setiap learner. Learner dengan galat terbobot kecil
memperoleh \(\alpha_m\) besar sehingga
suaranya lebih berpengaruh pada prediksi akhir. Pada model ini, nilai
\(\alpha_m\) berkisar dari 0.109 sampai
2.572, dengan learner pertama memiliki \(\alpha_1\) sebesar 2.572.pred.ada.obj <- predict(boost.ada, newdata = bc.test)
pred.ada <- factor(pred.ada.obj$class, levels = levels(bc.test$Class))
# Membandingkan aktual dan prediksi
hasil.ada <- data.frame(Aktual = bc.test$Class, Prediksi = pred.ada)
head(hasil.ada, 10)## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
# Confusion Matrix (kelas positif = malignant)
cm.ada <- confusionMatrix(data = pred.ada, reference = bc.test$Class,
positive = "malignant")
cm.ada## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 130 4
## malignant 3 67
##
## Accuracy : 0.9657
## 95% CI : (0.9306, 0.9861)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9241
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9437
## Specificity : 0.9774
## Pos Pred Value : 0.9571
## Neg Pred Value : 0.9701
## Prevalence : 0.3480
## Detection Rate : 0.3284
## Detection Prevalence : 0.3431
## Balanced Accuracy : 0.9606
##
## 'Positive' Class : malignant
##
## Prediksi
## Aktual benign malignant
## benign 130 3
## malignant 4 67
library(ggplot2)
ggplot(as.data.frame(tab.ada), aes(x = Aktual, y = Prediksi, fill = Freq)) +
geom_tile(color = "white") +
geom_text(aes(label = Freq), size = 6) +
scale_fill_gradient(low = "#E0F2F1", high = "#008080") +
labs(title = "Confusion Matrix Data Uji (AdaBoost, 100 Learner)",
x = "Aktual", y = "Prediksi") +
theme_minimal() +
theme(legend.position = "none")# Kelas positif = malignant
TN <- tab.ada["benign", "benign"]
FP <- tab.ada["benign", "malignant"]
FN <- tab.ada["malignant", "benign"]
TP <- tab.ada["malignant", "malignant"]Interpretasi.
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)
evaluasi.ada <- data.frame(Accuracy = Accuracy, Precision = Precision,
Recall = Recall, Specificity = Specificity,
F1_Score = F1)
round(evaluasi.ada, 4)## Accuracy Precision Recall Specificity F1_Score
## 1 0.9657 0.9571 0.9437 0.9774 0.9504
# Pembanding: akurasi bila selalu menebak kelas mayoritas
round(max(prop.table(table(bc.test$Class))), 4)## [1] 0.652
Interpretasi.
confusionMatrix.
Nilai Accuracy, Sensitivity (0.9437), dan
Specificity (0.9774) yang dihitung manual sama dengan keluaran
fungsi confusionMatrix dari caret, sehingga
perhitungan dapat dipastikan benar.error.train <- errorevol(boost.ada, newdata = bc.train)
error.test <- errorevol(boost.ada, newdata = bc.test)
head(error.train$error)## [1] 0.07098121 0.07098121 0.05636743 0.05219207 0.05219207 0.04592902
## [1] 0.07843137 0.07843137 0.05882353 0.05392157 0.05392157 0.05882353
Interpretasi.
importance.ada <- boost.ada$importance
importance.ada <- sort(importance.ada, decreasing = TRUE)
importance.ada## Cell.size Bare.nuclei Cl.thickness Marg.adhesion Normal.nucleoli
## 39.432729 29.377745 9.222131 7.403588 5.515949
## Mitoses Bl.cromatin Cell.shape Epith.c.size
## 2.924061 2.153168 2.063869 1.906759
barplot(importance.ada, las = 2,
main = "Variable Importance - AdaBoost",
ylab = "Importance", col = "cadetblue")Interpretasi.
Cell.size dan
Cell.shape), urutan kepentingan sebaiknya dibaca sebagai
gambaran kelompok variabel yang berpengaruh, bukan peringkat yang
mutlak.fit_ada <- function(m) {
set.seed(234)
boosting(Class ~ ., data = bc.train,
boos = FALSE, mfinal = m, coeflearn = "Freund",
control = rpart.control(maxdepth = 1, minsplit = 10, cp = 0))
}
ukur <- function(model, data) {
p <- factor(predict(model, newdata = data)$class, levels = levels(data$Class))
tab <- table(Aktual = data$Class, Prediksi = p)
TN <- tab["benign", "benign"]; FP <- tab["benign", "malignant"]
FN <- tab["malignant", "benign"]; TP <- tab["malignant", "malignant"]
Pr <- TP / (TP + FP); Rc <- TP / (TP + FN)
c(TP = TP, FN = FN, FP = FP, TN = TN,
Accuracy = (TP + TN) / (TP + TN + FP + FN),
Precision = Pr,
Recall = Rc,
Specificity = TN / (TN + FP),
F1 = 2 * Pr * Rc / (Pr + Rc))
}
jumlah <- c(50, 100, 200)
models <- lapply(jumlah, fit_ada)
names(models) <- jumlah
uji <- t(sapply(models, ukur, data = bc.test))
latih <- t(sapply(models, ukur, data = bc.train))
# Confusion matrix data uji setiap model
for (m in jumlah) {
cat("\nConfusion matrix data uji -", m, "learner (baris = aktual, kolom = prediksi)\n")
p <- factor(predict(models[[as.character(m)]], newdata = bc.test)$class,
levels = levels(bc.test$Class))
print(table(Aktual = bc.test$Class, Prediksi = p))
}##
## Confusion matrix data uji - 50 learner (baris = aktual, kolom = prediksi)
## Prediksi
## Aktual benign malignant
## benign 130 3
## malignant 4 67
##
## Confusion matrix data uji - 100 learner (baris = aktual, kolom = prediksi)
## Prediksi
## Aktual benign malignant
## benign 130 3
## malignant 4 67
##
## Confusion matrix data uji - 200 learner (baris = aktual, kolom = prediksi)
## Prediksi
## Aktual benign malignant
## benign 130 3
## malignant 5 66
hasil_banding <- data.frame(
Learner = jumlah,
TP = uji[, "TP"], FN = uji[, "FN"], FP = uji[, "FP"], TN = uji[, "TN"],
Accuracy = uji[, "Accuracy"],
Precision = uji[, "Precision"],
Recall = uji[, "Recall"],
Specificity = uji[, "Specificity"],
F1_Score = uji[, "F1"],
Acc_Train = latih[, "Accuracy"],
row.names = NULL
)
kable(hasil_banding, digits = 4,
caption = "Perbandingan Kinerja AdaBoost pada Data Uji untuk 50, 100, dan 200 Learner")| Learner | TP | FN | FP | TN | Accuracy | Precision | Recall | Specificity | F1_Score | Acc_Train |
|---|---|---|---|---|---|---|---|---|---|---|
| 50 | 67 | 4 | 3 | 130 | 0.9657 | 0.9571 | 0.9437 | 0.9774 | 0.9504 | 0.9770 |
| 100 | 67 | 4 | 3 | 130 | 0.9657 | 0.9571 | 0.9437 | 0.9774 | 0.9504 | 0.9854 |
| 200 | 66 | 5 | 3 | 130 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 0.9875 |
# Kurva galat data uji untuk model 200 learner (iterasi 1-200)
err200_test <- errorevol(models[["200"]], newdata = bc.test)$error
err200_train <- errorevol(models[["200"]], newdata = bc.train)$error
plot(err200_test, type = "l", lwd = 2, col = "#008080",
xlab = "Jumlah Learner", ylab = "Error",
main = "Perkembangan Error AdaBoost (hingga 200 Learner)",
ylim = range(c(err200_test, err200_train)))
lines(err200_train, lwd = 2, col = "#E07B7B")
abline(v = jumlah, lty = 3, col = "gray50")
legend("topright", legend = c("Testing", "Training"),
col = c("#008080", "#E07B7B"), lwd = 2, bty = "n")# Metrik utama per jumlah learner
barplot(t(as.matrix(hasil_banding[, c("Accuracy", "Recall", "Specificity", "F1_Score")])),
beside = TRUE, names.arg = hasil_banding$Learner,
col = c("#008080", "#66b2b2", "#E07B7B", "#FFD180"),
ylim = c(0.9, 1), xpd = FALSE,
xlab = "Jumlah Learner", ylab = "Nilai",
main = "Ukuran Evaluasi Data Uji menurut Jumlah Learner")
legend("bottomright", legend = c("Accuracy", "Recall", "Specificity", "F1-score"),
fill = c("#008080", "#66b2b2", "#E07B7B", "#FFD180"), bty = "n", cex = 0.8)idx_best <- which.max(hasil_banding$Accuracy)
m_best <- hasil_banding$Learner[idx_best]
acc_range <- diff(range(hasil_banding$Accuracy))Interpretasi.
boos = FALSE dan set.seed(234) yang sama,
model dengan jumlah learner lebih sedikit pada dasarnya
merupakan bagian awal dari model yang lebih besar, sehingga kurva galat
model 200 learner dapat dipakai untuk membaca kinerja model 50
dan 100 learner. Bila kurva sudah mendatar sebelum 200
learner, penambahan learner berikutnya tidak
memperbaiki kinerja secara berarti.BreastCancer berisi 699 observasi. Setelah kolom
Id dihapus dan 16 observasi dengan missing value
dibuang, tersisa 683 observasi dengan 10 variabel. Kelas target terdiri
dari 65.01% benign dan 34.99% malignant.mice) sebagai
pengganti penghapusan observasi, serta perbandingan dengan
Bagging, Random Forest, atau Gradient
Boosting.Bentéjac, C., Csörgő, A., & Martínez-Muñoz, G. (2021). A comparative analysis of gradient boosting algorithms. Artificial Intelligence Review, 54(3), 1937-1967.
Fransiska, H. (2026). Modul Machine Learning and Modern Prediction. Bengkulu: Universitas Bengkulu.
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning with Applications in R (2nd ed.). Springer.
Mienye, I. D., & Sun, Y. (2022). A survey of ensemble learning: Concepts, algorithms, applications, and prospects. IEEE Access, 10, 99129-99149.
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.