BAB I PENDAHULUAN

1.1 Latar Belakang

Machine learning merupakan cabang dari kecerdasan buatan yang memungkinkan komputer mempelajari pola dari data untuk membuat prediksi atau keputusan tanpa harus diprogram secara eksplisit untuk setiap kasus. Dalam statistika, pendekatan ini banyak dimanfaatkan untuk dua jenis permasalahan utama, yaitu klasifikasi yang responsnya berupa kategori dan regresi yang responsnya berupa nilai numerik. Meskipun begitu, satu model tunggal sering kali belum cukup baik: model yang terlalu sederhana cenderung gagal menangkap pola data (underfitting), sedangkan model yang terlalu kompleks mudah menghafal data latih (overfitting) sehingga kurang andal saat memprediksi data baru.

Pendekatan ensemble learning dikembangkan untuk mengatasi keterbatasan model tunggal, yaitu menggabungkan beberapa model dasar (base learner) agar diperoleh model gabungan dengan kemampuan prediksi yang lebih baik (Fransiska, 2026). Dua keluarga metode ensemble yang paling dikenal adalah bagging dan boosting. Bagging membentuk banyak model dari sampel bootstrap secara paralel lalu mengagregasi hasilnya, sehingga fokus utamanya adalah menurunkan variance. Sementara itu, boosting membangun model secara berurutan (sequential), di mana setiap model baru dibentuk dengan memperhatikan kesalahan yang masih dilakukan model sebelumnya.

Boosting bekerja dengan menggabungkan banyak model sederhana yang disebut weak learner menjadi satu model akhir yang lebih kuat atau strong learner. Salah satu algoritma boosting yang paling awal dan populer untuk klasifikasi adalah Adaptive Boosting (AdaBoost) yang diperkenalkan oleh Freund dan Schapire (1997), yaitu dengan memberikan bobot lebih besar pada pengamatan yang masih salah diklasifikasikan. Untuk kasus regresi, pendekatan Gradient Boosting yang dikembangkan Friedman (2001) membentuk learner baru untuk mempelajari residual dari model sebelumnya. Karena kinerjanya tidak hanya bergantung pada satu ukuran saja, hasil boosting perlu dievaluasi menggunakan ukuran yang sesuai, misalnya accuracy, precision, recall, specificity, dan F1-score pada klasifikasi, serta MSE, RMSE, MAE, dan \(R^2\) pada regresi.

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, rumusan masalah yang dapat disimpulkan yaitu:

  1. Bagaimana memahami boosting sebagai metode ensemble learning?
  2. Bagaimana mengimplementasikan boosting untuk kasus klasifikasi dan regresi menggunakan R?
  3. Bagaimana mengevaluasi performa model menggunakan ukuran evaluasi yang sesuai?

1.3 Tujuan

Berdasarkan rumusan masalah di atas, tujuan yang dapat disimpulkan yaitu:

  1. Praktikan dapat memahami boosting sebagai metode ensemble learning.
  2. Praktikan dapat mengimplementasikan boosting untuk kasus klasifikasi dan regresi menggunakan R.
  3. Praktikan dapat mengevaluasi performa model menggunakan ukuran evaluasi yang sesuai.

1.4 Manfaat Penelitian

Adapun manfaat dari praktikum ini yaitu:

  1. Bagi penulis, yaitu dapat memberikan informasi dan pengetahuan serta menerapkan ilmu pengetahuan mengenai metode boosting dengan R.
  2. Bagi pembaca, yaitu dapat menambah ilmu pengetahuan dan pemahaman mengenai metode boosting dan evaluasi performanya dengan R.

1.5 Batasan Masalah

Adapun batasan masalah dari praktikum ini, yaitu lakukan analisis boosting secara lengkap mulai dari persiapan data, pembentukan model, prediksi, evaluasi, visualisasi, dan interpretasi dengan set.seed(234) agar hasil pembagian data dapat direproduksi. Lakukan klasifikasi menggunakan AdaBoost pada dataset BreastCancer dengan fungsi adabag::boosting() dan decision stump sebagai weak learner. Bandingkan jumlah learner (mfinal) = 50, 100, dan 200, serta bandingkan performa model berdasarkan confusion matrix, accuracy, precision, recall, specificity, dan F1-score!

BAB II TINJAUAN PUSTAKA

2.1 Ensemble Learning dan Boosting

Ensemble learning merupakan pendekatan yang menggabungkan beberapa model dasar (base learner) agar diperoleh model gabungan yang memiliki kemampuan prediksi lebih baik. Bagging dan boosting sama-sama termasuk metode ensemble dengan tujuan meningkatkan performa prediksi, tetapi cara model-modelnya dibentuk berbeda secara mendasar (Fransiska, 2026).

Boosting adalah metode ensemble yang membentuk serangkaian model sederhana secara berurutan (sequential). Model berikutnya dibangun dengan memperhatikan kesalahan yang masih dilakukan oleh model sebelumnya. Oleh karena itu, kekuatan boosting tidak berasal dari satu model yang sangat kompleks, melainkan dari gabungan banyak model sederhana yang secara bertahap memperbaiki hasil prediksi. 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 supaya setiap pohon tetap sederhana. Perbedaan bagging dan boosting 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 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.2 Adaptive Boosting* (AdaBoost)

