BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

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.

1.2 Rumusan Masalah

  1. Bagaimana konsep dasar Boosting sebagai metode ensemble learning dan bagaimana prinsip kerja AdaBoost pada kasus klasifikasi?
  2. Bagaimana kondisi awal dataset BreastCancer, terutama terkait missing value dan keseimbangan kelas pada variabel Class?
  3. Bagaimana kinerja model AdaBoost dengan decision stump berdasarkan confusion matrix dan ukuran evaluasi klasifikasi pada data uji?
  4. Bagaimana perkembangan galat (error) AdaBoost pada data latih dan data uji seiring bertambahnya jumlah learner, serta variabel apa yang paling penting?
  5. Bagaimana perbandingan kinerja model AdaBoost dengan 50, 100, dan 200 learner, dan jumlah learner mana yang paling baik?

1.3 Tujuan Penelitian

  1. Menjelaskan konsep dasar Boosting dan prinsip kerja AdaBoost.
  2. Mengetahui kondisi awal dataset BreastCancer serta menyiapkan data untuk pemodelan.
  3. Membangun model AdaBoost dengan decision stump sebagai weak learner dan mengevaluasinya menggunakan confusion matrix, Accuracy, Precision, Recall, Specificity, dan F1-score.
  4. Menganalisis perkembangan galat AdaBoost dan variable importance.
  5. Membandingkan kinerja model untuk 50, 100, dan 200 learner serta menentukan jumlah learner terbaik.

1.4 Manfaat Penelitian

Adapun manfaat pada penelitian ini yaitu:

  1. Bagi penulis

    1. Memberikan informasi serta pengetahuan tentang Boosting, khususnya AdaBoost, dalam Machine Learning.
    2. Mengembangkan dan menerapkan wawasan ilmu yang telah diperoleh dalam bidang statistika, khususnya tentang pembentukan, evaluasi, dan perbandingan model AdaBoost dengan RStudio.
  2. Bagi pembaca

    Menambah ilmu pengetahuan dan pemahaman yang berkaitan dengan Boosting (AdaBoost) dan penerapannya dengan RStudio.

1.5 Batasan Masalah

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.

1.6 Sistematika Penulisan

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

BAB II TINJAUAN PUSTAKA

2.1 Ensemble Learning

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).

2.2 Pengertian Boosting

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

2.3 Adaptive Boosting (AdaBoost)

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.

  1. Memberikan bobot awal yang sama. Semua observasi dianggap sama penting sehingga diberi bobot:

\[ w_i^{(1)} = \frac{1}{n}, \qquad i = 1, 2, \ldots, n \]

dengan \(w_i^{(1)}\) adalah bobot observasi ke-\(i\) pada iterasi pertama.

  1. Membentuk weak learner. Pada setiap iterasi dibentuk weak learner \(G_m(x)\), kemudian dihitung kesalahan klasifikasi terbobot:

\[ 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.

  1. Memperbarui bobot. Observasi yang salah diklasifikasikan memperoleh bobot yang lebih besar sehingga learner berikutnya memberikan perhatian lebih besar pada observasi tersebut.

  2. 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.

2.4 Parameter Penting dalam Boosting

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).

2.5 Evaluasi Model Klasifikasi

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).

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

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).

3.2 Variabel Penelitian

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)

3.3 Algoritma Penelitian

Algoritma AdaBoost membentuk model melalui tahapan yang diulang sebanyak \(M\) kali (jumlah learner):

  • Tahap 1: memberi bobot awal yang sama pada seluruh observasi latih (\(w_i^{(1)} = 1/n\)).
  • Tahap 2: membentuk weak learner (decision stump) menggunakan bobot observasi saat ini, lalu menghitung kesalahan klasifikasi terbobot \(err_m\).
  • Tahap 3: menghitung bobot learner \(\alpha_m\) dan memperbarui bobot observasi sehingga observasi yang salah diklasifikasikan memperoleh bobot lebih besar.
  • Tahap 4: setelah \(M\) iterasi, menggabungkan seluruh learner melalui weighted voting untuk memperoleh prediksi akhir.

