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.
Berdasarkan latar belakang di atas, rumusan masalah yang dapat disimpulkan yaitu:
Berdasarkan rumusan masalah di atas, tujuan yang dapat disimpulkan yaitu:
Adapun manfaat dari praktikum ini yaitu:
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!
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 |
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.
Memberikan bobot awal yang sama pada seluruh observasi:
\[w_i^{(1)}=\frac{1}{n},\quad i=1,2,\dots,n\]
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)}}\]
Memperbarui bobot, di mana observasi yang salah diklasifikasikan memperoleh bobot lebih besar sehingga learner berikutnya lebih memperhatikannya.
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.
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.
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).
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.
Accuracy, yaitu proporsi seluruh pengamatan yang diprediksi benar.
\[\text{Accuracy}=\frac{TP+TN}{TP+TN+FP+FN}\]
Precision, yaitu proporsi prediksi positif yang benar-benar positif.
\[\text{Precision}=\frac{TP}{TP+FP}\]
Recall (sensitivity), yaitu proporsi data positif aktual yang berhasil dikenali model.
\[\text{Recall}=\frac{TP}{TP+FN}\]
Specificity, yaitu proporsi data negatif aktual yang berhasil dikenali model.
\[\text{Specificity}=\frac{TN}{TN+FP}\]
F1-score, yaitu rata-rata harmonik antara precision dan recall.
\[F1=2\times\frac{\text{Precision}\times\text{Recall}}{\text{Precision}+\text{Recall}}\]
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.
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.
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.
Berikut adalah langkah-langkah yang dilakukan dalam analisis:
adabag, mlbench, caret, dan
rpart.set.seed(234).boosting()
menggunakan decision stump (maxdepth = 1) dan
mfinal = 50.mfinal = 100 dan
mfinal = 200.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 ...
## 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
##
##
##
##
##
## 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.
# 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"
##
## benign malignant
## 444 239
##
## 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.
# 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
## [1] 204 10
##
## benign malignant
## 311 168
##
## benign malignant
## 133 71
##
## benign malignant
## 0.6492693 0.3507307
##
## 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.
mfinal = 50# 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) *
## [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.
# 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.
# 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
## [1] 0.07843137 0.07843137 0.05882353 0.05392157 0.05392157 0.05882353
## [1] 0.02296451
## [1] 0.03431373
# 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.
mfinal = 100# 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
## 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.
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
##
## 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.
error.train100 <- errorevol(boost.ada100, newdata = bc.train)
error.test100 <- errorevol(boost.ada100, newdata = bc.test)
tail(error.train100$error, 1)## [1] 0.01461378
## [1] 0.03431373
## 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.
mfinal = 200# 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
## 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.
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
##
## 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.
error.train200 <- errorevol(boost.ada200, newdata = bc.train)
error.test200 <- errorevol(boost.ada200, newdata = bc.test)
tail(error.train200$error, 1)## [1] 0.0125261
## [1] 0.03921569
## [1] 0.03431373
## [1] 25
## 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.
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.
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.
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.
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