AdaBoost merupakan salah satu algoritma boosting yang digunakan untuk klasifikasi dengan menggabungkan beberapa weak learner untuk menghasilkan model klasifikasi yang lebih baik (Rosyidi & Rochmawati, 2024). Prinsip utamanya adalah memberikan perhatian lebih besar pada observasi yang masih salah diklasifikasikan. Pada klasifikasi berbasis pohon, base learner yang digunakan biasanya berupa pohon sederhana atau decision stump, yaitu pohon dengan satu kali pemisahan. Untuk klasifikasi biner dengan data latih \((x_i, y_i)\), \(i = 1, 2, \dots, n\), tahapan AdaBoost menurut Fransiska (2026) adalah sebagai berikut.

  1. Memberikan bobot awal yang sama pada seluruh observasi:

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

  2. Membentuk weak learner \(G_m(x)\) pada setiap iterasi, kemudian menghitung 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)}}\]

  3. Memperbarui bobot, di mana observasi yang salah diklasifikasikan memperoleh bobot lebih besar sehingga learner berikutnya lebih memperhatikannya.

  4. Menggabungkan learner. Setiap learner diberi bobot berdasarkan performanya,

    \[\alpha_m=\log\left(\frac{1-err_m}{err_m}\right)\]

    lalu prediksi akhir diperoleh melalui weighted voting:

    \[G(x)=\text{sign}\left[\sum_{m=1}^{M}\alpha_m G_m(x)\right]\]

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.3 Gradient Boosting

Pada kasus regresi, kesalahan model dilihat melalui residual, yaitu selisih antara nilai aktual dan nilai prediksi, \(e_i = y_i - \hat{y}_i\). Gradient Boosting membangun model secara bertahap dengan menambahkan learner baru untuk memperbaiki kesalahan prediksi model sebelumnya. Pada regresi dengan fungsi kerugian kuadrat, proses tersebut dapat dijelaskan melalui pembelajaran residual (Maulita dkk., 2024). Prosesnya dilakukan dengan membentuk model awal, menghitung residual, membentuk weak learner baru untuk mempelajari residual, menambahkan kontribusinya ke model sebelumnya, lalu mengulangi proses dengan residual yang baru. Model diperbarui secara bertahap menurut (Fransiska, 2026):

\[f_m(x)=f_{m-1}(x)+\nu h_m(x)\]

dengan \(f_{m-1}(x)\) adalah model pada iterasi sebelumnya, \(h_m(x)\) adalah weak learner pada iterasi ke-\(m\), dan \(\nu\) adalah learning rate atau shrinkage. Nilai \(\nu\) yang lebih kecil membuat proses belajar lebih perlahan dan biasanya membutuhkan lebih banyak iterasi.

2.4 Perbedaan Klasifikasi dan Regresi serta Parameter Boosting

Perbedaan penerapan boosting pada klasifikasi dan regresi dirangkum sebagai berikut (Fransiska, 2026):

Aspek Klasifikasi Regresi
Metode AdaBoost Gradient Boosting
Respons Kategorik Numerik/kontinu
Mekanisme yang ditekankan Memperbaiki salah klasifikasi Mempelajari residual
Prediksi Kelas/probabilitas Nilai numerik
Evaluasi Accuracy, precision, recall, specificity, F1 MSE, RMSE, MAE, \(R^2\)

Parameter penting dalam boosting meliputi jumlah iterasi atau jumlah learner yang menentukan banyaknya learner yang ditambahkan, learning rate \(\nu\) yang mengatur besar kontribusi setiap learner baru, serta kedalaman pohon yang mengatur kompleksitas setiap weak learner. Jumlah iterasi yang terlalu sedikit dapat menyebabkan underfitting, sedangkan model yang terlalu kompleks berpotensi mengalami overfitting, sehingga jumlah iterasi dan learning rate perlu dipilih dengan hati-hati (Fransiska, 2026).

2.5 Evaluasi Model Klasifikasi

Evaluasi model klasifikasi dilakukan menggunakan confusion matrix, yaitu tabel yang membandingkan kelas aktual dengan kelas hasil prediksi. Komponen confusion matrix terdiri atas True Negative (TN), False Positive (FP), False Negative (FN), dan True Positive (TP). Berdasarkan komponen tersebut, ukuran evaluasi yang digunakan adalah sebagai berikut.

  1. Accuracy, yaitu proporsi seluruh pengamatan yang diprediksi benar.

    \[\text{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN}\]

  2. Precision, yaitu proporsi prediksi positif yang benar-benar positif.

    \[\text{Precision}=\frac{TP}{TP+FP}\]

  3. Recall (sensitivity), yaitu proporsi data positif aktual yang berhasil dikenali model.

    \[\text{Recall}=\frac{TP}{TP+FN}\]

  4. Specificity, yaitu proporsi data negatif aktual yang berhasil dikenali model.

    \[\text{Specificity}=\frac{TN}{TN+FP}\]

  5. F1-score, yaitu rata-rata harmonik antara precision dan recall.

    \[F1=2\times\frac{\text{Precision}\times\text{Recall}}{\text{Precision}+\text{Recall}}\]

2.6 Evaluasi Model Regresi

Pada kasus regresi, evaluasi dilakukan dengan mengukur selisih antara nilai aktual dan nilai prediksi, yaitu menggunakan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi \(R^2\) (Fransiska, 2026). Nilai MSE, RMSE, dan MAE yang lebih kecil menunjukkan prediksi yang lebih dekat dengan nilai aktual, sedangkan nilai \(R^2\) yang lebih besar menunjukkan proporsi keragaman respons yang semakin baik dijelaskan oleh model.