Langkah-langkah analisis pada praktikum ini adalah:

  1. Memuat library dan data BreastCancer, melihat struktur dan ringkasan data.
  2. Menghapus kolom Id dan observasi yang mengandung missing value (na.omit), serta memastikan Class bertipe factor.
  3. Membagi data menjadi data latih (70%) dan data uji (30%) dengan stratified splitting berdasarkan Class dan set.seed(234).
  4. Membentuk model AdaBoost (adabag::boosting, boos = FALSE, coeflearn = "Freund", maxdepth = 1) dengan 100 learner sebagai model acuan.
  5. Melakukan prediksi data uji dan menghitung confusion matrix serta ukuran evaluasi.
  6. Menganalisis perkembangan galat (errorevol) dan variable importance.
  7. Membandingkan model dengan 50, 100, dan 200 learner, kemudian menentukan jumlah learner terbaik.

3.4 Diagram Alir

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

Diagram Alir Penelitian

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Import Data

# 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 ...
summary(bc)
##          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.

4.2 Persiapan Data

# Menghapus Id karena hanya merupakan identifier
bc$Id <- NULL

cat("Jumlah observasi sebelum na.omit:", nrow(bc), "\n")
## Jumlah observasi sebelum na.omit: 699
cat("Jumlah missing value             :", sum(is.na(bc)), "\n")
## 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
# Memastikan respons berupa factor
bc$Class <- droplevels(as.factor(bc$Class))

levels(bc$Class)
## [1] "benign"    "malignant"
table(bc$Class)
## 
##    benign malignant 
##       444       239
round(prop.table(table(bc$Class)) * 100, 2)
## 
##    benign malignant 
##     65.01     34.99

Interpretasi.

  • Penghapusan 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.
  • Penanganan missing value. Observasi yang mengandung 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.
  • Distribusi kelas. Terdapat 444 sampel benign (65.01%) dan 239 sampel malignant (34.99%). Perbandingan kelas mayoritas terhadap minoritas sekitar 1.86 : 1. Ketidakseimbangan ini tergolong sedang, sehingga akurasi saja belum cukup untuk menilai model dan perlu dilengkapi Precision, Recall, Specificity, dan F1-score. Level Class berurutan benign kemudian malignant, sehingga kelas malignant ditetapkan secara eksplisit sebagai kelas positif.

4.3 Splitting Data (Training dan Testing)

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
dim(bc.test)
## [1] 204  10
table(bc.train$Class)
## 
##    benign malignant 
##       311       168
table(bc.test$Class)
## 
##    benign malignant 
##       133        71
round(prop.table(table(bc.train$Class)) * 100, 2)
## 
##    benign malignant 
##     64.93     35.07
round(prop.table(table(bc.test$Class)) * 100, 2)
## 
##    benign malignant 
##      65.2      34.8

Interpretasi.

  • Ukuran data. Data dibagi dengan stratified splitting berdasarkan 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).
  • Proporsi kelas. Pada data asli kelas malignant sebesar 34.99%, pada data latih 35.07% (168 observasi), dan pada data uji 34.8% (71 observasi). Ketiga proporsi ini sangat berdekatan sehingga stratifikasi berhasil menjaga komposisi kelas.
  • Fungsi pembagian data. Model dilatih hanya pada data latih, sedangkan data uji disimpan untuk menilai kemampuan model mengklasifikasikan data baru yang belum pernah dilihat sehingga kinerja model tidak terlihat terlalu optimistis.

4.4 Membentuk Model AdaBoost

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 ~ .
boost.ada$class[1:5]
## [1] "benign"    "benign"    "benign"    "malignant" "benign"
head(boost.ada$weights)
## [1] 2.5717138 1.9856256 1.5321449 1.0064655 1.0698480 0.5801999

Interpretasi.

  • Pengaturan model. Model dibangun dengan 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.
  • Bobot learner. Objek 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.
  • Sifat sekuensial. Berbeda dengan Bagging yang membentuk pohon secara independen, setiap stump pada AdaBoost dibentuk setelah bobot observasi diperbarui berdasarkan kesalahan stump sebelumnya.