BAB III METODE PENELITIAN

3.1 Sumber Data

Jenis data yang digunakan pada penelitian ini adalah data kategorik dengan variabel respon berupa kelas diagnosis tumor. Data yang digunakan merupakan dataset BreastCancer dari package mlbench pada R. Sumber data yang digunakan dalam penelitian ini yaitu data sekunder yang tersedia secara terbuka melalui package tersebut, terdiri atas 699 observasi dan 11 variabel. Setelah observasi yang mengandung missing value dihapus, data yang dianalisis berjumlah 683 observasi.

3.2 Variabel Penelitian

Penelitian ini menggunakan sepuluh variabel, yaitu satu variabel respon dan sembilan variabel prediktor. Variabel Class adalah variabel respon yang menunjukkan jenis tumor, yaitu benign (jinak) dan malignant (ganas), dengan malignant ditetapkan sebagai kelas positif. Sembilan variabel prediktor berupa hasil penilaian karakteristik sel pada skala 1 sampai 10, yaitu Cl.thickness (ketebalan gumpalan sel), Cell.size (keseragaman ukuran sel), Cell.shape (keseragaman bentuk sel), Marg.adhesion (perlekatan tepi), Epith.c.size (ukuran sel epitel tunggal), Bare.nuclei (inti sel telanjang), Bl.cromatin (kromatin yang halus), Normal.nucleoli (nukleolus normal), dan Mitoses (jumlah mitosis). Variabel Id tidak digunakan dalam pemodelan karena hanya berfungsi sebagai pengenal pasien.

3.3 Langkah-langkah Analisis

Berikut adalah langkah-langkah yang dilakukan dalam analisis:

  1. Memanggil package yang diperlukan, yaitu adabag, mlbench, caret, dan rpart.
  2. Membaca dan memeriksa struktur dataset BreastCancer.
  3. Menyiapkan data dengan menghapus variabel Id dan observasi yang mengandung missing value, serta memastikan respons berupa factor.
  4. Membagi data menjadi 70% data training dan 30% data testing dengan set.seed(234).
  5. Membentuk model AdaBoost dengan boosting() menggunakan decision stump (maxdepth = 1) dan mfinal = 50.
  6. Membuat prediksi pada data testing, menyusun confusion matrix, lalu menghitung accuracy, precision, recall, specificity, dan F1-score.
  7. Melihat perkembangan error dan variable importance dari model.
  8. Mengulangi langkah 5 sampai 7 untuk mfinal = 100 dan mfinal = 200.
  9. Membandingkan hasil ketiga model dan menginterpretasikan output dari setiap tahapan.

BAB IV HASIL DAN PEMBAHASAN

4.1 Persiapan Data

4.1.1 Eksplorasi Data

library(adabag)
library(mlbench)
library(caret)
library(rpart)

# Memuat data
data(BreastCancer, package = "mlbench")
bc <- BreastCancer

# Melihat struktur dan ringkasan data
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  
##                 
##                 
##                 
##                 
## 
# Memeriksa missing value
sapply(bc, function(x) sum(is.na(x)))
##              Id    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion 
##               0               0               0               0               0 
##    Epith.c.size     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses 
##               0              16               0               0               0 
##           Class 
##               0

Berdasarkan hasil pemeriksaan, dataset BreastCancer terdiri atas 699 observasi dan 11 variabel. Variabel Id berisi nomor pengenal pasien, sembilan variabel prediktor berupa penilaian karakteristik sel yang tersimpan sebagai factor berskala 1 sampai 10 (kecuali Class dan Id), dan variabel Class menjadi variabel respon. Pemeriksaan missing value menunjukkan bahwa hanya variabel Bare.nuclei yang memiliki data hilang, yaitu sebanyak 16 pengamatan. Karena jumlahnya kecil dibandingkan keseluruhan data, pengamatan tersebut dihapus pada tahap persiapan berikutnya.

4.1.2 Persiapan Data

# Menghapus Id karena hanya merupakan identifier
bc$Id <- NULL
# Menghapus observasi yang mengandung missing value
bc <- na.omit(bc)
# Memastikan respons berupa factor
bc$Class <- droplevels(as.factor(bc$Class))

# Melihat kategori respons
levels(bc$Class)
## [1] "benign"    "malignant"
# Distribusi kelas
table(bc$Class)
## 
##    benign malignant 
##       444       239
prop.table(table(bc$Class))
## 
##    benign malignant 
## 0.6500732 0.3499268

Setelah variabel Id dihapus dan 16 observasi yang mengandung missing value dibuang, data yang tersisa berjumlah 683 observasi dengan 10 variabel. Variabel Class memiliki dua kategori, yaitu benign dan malignant. Sebaran kelas menunjukkan 444 pengamatan benign (65,01%) dan 239 pengamatan malignant (34,99%). Kelas benign memang lebih banyak, tetapi perbedaannya belum terlalu ekstrem sehingga data tidak termasuk tidak seimbang yang parah dan masih dapat langsung dimodelkan.

4.1.3 Pembagian Data Training dan Testing

# Membagi data training dan testing (70% training dan 30% testing)
set.seed(234)
idx.cls <- createDataPartition(bc$Class, p = 0.70, list = FALSE)
bc.train <- bc[idx.cls, ]
bc.test <- bc[-idx.cls, ]