4.5 Prediksi Data Testing dan Confusion Matrix

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       
## 
tab.ada <- table(Aktual = bc.test$Class, Prediksi = pred.ada)
tab.ada
##            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.

  • Komponen confusion matrix. Dari 204 sampel uji, model memprediksi dengan benar 67 sampel malignant (true positive) dan 130 sampel benign (true negative). Kesalahan terjadi pada 4 sampel malignant yang diprediksi benign (false negative) dan 3 sampel benign yang diprediksi malignant (false positive). Total kesalahan klasifikasi adalah 7 sampel.
  • Makna kesalahan. Dalam konteks medis, false negative (tumor ganas yang terlewat) lebih berbahaya daripada false positive (tumor jinak yang diduga ganas) karena dapat menunda penanganan, sehingga jumlah false negative perlu mendapat perhatian utama.
  • Visualisasi. Pada peta panas, sel diagonal (prediksi sama dengan aktual) berwarna lebih pekat dan berisi jumlah terbanyak, sedangkan sel di luar diagonal menunjukkan kesalahan klasifikasi.

4.6 Ukuran Evaluasi Klasifikasi

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.

  • Akurasi. Akurasi model pada data uji sebesar 96.57%, artinya 96.57% sampel uji diklasifikasikan dengan benar. Sebagai pembanding, tebakan selalu kelas mayoritas hanya menghasilkan akurasi sekitar 65.2%, sehingga akurasi model jauh melampaui batas dasar tersebut.
  • Recall dan specificity. Recall (sensitivitas) sebesar 94.37%, artinya 94.37% tumor ganas pada data uji berhasil terdeteksi. Specificity sebesar 97.74%, artinya 97.74% tumor jinak dikenali dengan benar.
  • Precision dan F1-score. Precision sebesar 95.71% menunjukkan bahwa dari seluruh sampel yang diprediksi malignant, sebesar itulah yang benar-benar ganas. F1-score sebesar 0.9504 merangkum keseimbangan antara precision dan recall.
  • Kesesuaian dengan 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.

4.7 Perkembangan Error AdaBoost

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
head(error.test$error)
## [1] 0.07843137 0.07843137 0.05882353 0.05392157 0.05392157 0.05882353
plot.errorevol(error.test, error.train)

Interpretasi.

  • Galat awal. Dengan satu stump, galat data latih sebesar 0.071 dan galat data uji sebesar 0.0784. Model satu stump hanya memakai satu aturan sederhana sehingga galatnya masih relatif tinggi.
  • Penurunan galat. Seiring bertambahnya learner, galat umumnya menurun karena setiap stump baru memperbaiki kesalahan yang masih tersisa. Pada 100 learner, galat data latih menjadi 0.0146 dan galat data uji 0.0343. Galat data uji terendah sebesar 0.0343 dicapai pada iterasi ke-25.
  • Gejala overfitting. Selisih galat data uji dan data latih pada 100 learner adalah 0.0197. Selisih ini kecil sehingga model cukup stabil dan tidak menunjukkan overfitting yang berarti.
  • Cara membaca grafik. Sumbu-x menunjukkan jumlah learner dan sumbu-y menunjukkan galat klasifikasi. Kurva data latih (train) dan data uji (test) yang berdekatan menunjukkan kemampuan generalisasi yang baik, sedangkan kurva yang mendatar berarti penambahan learner tidak lagi memberi perbaikan berarti.

4.8 Variable Importance

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.

  • Variabel terpenting. Tiga variabel dengan kepentingan tertinggi adalah Cell.size (39.43), Bare.nuclei (29.38), dan Cl.thickness (9.22). Ketiganya bersama-sama menyumbang 78.03% dari total kepentingan, artinya sebagian besar kemampuan model membedakan tumor jinak dan ganas berasal dari beberapa karakteristik sel saja.
  • Variabel kurang penting. Variabel dengan kepentingan terendah adalah Epith.c.size (1.91), yang berarti sumbangannya dalam mengurangi galat sangat kecil.
  • Catatan. Karena beberapa variabel karakteristik sel saling berkorelasi (misalnya Cell.size dan Cell.shape), urutan kepentingan sebaiknya dibaca sebagai gambaran kelompok variabel yang berpengaruh, bukan peringkat yang mutlak.