# Memeriksa ukuran data
dim(bc.train)
## [1] 479  10
dim(bc.test)
## [1] 204  10
# Distribusi kelas pada training dan testing
table(bc.train$Class)
## 
##    benign malignant 
##       311       168
table(bc.test$Class)
## 
##    benign malignant 
##       133        71
prop.table(table(bc.train$Class))
## 
##    benign malignant 
## 0.6492693 0.3507307
prop.table(table(bc.test$Class))
## 
##    benign malignant 
## 0.6519608 0.3480392

Data dibagi menjadi 479 observasi sebagai data training dan 204 observasi sebagai data testing (sekitar 70% dan 30%). Pada data training terdapat 311 pengamatan benign dan 168 pengamatan malignant, sedangkan pada data testing terdapat 133 pengamatan benign dan 71 pengamatan malignant. Proporsi kelas pada kedua data hampir sama dengan proporsi data awal (sekitar 65% benign dan 35% malignant) karena createDataPartition() melakukan pembagian secara stratified berdasarkan kelas. Dengan demikian, data testing cukup mewakili kondisi data keseluruhan.

4.2 Hasil AdaBoost dengan mfinal = 50

4.2.1 Pembentukan Model dan Prediksi

# Membentuk model AdaBoost (mfinal = 50)
set.seed(234)
boost.ada50 <- boosting(Class ~ ., data = bc.train,
                        boos = FALSE, mfinal = 50, coeflearn = "Freund",
                        control = rpart.control(maxdepth = 1, minsplit = 10, cp = 0))
boost.ada50$trees[1:2]
## [[1]]
## n= 479 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 479 0.35073070 benign (0.77410861 0.22589139)  
##   2) Cell.size=1,2 291 0.01461378 benign (0.98686034 0.01313966) *
##   3) Cell.size=3,4,5,6,7,8,9,10 188 0.05636743 malignant (0.23690224 0.76309776) *
## 
## [[2]]
## n= 479 
## 
## node), split, n, loss, yval, (yprob)
##       * denotes terminal node
## 
## 1) root 479 0.28384010 benign (0.8642427 0.1357573)  
##   2) Bare.nuclei=1,2,3,4 336 0.04044944 benign (0.9754087 0.0245913) *
##   3) Bare.nuclei=5,6,7,8,9,10 143 0.08027098 malignant (0.4541872 0.5458128) *
head(boost.ada50$weights)
## [1] 2.5717138 1.9856256 1.5321449 1.0064655 1.0698480 0.5801999
# Prediksi data testing
pred.ada50.obj <- predict(boost.ada50, newdata = bc.test)
pred.ada50 <- factor(pred.ada50.obj$class, levels = levels(bc.test$Class))
head(pred.ada50)
## [1] malignant benign    benign    benign    benign    malignant
## Levels: benign malignant
# Membandingkan aktual dan prediksi
hasil.ada50 <- data.frame(Aktual = bc.test$Class, Prediksi = pred.ada50)
head(hasil.ada50, 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

Model AdaBoost dengan mfinal = 50 membentuk 50 decision stump secara berurutan karena maxdepth = 1 membuat setiap pohon hanya melakukan satu kali pemisahan. Dua pohon pertama yang ditampilkan menunjukkan bahwa setiap learner hanya memakai satu variabel dan satu titik potong, sehingga benar-benar sederhana dan layak disebut weak learner. Bobot learner (weights) pada learner pertama sampai ketiga masing-masing sekitar 2,572, 1,986, dan 1,532. Nilainya semakin kecil karena setiap learner baru harus menangani pengamatan yang lebih sulit, sehingga tingkat kesalahannya lebih besar dan kontribusinya (nilai \(\alpha_m\)) menjadi lebih kecil. Pada 10 pengamatan pertama data testing, prediksi model dapat dibandingkan langsung dengan kelas aktualnya pada tabel hasil.ada50.

4.2.2 Confusion Matrix dan Ukuran Evaluasi

# Confusion Matrix
cm.ada50 <- confusionMatrix(data = pred.ada50, reference = bc.test$Class,
                            positive = "malignant")
cm.ada50
## 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       
## 
# Ukuran evaluasi klasifikasi secara manual
tab.ada50 <- table(Aktual = bc.test$Class, Prediksi = pred.ada50)
tab.ada50
##            Prediksi
## Aktual      benign malignant
##   benign       130         3
##   malignant      4        67
# Kelas positif = malignant
TN <- tab.ada50["benign", "benign"]
FP <- tab.ada50["benign", "malignant"]
FN <- tab.ada50["malignant", "benign"]
TP <- tab.ada50["malignant", "malignant"]

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.ada50 <- data.frame(Accuracy = Accuracy, Precision = Precision,
                             Recall = Recall, Specificity = Specificity,
                             F1_Score = F1)
round(evaluasi.ada50, 4)
##   Accuracy Precision Recall Specificity F1_Score
## 1   0.9657    0.9571 0.9437      0.9774   0.9504

Confusion matrix menunjukkan bahwa dari 133 pengamatan benign pada data testing, sebanyak 130 diprediksi benar (TN) dan 3 salah diprediksi malignant (FP). Dari 71 pengamatan malignant, sebanyak 67 diprediksi benar (TP) dan 4 salah diprediksi benign (FN). Dari angka tersebut diperoleh accuracy sebesar 0,9657, precision sebesar 0,9571, recall sebesar 0,9437, specificity sebesar 0,9774, dan F1-score sebesar 0,9504. Nilai accuracy ini jauh di atas No Information Rate sebesar 0,6520 (jika semua data ditebak sebagai benign), dengan nilai Kappa sebesar 0,9241 yang tergolong sangat baik. Dalam konteks diagnosis, 4 pasien ganas yang terlewat (FN) perlu mendapat perhatian lebih dibandingkan 3 pasien jinak yang diprediksi ganas (FP), karena kesalahan jenis pertama berisiko menunda penanganan.

4.2.3 Perkembangan Error dan Variable Importance

# Perkembangan error AdaBoost
error.train50 <- errorevol(boost.ada50, newdata = bc.train)
error.test50 <- errorevol(boost.ada50, newdata = bc.test)
head(error.train50$error)
## [1] 0.07098121 0.07098121 0.05636743 0.05219207 0.05219207 0.04592902
head(error.test50$error)
## [1] 0.07843137 0.07843137 0.05882353 0.05392157 0.05392157 0.05882353
tail(error.train50$error, 1)
## [1] 0.02296451
tail(error.test50$error, 1)
## [1] 0.03431373
plot.errorevol(error.test50, error.train50)

# Variable importance
importance.ada50 <- sort(boost.ada50$importance, decreasing = TRUE)
round(importance.ada50, 3)
##       Cell.size     Bare.nuclei    Cl.thickness   Marg.adhesion Normal.nucleoli 
##          41.858          30.642           8.954           7.325           4.738 
##         Mitoses     Bl.cromatin    Epith.c.size      Cell.shape 
##           2.568           1.741           1.369           0.805
barplot(importance.ada50, las = 2,
        main = "Variable Importance - AdaBoost (mfinal = 50)",
        ylab = "Importance")

Perkembangan error memperlihatkan bahwa error pada data training turun dari 0,0710 pada learner pertama menjadi 0,0230 pada learner ke-50. Error pada data testing juga turun cepat dari 0,0784 menjadi 0,0441 pada learner ke-10, lalu mencapai 0,0343 pada learner ke-25 dan bertahan di angka tersebut sampai learner ke-50. Artinya, sebagian besar perbaikan sudah terjadi pada iterasi-iterasi awal, dan penambahan learner setelah itu belum memberi perbaikan yang berarti pada data baru. Dari sisi variable importance, Cell.size menjadi variabel paling berpengaruh dengan nilai 41,858, diikuti Bare.nuclei sebesar 30,642, sedangkan Cl.thickness (8,954) dan Marg.adhesion (7,325) berada jauh di bawahnya. Variabel dengan kontribusi terkecil adalah Cell.shape (0,805). Dua variabel teratas saja sudah menyumbang sekitar 72,5% dari total importance.

4.3 Hasil AdaBoost dengan mfinal = 100

4.3.1 Pembentukan Model dan Prediksi

# Membentuk model AdaBoost (mfinal = 100)
set.seed(234)
boost.ada100 <- boosting(Class ~ ., data = bc.train,
                         boos = FALSE, mfinal = 100, coeflearn = "Freund",
                         control = rpart.control(maxdepth = 1, minsplit = 10, cp = 0))

# Prediksi data testing
pred.ada100.obj <- predict(boost.ada100, newdata = bc.test)
pred.ada100 <- factor(pred.ada100.obj$class, levels = levels(bc.test$Class))
head(pred.ada100)
## [1] malignant benign    benign    benign    benign    malignant
## Levels: benign malignant
hasil.ada100 <- data.frame(Aktual = bc.test$Class, Prediksi = pred.ada100)
head(hasil.ada100, 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

Model dengan mfinal = 100 menggunakan pengaturan yang sama dengan model sebelumnya, hanya jumlah learner-nya yang dilipatgandakan menjadi 100 decision stump. Karena set.seed(234) dan data training yang sama digunakan, 50 learner pertama pada model ini identik dengan model mfinal = 50, sehingga perbedaan hasil hanya berasal dari 50 learner tambahan. Prediksi kelas untuk data testing kemudian disusun dalam bentuk factor dengan urutan level yang sama seperti data aktual.

4.3.2 Confusion Matrix dan Ukuran Evaluasi

cm.ada100 <- confusionMatrix(data = pred.ada100, reference = bc.test$Class,
                             positive = "malignant")
cm.ada100
## 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.ada100 <- table(Aktual = bc.test$Class, Prediksi = pred.ada100)
tab.ada100
##            Prediksi
## Aktual      benign malignant
##   benign       130         3
##   malignant      4        67
TN <- tab.ada100["benign", "benign"]
FP <- tab.ada100["benign", "malignant"]
FN <- tab.ada100["malignant", "benign"]
TP <- tab.ada100["malignant", "malignant"]

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.ada100 <- data.frame(Accuracy = Accuracy, Precision = Precision,
                              Recall = Recall, Specificity = Specificity,
                              F1_Score = F1)
round(evaluasi.ada100, 4)
##   Accuracy Precision Recall Specificity F1_Score
## 1   0.9657    0.9571 0.9437      0.9774   0.9504

Confusion matrix pada mfinal = 100 sama persis dengan model sebelumnya, yaitu TN = 130, FP = 3, FN = 4, dan TP = 67. Akibatnya, accuracy sebesar 0,9657, precision sebesar 0,9571, recall sebesar 0,9437, specificity sebesar 0,9774, dan F1-score sebesar 0,9504 juga tidak berubah. Jadi, menambah learner dari 50 menjadi 100 tidak mengubah satu pun prediksi pada data testing, dan nilai Kappa tetap 0,9241.

4.3.3 Perkembangan Error dan Variable Importance

error.train100 <- errorevol(boost.ada100, newdata = bc.train)
error.test100 <- errorevol(boost.ada100, newdata = bc.test)
tail(error.train100$error, 1)
## [1] 0.01461378
tail(error.test100$error, 1)
## [1] 0.03431373
plot.errorevol(error.test100, error.train100)

importance.ada100 <- sort(boost.ada100$importance, decreasing = TRUE)
round(importance.ada100, 3)
##       Cell.size     Bare.nuclei    Cl.thickness   Marg.adhesion Normal.nucleoli 
##          39.433          29.378           9.222           7.404           5.516 
##         Mitoses     Bl.cromatin      Cell.shape    Epith.c.size 
##           2.924           2.153           2.064           1.907
barplot(importance.ada100, las = 2,
        main = "Variable Importance - AdaBoost (mfinal = 100)",
        ylab = "Importance")

Error pada data training terus menurun hingga 0,0146 pada learner ke-100, sedangkan error pada data testing sudah datar di 0,0343 sejak learner ke-25. Jarak antara kurva training dan testing pun semakin melebar, yang menandakan model makin pas dengan data latih tetapi tidak menjadi lebih baik pada data baru. Urutan variable importance tetap sama, yaitu Cell.size (39,433) dan Bare.nuclei (29,378) paling berpengaruh, diikuti Cl.thickness (9,222), Marg.adhesion (7,404), dan Normal.nucleoli (5,516). Nilai importance terlihat lebih merata dibanding model sebelumnya karena learner tambahan mulai memanfaatkan variabel lain seperti Cell.shape dan Epith.c.size.

4.4 Hasil AdaBoost dengan mfinal = 200

4.4.1 Pembentukan Model dan Prediksi

# Membentuk model AdaBoost (mfinal = 200)
set.seed(234)
boost.ada200 <- boosting(Class ~ ., data = bc.train,
                         boos = FALSE, mfinal = 200, coeflearn = "Freund",
                         control = rpart.control(maxdepth = 1, minsplit = 10, cp = 0))

# Prediksi data testing
pred.ada200.obj <- predict(boost.ada200, newdata = bc.test)
pred.ada200 <- factor(pred.ada200.obj$class, levels = levels(bc.test$Class))
head(pred.ada200)
## [1] malignant benign    benign    benign    benign    malignant
## Levels: benign malignant
hasil.ada200 <- data.frame(Aktual = bc.test$Class, Prediksi = pred.ada200)
head(hasil.ada200, 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

Model terakhir dibentuk dengan 200 decision stump. Pada model ini jumlah learner sudah empat kali lipat dari model pertama, sehingga model punya kapasitas yang lebih besar untuk menyesuaikan diri dengan data latih, termasuk pengamatan yang sulit atau mengandung noise.

4.4.2 Confusion Matrix dan Ukuran Evaluasi

cm.ada200 <- confusionMatrix(data = pred.ada200, reference = bc.test$Class,
                             positive = "malignant")
cm.ada200
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       130         5
##   malignant      3        66
##                                           
##                Accuracy : 0.9608          
##                  95% CI : (0.9242, 0.9829)
##     No Information Rate : 0.652           
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.913           
##                                           
##  Mcnemar's Test P-Value : 0.7237          
##                                           
##             Sensitivity : 0.9296          
##             Specificity : 0.9774          
##          Pos Pred Value : 0.9565          
##          Neg Pred Value : 0.9630          
##              Prevalence : 0.3480          
##          Detection Rate : 0.3235          
##    Detection Prevalence : 0.3382          
##       Balanced Accuracy : 0.9535          
##                                           
##        'Positive' Class : malignant       
## 
tab.ada200 <- table(Aktual = bc.test$Class, Prediksi = pred.ada200)
tab.ada200
##            Prediksi
## Aktual      benign malignant
##   benign       130         3
##   malignant      5        66
TN <- tab.ada200["benign", "benign"]
FP <- tab.ada200["benign", "malignant"]
FN <- tab.ada200["malignant", "benign"]
TP <- tab.ada200["malignant", "malignant"]

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.ada200 <- data.frame(Accuracy = Accuracy, Precision = Precision,
                              Recall = Recall, Specificity = Specificity,
                              F1_Score = F1)
round(evaluasi.ada200, 4)
##   Accuracy Precision Recall Specificity F1_Score
## 1   0.9608    0.9565 0.9296      0.9774   0.9429

Pada mfinal = 200, confusion matrix berubah sedikit: TN = 130, FP = 3, FN = 5, dan TP = 66. Satu pasien malignant yang sebelumnya terprediksi benar kini terprediksi benign, sehingga FN bertambah dari 4 menjadi 5. Dampaknya, accuracy turun menjadi 0,9608, precision menjadi 0,9565, recall menjadi 0,9296, dan F1-score menjadi 0,9429, sedangkan specificity tetap 0,9774 karena jumlah FP tidak berubah. Nilai Kappa juga turun dari 0,9241 menjadi 0,9130. Perubahannya memang hanya satu pengamatan dari 204 data testing, tetapi arahnya menunjukkan bahwa penambahan learner tidak selalu memperbaiki hasil.

4.4.3 Perkembangan Error dan Variable Importance

error.train200 <- errorevol(boost.ada200, newdata = bc.train)
error.test200 <- errorevol(boost.ada200, newdata = bc.test)
tail(error.train200$error, 1)
## [1] 0.0125261
tail(error.test200$error, 1)
## [1] 0.03921569
min(error.test200$error)
## [1] 0.03431373
which.min(error.test200$error)[1]
## [1] 25
plot.errorevol(error.test200, error.train200)

importance.ada200 <- sort(boost.ada200$importance, decreasing = TRUE)
round(importance.ada200, 3)
##       Cell.size     Bare.nuclei    Cl.thickness   Marg.adhesion Normal.nucleoli 
##          37.361          28.171           9.835           7.318           5.933 
##         Mitoses    Epith.c.size      Cell.shape     Bl.cromatin 
##           3.171           2.965           2.740           2.506
barplot(importance.ada200, las = 2,
        main = "Variable Importance - AdaBoost (mfinal = 200)",
        ylab = "Importance")

Error pada data training turun lagi hingga 0,0125, tetapi error pada data testing justru naik dari 0,0343 menjadi 0,0392 pada learner ke-200, padahal nilai terendahnya (0,0343) sudah tercapai sejak learner ke-25. Pola ini merupakan tanda awal overfitting, yaitu error data latih terus turun sementara error data uji berhenti membaik bahkan naik. Pada variable importance, Cell.size (37,361) dan Bare.nuclei (28,171) tetap menjadi dua variabel terpenting, tetapi kontribusi variabel lain seperti Epith.c.size (2,965), Cell.shape (2,740), dan Bl.cromatin (2,506) makin besar. Hal ini sejalan dengan dugaan bahwa learner tambahan mulai mengejar sisa pola yang kecil pada data latih.

4.5 Perbandingan Hasil mfinal = 50, 100, dan 200

# Membandingkan hasil ketiga model
hasil.boosting <- data.frame(
  mfinal = c(50, 100, 200),
  Train_Error = c(tail(error.train50$error, 1),
                  tail(error.train100$error, 1),
                  tail(error.train200$error, 1)),
  Test_Error = c(tail(error.test50$error, 1),
                 tail(error.test100$error, 1),
                 tail(error.test200$error, 1)),
  Accuracy = c(cm.ada50$overall["Accuracy"],
               cm.ada100$overall["Accuracy"],
               cm.ada200$overall["Accuracy"]),
  Precision = c(cm.ada50$byClass["Precision"],
                cm.ada100$byClass["Precision"],
                cm.ada200$byClass["Precision"]),
  Recall = c(cm.ada50$byClass["Recall"],
             cm.ada100$byClass["Recall"],
             cm.ada200$byClass["Recall"]),
  Specificity = c(cm.ada50$byClass["Specificity"],
                  cm.ada100$byClass["Specificity"],
                  cm.ada200$byClass["Specificity"]),
  F1_Score = c(cm.ada50$byClass["F1"],
               cm.ada100$byClass["F1"],
               cm.ada200$byClass["F1"])
)
hasil.boosting[, -1] <- round(hasil.boosting[, -1], 4)
hasil.boosting
##   mfinal Train_Error Test_Error Accuracy Precision Recall Specificity F1_Score
## 1     50      0.0230     0.0343   0.9657    0.9571 0.9437      0.9774   0.9504
## 2    100      0.0146     0.0343   0.9657    0.9571 0.9437      0.9774   0.9504
## 3    200      0.0125     0.0392   0.9608    0.9565 0.9296      0.9774   0.9429
# Plot perbandingan error
plot(hasil.boosting$mfinal, hasil.boosting$Train_Error, type = "b", lwd = 2,
     col = "blue", pch = 19, xaxt = "n",
     ylim = range(c(hasil.boosting$Train_Error, hasil.boosting$Test_Error)),
     xlab = "Jumlah Learner (mfinal)", ylab = "Error",
     main = "Perbandingan Training dan Testing Error")
lines(hasil.boosting$mfinal, hasil.boosting$Test_Error, type = "b",
      lwd = 2, col = "red", pch = 17)
axis(1, at = hasil.boosting$mfinal)
legend("right", legend = c("Training", "Testing"),
       col = c("blue", "red"), pch = c(19, 17), lwd = 2)

# Plot perbandingan ukuran evaluasi
ukuran <- t(as.matrix(hasil.boosting[, c("Accuracy", "Precision", "Recall",
                                         "Specificity", "F1_Score")]))
colnames(ukuran) <- paste("mfinal", hasil.boosting$mfinal)
barplot(ukuran, beside = TRUE, ylim = c(0.85, 1), xpd = FALSE,
        col = c("steelblue", "orange", "forestgreen", "firebrick", "purple"),
        main = "Perbandingan Ukuran Evaluasi", ylab = "Nilai")
legend("bottomright", legend = rownames(ukuran), fill = c("steelblue",
       "orange", "forestgreen", "firebrick", "purple"), cex = 0.7)

Tabel perbandingan memperlihatkan bahwa model dengan mfinal = 50 dan mfinal = 100 menghasilkan ukuran evaluasi yang sama persis pada data testing, yaitu accuracy 0,9657, precision 0,9571, recall 0,9437, specificity 0,9774, dan F1-score 0,9504. Model dengan mfinal = 200 sedikit lebih rendah pada hampir semua ukuran (accuracy 0,9608, recall 0,9296, F1-score 0,9429), kecuali specificity yang tetap 0,9774. Sementara itu, training error terus turun dari 0,0230 ke 0,0146 lalu 0,0125 seiring bertambahnya learner, tetapi testing error tidak ikut turun (0,0343, 0,0343, lalu 0,0392). Kesenjangan yang makin lebar antara kedua error ini menunjukkan bahwa tambahan learner lebih banyak dipakai untuk menyesuaikan data latih daripada meningkatkan kemampuan generalisasi.

Berdasarkan hasil tersebut, model terbaik adalah model dengan mfinal = 50 atau mfinal = 100 karena kinerjanya setara dan lebih baik daripada mfinal = 200. Jika kesederhanaan dan efisiensi komputasi dipertimbangkan, mfinal = 50 lebih layak dipilih karena hasilnya sama dengan mfinal = 100 tetapi hanya memerlukan setengah jumlah learner. Perlu dicatat bahwa selisih antarmodel hanya satu pengamatan dari 204 data testing, sehingga perbedaan ini belum tentu bermakna secara statistik dan bisa berubah bila pembagian data berbeda. Selain itu, karena kasus ini adalah klasifikasi, pembahasan Gradient Boosting untuk regresi pada modul hanya dibahas secara konsep dan tidak diterapkan pada soal praktikum ini.

BAB V KESIMPULAN

5.1 Kesimpulan

Boosting merupakan metode ensemble learning yang membentuk serangkaian model sederhana (weak learner) secara berurutan, di mana setiap model baru dibangun dengan memperhatikan kesalahan yang masih dilakukan model sebelumnya. Berbeda dengan bagging yang membangun model secara paralel dan independen untuk menurunkan variance, boosting memperbaiki kesalahan secara bertahap sehingga gabungan banyak weak learner menjadi strong learner. Pada klasifikasi, hal ini diwujudkan oleh AdaBoost melalui pemberian bobot lebih besar pada observasi yang salah diklasifikasikan dan bobot \(\alpha_m\) untuk setiap learner, sedangkan pada regresi Gradient Boosting membentuk learner baru untuk mempelajari residual dengan kontribusi yang diatur oleh learning rate.

Implementasi boosting di R untuk klasifikasi dilakukan dengan fungsi boosting() dari package adabag yang menggunakan decision stump sebagai weak learner dengan mengatur maxdepth = 1 dan jumlah learner melalui mfinal. Tahapannya meliputi persiapan data, pembagian data training dan testing dengan set.seed(234), pembentukan model, prediksi, evaluasi, serta visualisasi perkembangan error dan variable importance. Untuk regresi, implementasi dapat dilakukan dengan fungsi gbm() dari package gbm yang parameternya mencakup jumlah pohon (n.trees), shrinkage, dan interaction.depth, dengan jumlah iterasi optimal ditentukan melalui gbm.perf().

Performa model boosting dievaluasi dengan ukuran yang sesuai dengan jenis kasusnya. Pada klasifikasi digunakan confusion matrix untuk menghitung accuracy, precision, recall, specificity, dan F1-score, sedangkan pada regresi digunakan MSE, RMSE, MAE, dan \(R^2\). Selain itu, grafik perkembangan error pada data training dan testing membantu melihat jumlah learner yang cukup serta tanda-tanda overfitting, dan variable importance membantu mengetahui variabel yang paling berperan. Penggunaan beberapa ukuran evaluasi sekaligus membuat penilaian model lebih menyeluruh, misalnya recall yang penting dalam diagnosis karena menunjukkan seberapa banyak pasien ganas yang berhasil dikenali.

Berdasarkan hasil praktikum, AdaBoost berhasil diterapkan pada dataset BreastCancer dengan 479 data training dan 204 data testing. Model dengan mfinal = 50 dan mfinal = 100 menghasilkan accuracy 0,9657, precision 0,9571, recall 0,9437, specificity 0,9774, dan F1-score 0,9504, sedangkan model dengan mfinal = 200 sedikit menurun menjadi accuracy 0,9608, recall 0,9296, dan F1-score 0,9429 meskipun training error-nya terus mengecil. Variabel Cell.size dan Bare.nuclei menjadi variabel yang paling berpengaruh pada ketiga model. Dengan demikian, menambah jumlah learner tidak selalu meningkatkan performa pada data baru, dan model dengan mfinal = 50 dipilih sebagai model terbaik karena kinerjanya setara dengan mfinal = 100 dengan jumlah learner yang lebih sedikit.

5.2 Saran

Diharapkan praktikan mempelajari tentang penggunakan program R terlebih dahulu sebelum mengoperasikannya. Praktikan juga sebaiknya memperdalam penggunaan boosting. Ketelitian praktikan dalam penulisan listing juga diperlukan agar dapat berjalan lancar dan tidak terjadi eror.

DAFTAR PUSTAKA

Fransiska, H. (2026). Modul Praktikum Machine Learning dan Model Prediction. Universitas Bengkulu: Bengkulu.

Maulita, I., Widiawati, C. R. A., & Wahid, A. M. (2024). Analisis komparatif linear regression, random forest, dan gradient boosting untuk prediksi banjir. Jurnal Pendidikan dan Teknologi Indonesia, 4(8), 369–379. https://doi.org/10.52436/1.jpti.599

Rosyidi, M. I. U., & Rochmawati, N. (2024). Implementasi ensemble learning AdaBoost pada algoritma klasifikasi decision tree dan SVM untuk klasifikasi SMS berbahasa Indonesia. JIEET (Journal of Information Engineering and Educational Technology), 8(1), 7–13. https://doi.org/10.26740/jieet.v8n1.p7-13