4.9 Perbandingan 50, 100, dan 200 Learner

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")
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.

  • Confusion matrix. Pada data uji (204 sampel), model 50 learner menghasilkan 4 false negative dan 3 false positive, model 100 learner menghasilkan 4 false negative dan 3 false positive, sedangkan model 200 learner menghasilkan 5 false negative dan 3 false positive.
  • Akurasi. Akurasi data uji berturut-turut sebesar 96.57% (50 learner), 96.57% (100 learner), dan 96.08% (200 learner). Selisih akurasi tertinggi dan terendah hanya 0.49 poin persentase. Sebagai pembanding, akurasi data latih sebesar 97.7%, 98.54%, dan 98.75%, sehingga akurasi data latih selalu lebih tinggi atau sama dengan akurasi data uji.
  • Recall dan specificity. Recall data uji sebesar 94.37%, 94.37%, dan 92.96%, sedangkan specificity sebesar 97.74%, 97.74%, dan 97.74% untuk 50, 100, dan 200 learner. Karena kelas positif adalah malignant, recall menjadi ukuran yang paling diperhatikan dalam konteks medis.
  • Precision dan F1-score. Precision sebesar 95.71%, 95.71%, dan 95.65%, dengan F1-score 0.9504, 0.9504, dan 0.9429 berturut-turut untuk 50, 100, dan 200 learner.
  • Jumlah learner terbaik. Berdasarkan akurasi data uji tertinggi, model dengan 50 learner merupakan yang terbaik. Namun selisih antarmodel sangat kecil (0.49 poin persentase), setara dengan beberapa sampel uji saja, sehingga perbedaan tersebut tidak dapat dianggap sebagai keunggulan yang pasti. Jika kinerjanya hampir sama, model dengan learner lebih sedikit lebih disukai karena lebih sederhana dan lebih ringan secara komputasi.
  • Kurva galat. Pada grafik, garis putus-putus vertikal menandai 50, 100, dan 200 learner. Galat data uji pada ketiga titik tersebut adalah 0.0343, 0.0343, dan 0.0392. Karena 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.
  • Catatan. Data uji relatif kecil (204 observasi), sehingga satu sampel yang berubah prediksinya sudah menggeser akurasi sekitar 0.49 poin persentase. Karena itu perbedaan antarmodel perlu ditafsirkan dengan hati-hati.

BAB V KESIMPULAN

5.1 Kesimpulan

  1. Konsep dan metode. Boosting adalah metode ensemble yang membentuk model-model sederhana (weak learner) secara berurutan, dengan setiap model baru memperbaiki kesalahan model sebelumnya. Pada AdaBoost, observasi yang salah diklasifikasikan diberi bobot lebih besar dan setiap learner diberi bobot \(\alpha_m\) berdasarkan galat terbobotnya, sehingga prediksi akhir diperoleh melalui weighted voting.
  2. Kondisi awal data. Dataset 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.
  3. Pembagian data. Data dibagi dengan stratified splitting menjadi 479 data latih dan 204 data uji dengan proporsi kelas malignant yang terjaga (35.07% pada data latih dan 34.8% pada data uji).
  4. Model acuan (100 learner). Pada data uji diperoleh akurasi 96.57%, precision 95.71%, recall 94.37%, specificity 97.74%, dan F1-score 0.9504, dengan 4 false negative dan 3 false positive.
  5. Perkembangan galat dan variabel penting. Galat menurun seiring bertambahnya learner; galat data uji terendah (0.0343) dicapai pada iterasi ke-25. Tiga variabel terpenting adalah Cell.size, Bare.nuclei, dan Cl.thickness.
  6. Perbandingan jumlah learner. Akurasi data uji untuk 50, 100, dan 200 learner berturut-turut adalah 96.57%, 96.57%, dan 96.08%. Model dengan 50 learner memberikan akurasi data uji tertinggi, tetapi selisih antarmodel sangat kecil sehingga pemilihan model sebaiknya juga mempertimbangkan kesederhanaan dan beban komputasi.
  7. Catatan dan saran. Karena data uji relatif kecil (204 observasi), ukuran evaluasi dapat berubah jika pembagian data diganti, sehingga disarankan menggunakan k-fold cross-validation untuk evaluasi yang lebih stabil. Dalam konteks medis, recall perlu diprioritaskan karena false negative lebih berisiko. Pada penelitian selanjutnya dapat dicoba pengaturan kedalaman pohon yang berbeda, penanganan missing value dengan imputasi (misalnya mice) sebagai pengganti penghapusan observasi, serta perbandingan dengan Bagging, Random Forest, atau Gradient Boosting.

DAFTAR PUSTAKA

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.