BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan teknologi digital menyebabkan data yang dihasilkan semakin besar dan kompleks, sehingga dibutuhkan model prediksi yang tidak hanya akurat, tetapi juga stabil. Model prediksi tunggal, seperti pohon keputusan, umumnya mudah dibangun dan diinterpretasikan, tetapi kemampuannya terbatas ketika pola data semakin kompleks. Salah satu pendekatan untuk mengatasi keterbatasan tersebut adalah ensemble learning, yaitu pendekatan yang menggabungkan beberapa model dasar (base learner) agar diperoleh model gabungan yang memiliki kemampuan prediksi lebih baik (Fransiska, 2026).

Boosting merupakan salah satu metode ensemble learning yang membangun serangkaian model sederhana secara berurutan. Model sederhana pada setiap tahap disebut weak learner, dan penggabungan seluruh weak learner tersebut membentuk model akhir yang lebih kuat, yang disebut strong learner. Pada boosting berbasis pohon, pohon keputusan yang dangkal sering digunakan sebagai weak learner (Vincent & Rachmat, 2025).

Prinsip utama boosting adalah setiap model baru dibangun dengan memperhatikan kesalahan prediksi dari model sebelumnya. Pada kasus klasifikasi, hal ini dilakukan oleh Adaptive Boosting (AdaBoost) dengan memberikan bobot lebih besar pada sampel yang salah diklasifikasikan, sedangkan pada kasus regresi dilakukan oleh Gradient Boosting yang membangun model secara bertahap untuk meminimalkan fungsi loss melalui pendekatan gradient descent (Erkamim dkk., 2024).

Kinerja boosting dipengaruhi oleh beberapa parameter, yaitu jumlah iterasi, learning rate, dan kedalaman pohon. Jumlah iterasi yang terlalu sedikit dapat menyebabkan underfitting, sedangkan model yang terlalu kompleks berpotensi mengalami overfitting, sehingga parameter tersebut perlu dipilih dengan hati-hati. Berdasarkan hal tersebut, praktikum ini dilakukan untuk memahami konsep dasar boosting, mengimplementasikan Gradient Boosting untuk kasus regresi menggunakan R, serta mengevaluasi kinerjanya menggunakan MSE, RMSE, MAE, dan \(R^2\) (Fransiska, 2026).

1.2 Rumusan Masalah

  1. Apa yang dimaksud dengan Boosting sebagai metode ensemble learning?
  2. Bagaimana cara mengimplementasikan Boosting untuk kasus klasifikasi dan regresi menggunakan R?
  3. Bagaimana cara mengevaluasi performa model menggunakan ukuran evaluasi yang sesuai?

1.3 Tujuan Praktikum

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

1.4 Batasan Masalah

Adapun batasan masalah yang ditentukan pada penelitian ini, yaitu lakukan regresi menggunakan Gradient Boosting pada data Friedman. Clue : Gunakan gbm() dan bandingkan nilai learning rate (shrinkage) 𝜈 = 0.01, 0.05, dan 0.10. Gunakan cross-validation untuk menentukan jumlah iterasi optimal pada masing-masing model. Bandingkan performa berdasarkan MSE, RMSE, MAE, dan 𝑅2, kemudian interpretasikan hasilnya.

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. Pada bagging, banyak model dibentuk dari sampel bootstrap secara relatif independen kemudian hasil prediksinya digabungkan, sedangkan pada boosting model-model dibentuk secara berurutan sehingga learner berikutnya bergantung pada hasil learner sebelumnya (Fransiska, 2026).

Boosting adalah metode ensemble yang membentuk serangkaian model sederhana secara berurutan. Model sederhana pada setiap tahap disebut weak learner, dan gabungan seluruh weak learner membentuk model akhir yang lebih kuat, yang disebut strong learner (Vincent & Rachmat, 2025).

Pada Boosting berbasis pohon, decision tree sering digunakan sebagai base learner. Kedalaman pohon dapat dibatasi sehingga setiap pohon tetap sederhana dan berperan sebagai weak learner. Selanjutnya, kontribusi dari pohon-pohon tersebut digabungkan secara bertahap sehingga membentuk model Boosting akhir. Karena Bagging dan Boosting sama-sama termasuk metode ensemble learning, perbedaannya adalah sebagai berikut (Fransiska, 2026).

Tabel 1. Perbedaan Bagging dan Boosting

Aspek Bagging Boosting
Cara membangun model Paralel atau 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 Dapat berbeda, misalnya pada AdaBoost melalui \(\alpha_m\)
Base learner Sering menggunakan pohon yang relatif besar Umumnya learner sederhana atau pohon dangkal
Komputasi Mudah diparalelkan Lebih sulit diparalelkan karena bersifat sequential
Parameter penting Jumlah model atau bootstrap Jumlah iterasi, learning rate, dan kompleksitas learner

Keunggulan utama boosting terletak pada kemampuannya untuk mengurangi bias dan variance sehingga meningkatkan akurasi model secara keseluruhan, dan teknik ini dapat digunakan untuk tugas klasifikasi maupun regresi (Erkamim dkk., 2024).

2.2 Adaptive Boosting (AdaBoost)

AdaBoost (Adaptive Boosting) adalah salah satu algoritma boosting pertama yang diperkenalkan oleh Freund dan Schapire. Algoritma ini mengubah sejumlah model prediksi lemah menjadi model prediksi yang kuat melalui proses iteratif yang berfokus pada kesalahan model sebelumnya (Erkamim dkk., 2024).

Untuk klasifikasi biner dengan data latih \((x_i, y_i)\), \(i = 1, 2, \dots, n\), proses AdaBoost secara sederhana dilakukan sebagai berikut (Fransiska, 2026):

1.Memberikan bobot awal yang sama

Pada awal proses, semua observasi dianggap sama penting sehingga diberi bobot yang sama, sebesar:

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

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

2.Membentuk weak learner

Pada setiap iterasi dibentuk weak learner \(G_m(x)\). Setelah prediksi dilakukan, 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)}} \]

Keterangan:

  • \(err_m\) = kesalahan klasifikasi terbobot pada learner ke-\(m\);
  • \(w_i^{(m)}\) = bobot observasi ke-\(i\) pada iterasi ke-\(m\);
  • \(G_m(x_i)\) = kelas hasil prediksi learner ke-\(m\) untuk observasi ke-\(i\);
  • \(I\{y_i \neq G_m(x_i)\}\) = fungsi indikator, bernilai 1 apabila observasi ke-\(i\) salah diklasifikasikan dan 0 apabila diklasifikasikan dengan benar.

3.Memperbarui bobot

Observasi yang salah diklasifikasikan memperoleh bobot yang lebih besar sehingga learner berikutnya memberikan perhatian lebih besar pada observasi tersebut. Dengan demikian, setiap learner baru berusaha memperbaiki kesalahan yang masih dilakukan oleh learner sebelumnya.

4.Menggabungkan learner

Setiap learner diberi bobot berdasarkan performanya:

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

dengan \(\alpha_m\) merupakan bobot atau tingkat kontribusi learner ke-\(m\) terhadap prediksi akhir. Kemudian prediksi akhir diperoleh melalui weighted voting:

\[ G(x) = \text{sign}\left[\sum_{m=1}^{M} \alpha_m G_m(x)\right] \] dengan \(M\) merupakan jumlah seluruh weak learner, sedangkan fungsi \(\text{sign}(\cdot)\) menentukan kelas akhir berdasarkan tanda dari jumlah voting terbobot tersebut.

2.3 Gradient Boosting

Gradient Boosting adalah teknik boosting yang menggabungkan konsep boosting dengan pendekatan gradient descent untuk meminimalkan fungsi loss. Model dibangun secara bertahap dan setiap model baru mengoreksi kesalahan dari model sebelumnya (Erkamim dkk., 2024).

Pada kasus regresi, kesalahan model dilihat melalui residual, yaitu selisih antara nilai aktual dan nilai prediksi. Proses Gradient Boosting secara sederhana dilakukan dengan membentuk model awal, menghitung residual, membentuk weak learner baru untuk mempelajari residual tersebut, menambahkan kontribusinya ke model sebelumnya, lalu menghitung residual baru dan mengulangi proses (Fransiska, 2026).

\[ e_i = y_i - \hat{y}_i \]

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

Pada persamaan tersebut, \(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 learning rate yang semakin menuju nol akan mengurangi kontribusi yang diberikan oleh setiap weak learner, sedangkan kedalaman pohon biasanya dibatasi agar pohon tetap sederhana dan terhindar dari overfitting (Vincent & Rachmat, 2025).

2.4 Boosting untuk Klasifikasi dan Regresi

Dalam praktikum ini, konsep boosting untuk klasifikasi diperkenalkan melalui AdaBoost, sedangkan untuk regresi diperkenalkan melalui Gradient Boosting. Perbedaan keduanya dirangkum pada Tabel 2 (Fransiska, 2026).

Tabel 2. Perbedaan Boosting pada Klasifikasi dan Regresi

Aspek Klasifikasi Regresi
Metode AdaBoost Gradient Boosting
Respon Kategorik Numerik atau kontinu
Mekanisme yang ditekankan Memperbaiki salah klasifikasi Mempelajari residual
Prediksi Kelas atau probabilitas Nilai numerik
Evaluasi Accuracy, Precision, Recall, Specificity, F1 MSE, RMSE, MAE, \(R^2\)

2.5 Parameter Penting dalam Boosting

Kinerja gradient boosting bergantung pada beberapa parameter, antara lain learning rate, jumlah tahap boosting (jumlah pohon), dan kedalaman pohon, yang perlu disetel agar model memberikan performa optimal (Vincent & Rachmat, 2025). Parameter tersebut beserta argumen yang digunakan pada fungsi gbm() dirangkum pada Tabel 3.

Tabel 3. Parameter Penting dalam Boosting

Parameter Peran Argumen pada gbm()
Jumlah iterasi atau jumlah learner Menentukan berapa banyak learner yang ditambahkan n.trees
Learning rate \(\nu\) Mengatur besar kontribusi setiap learner baru shrinkage
Kedalaman pohon Mengatur kompleksitas setiap weak learner interaction.depth

Jumlah iterasi yang terlalu sedikit dapat menyebabkan underfitting, sedangkan model yang terlalu kompleks berpotensi mengalami overfitting. Oleh karena itu, jumlah iterasi dan learning rate perlu dipilih dengan hati-hati, misalnya dengan cross-validation untuk menentukan jumlah iterasi optimal (Fransiska, 2026).

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

Jenis data yang digunakan dalam penelitian ini adalah data kuantitatif, yaitu data berbentuk angka yang dapat diolah dan dianalisis secara statistik. Sumber data yang digunakan merupakan data simulasi yang dibangkitkan melalui fungsi mlbench.friedman1() pada package mlbench dalam perangkat lunak R, sesuai dengan arahan modul praktikum (Fransiska, 2026). Dataset ini terdiri dari 200 pengamatan dengan satu variabel respon (y) dan sepuluh variabel prediktor yang digunakan untuk membangun model prediksi menggunakan metode Gradient Boosting Regression dengan learning rate sebesar 0,01, 0,05, dan 0,10.

3.2 Variabel Penelitian

Tabel 4. Variabel Penelitian

No Variabel Keterangan Tipe Data Peran
1 y Variabel respon hasil simulasi Friedman, dibangkitkan dari fungsi \(10\sin(\pi x_1 x_2) + 20(x_3 - 0{,}5)^2 + 10x_4 + 5x_5 + \varepsilon\) Numerik Respon
2 x.1 Variabel prediktor ke-1, berdistribusi seragam pada interval [0, 1] Numerik Prediktor
3 x.2 Variabel prediktor ke-2, berdistribusi seragam pada interval [0, 1] Numerik Prediktor
4 x.3 Variabel prediktor ke-3, berdistribusi seragam pada interval [0, 1] Numerik Prediktor
5 x.4 Variabel prediktor ke-4, berdistribusi seragam pada interval [0, 1] Numerik Prediktor
6 x.5 Variabel prediktor ke-5, berdistribusi seragam pada interval [0, 1] Numerik Prediktor
7 x.6 Variabel prediktor ke-6, berdistribusi seragam pada interval [0, 1] dan tidak memengaruhi respon (noise) Numerik Prediktor
8 x.7 Variabel prediktor ke-7, berdistribusi seragam pada interval [0, 1] dan tidak memengaruhi respon (noise) Numerik Prediktor
9 x.8 Variabel prediktor ke-8, berdistribusi seragam pada interval [0, 1] dan tidak memengaruhi respon (noise) Numerik Prediktor
10 x.9 Variabel prediktor ke-9, berdistribusi seragam pada interval [0, 1] dan tidak memengaruhi respon (noise) Numerik Prediktor
11 x.10 Variabel prediktor ke-10, berdistribusi seragam pada interval [0, 1] dan tidak memengaruhi respon (noise) Numerik Prediktor

3.3 Langkah-langkah Analisis

  1. Memanggil package yang dibutuhkan, yaitu gbm untuk membangun model Gradient Boosting, mlbench untuk membangkitkan data Friedman, caret untuk membagi data, dan knitr untuk menampilkan tabel.
  2. Membangkitkan data Friedman #1 sebanyak 200 pengamatan menggunakan fungsi mlbench.friedman1() yang diawali set.seed(234), kemudian mengubahnya menjadi data frame.
  3. Membagi data menjadi 70% data training dan 30% data testing menggunakan fungsi createDataPartition() dengan set.seed(234).
  4. Membangun model Gradient Boosting Regression menggunakan fungsi gbm() dengan nilai shrinkage sebesar 0,01, 0,05, dan 0,10, serta cv.folds = 10.
  5. Menentukan jumlah iterasi optimal pada masing-masing model berdasarkan galat cross-validation menggunakan fungsi gbm.perf().
  6. Memprediksi nilai respon pada data testing menggunakan jumlah iterasi optimal masing-masing model.
  7. Menghitung metrik evaluasi pada setiap model, yaitu MSE, RMSE, MAE, dan \(R^2\).
  8. Membandingkan hasil metrik evaluasi dari ketiga nilai shrinkage untuk menentukan model terbaik, yaitu model dengan nilai MSE, RMSE, dan MAE terkecil serta \(R^2\) terbesar.
  9. Membuat plot nilai aktual terhadap nilai prediksi dan plot residual.
  10. Menampilkan variable importance pada model terbaik.
  11. Menginterpretasikan hasil dan menarik kesimpulan.

3.4 Diagram Alir Penelitian

BAB IV Hasil dan Pembahasan

4.1 Persiapan Data

Tahap awal adalah memanggil package yang dibutuhkan, yaitu gbm untuk membangun model Gradient Boosting, mlbench untuk membangkitkan data Friedman, caret untuk membagi data, dan knitr untuk menampilkan tabel. Kemudian data Friedman #1 dibangkitkan sebanyak 200 pengamatan dengan set.seed(234) agar hasil dapat direproduksi.

library(gbm)
library(mlbench)
library(caret)
library(knitr)

set.seed(234)
reg.data <- as.data.frame(mlbench.friedman1(200))

dim(reg.data)
## [1] 200  11
str(reg.data)
## 'data.frame':    200 obs. of  11 variables:
##  $ x.1 : num  0.7456 0.7817 0.02 0.7761 0.0669 ...
##  $ x.2 : num  0.575 0.316 0.765 0.229 0.172 ...
##  $ x.3 : num  0.0289 0.9375 0.7978 0.668 0.5974 ...
##  $ x.4 : num  0.72 0.185 0.534 0.553 0.755 ...
##  $ x.5 : num  0.875 0.704 0.952 0.478 0.533 ...
##  $ x.6 : num  0.276 0.643 0.987 0.843 0.733 ...
##  $ x.7 : num  0.9332 0.4018 0.0874 0.893 0.1024 ...
##  $ x.8 : num  0.60746 0.00369 0.0106 0.44639 0.83494 ...
##  $ x.9 : num  0.756 0.405 0.247 0.144 0.187 ...
##  $ x.10: num  0.718 0.534 0.667 0.68 0.595 ...
##  $ y   : num  24.35 18.05 12.02 12.1 9.91 ...
head(reg.data)
##          x.1       x.2        x.3       x.4       x.5       x.6        x.7
## 1 0.74562000 0.5754994 0.02885590 0.7201653 0.8748022 0.2761835 0.93319087
## 2 0.78171242 0.3157821 0.93745388 0.1849746 0.7039934 0.6426889 0.40177800
## 3 0.02003711 0.7646459 0.79777294 0.5338609 0.9515834 0.9873938 0.08742998
## 4 0.77608539 0.2289793 0.66797951 0.5534984 0.4780999 0.8425175 0.89302195
## 5 0.06691009 0.1715219 0.59740948 0.7547957 0.5332404 0.7327976 0.10244557
## 6 0.64479512 0.6473963 0.01351334 0.7894812 0.2376348 0.4302338 0.88236742
##           x.8       x.9      x.10         y
## 1 0.607462891 0.7560942 0.7179672 24.349507
## 2 0.003687496 0.4046106 0.5338439 18.046792
## 3 0.010598118 0.2473974 0.6669937 12.018651
## 4 0.446393069 0.1443539 0.6802987 12.101870
## 5 0.834936006 0.1874371 0.5950115  9.911772
## 6 0.843509237 0.6166422 0.1081932 21.874286
summary(reg.data$y)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.082  10.593  13.810  14.270  18.063  26.146

Interpretasi:

Berdasarkan hasil pemeriksaan data, data Friedman #1 terdiri atas 200 pengamatan dan 11 variabel, yaitu 10 variabel prediktor (x.1 hingga x.10) dan satu variabel respons (y). Seluruh variabel bertipe numerik sehingga dapat digunakan dalam analisis regresi Gradient Boosting.

Hasil ringkasan variabel respons menunjukkan nilai minimum sebesar 3,082, kuartil pertama sebesar 10,593, median sebesar 13,810, rata-rata sebesar 14,270, kuartil ketiga sebesar 18,063, dan nilai maksimum sebesar 26,146. Nilai rata-rata yang sedikit lebih besar daripada median menunjukkan bahwa distribusi variabel respons cenderung sedikit menceng ke kanan.

4.2 Pembagian Data Training dan Testing

Kemudian data dibagi menjadi 70% data training dan 30% data testing menggunakan fungsi createDataPartition() dengan set.seed(234). Karena variabel respon berupa data numerik, pembagian dilakukan berdasarkan kelompok nilai respon sehingga sebaran y pada kedua data relatif serupa.

set.seed(234)
idx.reg   <- createDataPartition(reg.data$y, p = 0.70, list = FALSE)
reg.train <- reg.data[idx.reg, ]
reg.test  <- reg.data[-idx.reg, ]

dim(reg.train)
## [1] 140  11
dim(reg.test)
## [1] 60 11

Interpretasi:

Berdasarkan hasil pembagian data, sebanyak 200 pengamatan dibagi menjadi 140 pengamatan data training dan 60 pengamatan data testing. Data training mencakup 70% dari keseluruhan data, sedangkan data testing mencakup 30%. Masing-masing kelompok terdiri atas 11 variabel, yaitu 10 variabel prediktor dan satu variabel respons. Data training digunakan untuk membangun model regresi Gradient Boosting, sedangkan data testing digunakan untuk mengukur kemampuan model dalam memprediksi data yang belum pernah digunakan selama proses pelatihan.

4.3 Pembentukan Model Gradient Boosting

Model Gradient Boosting dibangun dengan fungsi gbm() menggunakan distribusi gaussian (regresi dengan galat kuadrat). Model dibuat tiga kali dengan nilai shrinkage 0,01, 0,05, dan 0,10, sedangkan parameter lainnya dibuat sama, yaitu interaction.depth = 2, bag.fraction = 1, n.minobsinnode = 5, dan cv.folds = 10. Jumlah pohon maksimum (n.trees) ditetapkan sebesar 5000 pada seluruh model agar shrinkage yang kecil tetap memiliki cukup iterasi untuk mencapai galat cross-validation minimum.

shrink_set <- c(0.01, 0.05, 0.10)
shrink_lab <- c("0.01", "0.05", "0.10")
n_trees    <- 5000

boost_list        <- vector("list", length(shrink_set))
names(boost_list) <- shrink_lab

for (i in seq_along(shrink_set)) {
  set.seed(234)
  boost_list[[i]] <- gbm(formula = y ~ ., data = reg.train,
                         distribution = "gaussian", n.trees = n_trees,
                         interaction.depth = 2, shrinkage = shrink_set[i],
                         bag.fraction = 1, cv.folds = 10,
                         n.minobsinnode = 5, verbose = FALSE)
}

for (i in seq_along(boost_list)) {
  cat("shrinkage =", shrink_lab[i], "\n")
  print(boost_list[[i]])
  cat("\n")
}
## shrinkage = 0.01 
## gbm(formula = y ~ ., distribution = "gaussian", data = reg.train, 
##     n.trees = n_trees, interaction.depth = 2, n.minobsinnode = 5, 
##     shrinkage = shrink_set[i], bag.fraction = 1, cv.folds = 10, 
##     verbose = FALSE)
## A gradient boosted model with gaussian loss function.
## 5000 iterations were performed.
## The best cross-validation iteration was 2038.
## There were 10 predictors of which 10 had non-zero influence.
## 
## shrinkage = 0.05 
## gbm(formula = y ~ ., distribution = "gaussian", data = reg.train, 
##     n.trees = n_trees, interaction.depth = 2, n.minobsinnode = 5, 
##     shrinkage = shrink_set[i], bag.fraction = 1, cv.folds = 10, 
##     verbose = FALSE)
## A gradient boosted model with gaussian loss function.
## 5000 iterations were performed.
## The best cross-validation iteration was 458.
## There were 10 predictors of which 10 had non-zero influence.
## 
## shrinkage = 0.10 
## gbm(formula = y ~ ., distribution = "gaussian", data = reg.train, 
##     n.trees = n_trees, interaction.depth = 2, n.minobsinnode = 5, 
##     shrinkage = shrink_set[i], bag.fraction = 1, cv.folds = 10, 
##     verbose = FALSE)
## A gradient boosted model with gaussian loss function.
## 5000 iterations were performed.
## The best cross-validation iteration was 212.
## There were 10 predictors of which 10 had non-zero influence.
# Iterasi optimal berdasarkan cross-validation
best_iter <- sapply(boost_list, function(m) {
  gbm.perf(m, method = "cv", plot.it = FALSE)
})

Interpretasi:

Berdasarkan hasil pemodelan regresi Gradient Boosting menggunakan fungsi gbm(), dilakukan perbandingan tiga nilai learning rate (shrinkage), yaitu 0,01, 0,05, dan 0,10. Setiap model dibangun dengan jumlah maksimum 5.000 iterasi, kedalaman interaksi sebesar 2, bag fraction sebesar 1, serta validasi silang 10 lipatan (10-fold cross-validation) untuk menentukan jumlah iterasi optimal. Hasil pemodelan menunjukkan bahwa nilai shrinkage 0,01 memperoleh iterasi optimal sebanyak 2.038, sedangkan shrinkage 0,05 memperoleh 458 iterasi dan shrinkage 0,10 memperoleh 212 iterasi. Hasil tersebut menunjukkan bahwa semakin besar nilai shrinkage yang digunakan, semakin sedikit iterasi optimal yang diperlukan untuk membangun model. Hal ini terjadi karena nilai learning rate yang lebih besar memungkinkan setiap pohon memberikan kontribusi yang lebih besar terhadap pembaruan model.

4.4 Penentuan Jumlah Iterasi Optimal

Jumlah iterasi optimal ditentukan dengan fungsi gbm.perf() menggunakan method = "cv", yaitu iterasi yang menghasilkan galat cross-validation terkecil. Hasilnya disajikan dalam tabel dan plot perkembangan galat.

iter_df <- data.frame(
  Shrinkage       = shrink_set,
  Iterasi_Optimal = as.integer(best_iter),
  CV_MSE          = sapply(boost_list, function(m) min(m$cv.error)),
  row.names       = NULL
)

kable(iter_df, digits = 4, align = "c",
      caption = "Tabel 5. Jumlah Iterasi Optimal Hasil Cross-Validation")
Tabel 5. Jumlah Iterasi Optimal Hasil Cross-Validation
Shrinkage Iterasi_Optimal CV_MSE
0.01 2038 4.0047
0.05 458 4.0046
0.10 212 3.9630

Interpretasi:

Berdasarkan Tabel 5, penentuan jumlah iterasi optimal dilakukan menggunakan metode cross-validation untuk memperoleh nilai MSE terkecil pada setiap model. Hasil menunjukkan bahwa shrinkage 0,01 memperoleh iterasi optimal sebanyak 2.038 dengan nilai CV_MSE sebesar 4,0047. Pada shrinkage 0,05, iterasi optimal diperoleh sebanyak 458 dengan CV_MSE sebesar 4,0046. Sementara itu, shrinkage 0,10 memperoleh iterasi optimal sebanyak 212 dengan CV_MSE sebesar 3,9630. Dari ketiga model tersebut, shrinkage 0,10 menghasilkan nilai CV_MSE terkecil, sehingga memiliki kinerja terbaik berdasarkan hasil cross-validation.

par(mfrow = c(1, 3))
for (i in seq_along(boost_list)) {
  m <- boost_list[[i]]
  plot(m$cv.error, type = "l", lwd = 2, col = "steelblue",
       ylim = range(c(m$cv.error, m$train.error)),
       xlab = "Jumlah iterasi", ylab = "Galat (MSE)",
       main = paste("shrinkage =", shrink_lab[i]))
  lines(m$train.error, lwd = 2, lty = 2, col = "grey40")
  abline(v = best_iter[[i]], lty = 3, lwd = 2, col = "red")
  legend("topright", legend = c("CV", "Training", "Iterasi optimal"),
         col = c("steelblue", "grey40", "red"), lty = c(1, 2, 3),
         lwd = 2, cex = 0.7)
}

par(mfrow = c(1, 1))

Interpretasi:

Berdasarkan hasil pemodelan, jumlah iterasi optimal adalah 2038 untuk shrinkage = 0,01, 458 untuk shrinkage = 0,05, dan 212 untuk shrinkage = 0,10. Semakin besar nilai learning rate, semakin sedikit iterasi yang dibutuhkan untuk mencapai galat cross-validation minimum. Galat training (garis putus-putus abu-abu) terus menurun seiring bertambahnya iterasi, sedangkan galat cross-validation (garis biru) menurun tajam pada iterasi awal, kemudian cenderung mendatar. Garis merah putus-putus menunjukkan jumlah iterasi optimal yang dipilih berdasarkan cross-validation. Setelah mencapai titik optimal, penambahan iterasi tidak selalu memperbaiki kemampuan prediksi model meskipun galat training terus menurun. Hal ini menunjukkan pentingnya menentukan jumlah iterasi optimal untuk mengurangi risiko overfitting.

4.5 Hasil Prediksi

Setiap model digunakan untuk memprediksi nilai respon pada data testing dengan fungsi predict() menggunakan jumlah iterasi optimal masing-masing, lalu hasilnya dibandingkan dengan nilai aktual.

actual <- reg.test$y

pred_list <- lapply(seq_along(boost_list), function(i) {
  as.numeric(predict(boost_list[[i]], newdata = reg.test,
                     n.trees = best_iter[[i]], type = "response"))
})
names(pred_list) <- shrink_lab

hasil_pred <- data.frame(
  Aktual    = actual,
  Pred_0.01 = pred_list[["0.01"]],
  Pred_0.05 = pred_list[["0.05"]],
  Pred_0.10 = pred_list[["0.10"]]
)

kable(head(hasil_pred, 10), digits = 3, align = "c",
      caption = "Tabel 6. Perbandingan Nilai Aktual dan Prediksi (10 Pengamatan Pertama)")
Tabel 6. Perbandingan Nilai Aktual dan Prediksi (10 Pengamatan Pertama)
Aktual Pred_0.01 Pred_0.05 Pred_0.10
10.232 10.323 10.468 10.404
11.845 11.027 11.015 10.823
10.336 11.570 11.917 11.924
16.727 15.473 15.489 15.550
25.077 23.604 23.788 23.897
15.447 16.149 16.165 16.005
15.643 14.876 14.651 14.825
7.111 11.945 11.971 12.169
13.351 16.129 15.782 15.894
12.872 14.458 14.648 14.500

Interpretasi:

Berdasarkan Tabel 6, nilai prediksi dari ketiga model pada umumnya mengikuti nilai aktual, tetapi ketepatannya berbeda pada setiap pengamatan. Pada 10 pengamatan pertama, rata-rata selisih absolut antara nilai aktual dan prediksi adalah 1.554 untuk shrinkage = 0,01, 1.595 untuk shrinkage = 0,05, dan 1.574 untuk shrinkage = 0,10. Selisih terbesar terjadi pada pengamatan ke-8 dengan nilai aktual 7.111, sedangkan prediksi ketiga model berkisar antara 11.945 sampai 12.169. Perbedaan prediksi antar nilai shrinkage pada setiap pengamatan relatif kecil, sehingga perbandingan kinerja yang lebih tepat perlu dilihat dari metrik evaluasi pada seluruh data testing.

4.6 Metrik Evaluasi

Kinerja model dievaluasi dengan MSE, RMSE, MAE, dan R-Square yang dihitung dari nilai aktual dan prediksi pada seluruh data testing.

hitung_metrik <- function(actual, pred) {
  MSE  <- mean((actual - pred)^2)
  RMSE <- sqrt(MSE)
  MAE  <- mean(abs(actual - pred))
  R2   <- 1 - sum((actual - pred)^2) / sum((actual - mean(actual))^2)
  c(MSE = MSE, RMSE = RMSE, MAE = MAE, R2 = R2)
}

metrik    <- t(sapply(pred_list, function(p) hitung_metrik(actual, p)))
metrik_df <- data.frame(Shrinkage = shrink_set,
                        Iterasi   = as.integer(best_iter),
                        metrik, row.names = NULL)

kable(metrik_df, digits = 4, align = "c",
      caption = "Tabel 7. Perbandingan Metrik Evaluasi Gradient Boosting Regression")
Tabel 7. Perbandingan Metrik Evaluasi Gradient Boosting Regression
Shrinkage Iterasi MSE RMSE MAE R2
0.01 2038 4.2550 2.0628 1.5951 0.8225
0.05 458 4.2639 2.0649 1.6008 0.8221
0.10 212 4.0312 2.0078 1.5579 0.8318

Interpretasi:

Berdasarkan Tabel 7, nilai MSE terkecil diperoleh pada shrinkage = 0.10, yaitu 4.0312 dengan RMSE 2.0078 dan MAE 1.5579. Nilai R-Square terbesar sebesar 0.8318 diperoleh pada shrinkage = 0.10, artinya model mampu menjelaskan sekitar 83.18% keragaman nilai respon pada data testing. Keempat metrik menunjukkan model terbaik yang sama, sehingga pemilihan model terbaik konsisten. Selisih MSE antara model terbaik dan terburuk adalah 0.2327 (sekitar 5.8% dari MSE terkecil), sehingga perbedaan nilai learning rate hanya memberikan perbedaan kinerja yang relatif kecil. Sebagai pembanding, galat acak pada data Friedman #1 memiliki varians sekitar 1, sehingga MSE terbaik berada sekitar 4.03 kali di atas batas tersebut. Berdasarkan galat cross-validation pada data training, model terbaik adalah shrinkage = 0.10, yang sama dengan model terbaik pada data testing, sehingga hasil validasi silang konsisten dengan hasil pengujian.

4.7 Plot Nilai Aktual dan Prediksi

Plot dibuat untuk melihat kesesuaian nilai prediksi terhadap nilai aktual pada setiap nilai shrinkage. Garis merah putus-putus menunjukkan kondisi ideal, yaitu nilai prediksi sama dengan nilai aktual.

par(mfrow = c(1, 3))
for (i in seq_along(shrink_lab)) {
  plot(actual, pred_list[[i]], pch = 19, col = "steelblue",
       xlab = "Nilai Aktual", ylab = "Nilai Prediksi",
       main = paste("shrinkage =", shrink_lab[i]))
  abline(a = 0, b = 1, lty = 2, lwd = 2, col = "red")
}

par(mfrow = c(1, 1))

Interpretasi:

Pada ketiga plot, titik-titik menyebar mengikuti garis diagonal, yang menunjukkan bahwa model mampu menangkap pola data Friedman. Korelasi antara nilai aktual dan prediksi adalah 0.9163 untuk shrinkage = 0,01, 0.9168 untuk shrinkage = 0,05, dan 0.9215 untuk shrinkage = 0,10. Pada model terbaik, kemiringan hubungan prediksi terhadap nilai aktual sebesar 0.754, yang berarti prediksi cenderung tertarik ke nilai tengah sehingga nilai aktual yang ekstrem sulit ditangkap sepenuhnya.

4.8 Plot Residual

Plot residual dibuat untuk memeriksa selisih antara nilai aktual dan prediksi terhadap nilai prediksi. Residual yang baik tersebar acak di sekitar nol tanpa pola tertentu.

par(mfrow = c(1, 3))
for (i in seq_along(shrink_lab)) {
  res <- actual - pred_list[[i]]
  plot(pred_list[[i]], res, pch = 19, col = "steelblue",
       xlab = "Nilai Prediksi", ylab = "Residual",
       main = paste("shrinkage =", shrink_lab[i]))
  abline(h = 0, lty = 2, lwd = 2, col = "red")
}

par(mfrow = c(1, 1))

Interpretasi:

Pada model terbaik (shrinkage = 0.10), rata-rata residual sebesar -0.3976 dengan simpangan baku 1.9846. Rata-rata residual yang dekat dengan nol menunjukkan bahwa model tidak cenderung memprediksi terlalu tinggi atau terlalu rendah secara sistematis. Residual terbesar bernilai -5.121, yaitu selisih terjauh antara nilai aktual dan prediksi pada data testing. Sebaran residual pada ketiga plot perlu dicermati secara visual, karena sebaran acak di sekitar garis nol menunjukkan model telah menangkap pola yang ada, sedangkan pola melengkung atau melebar menunjukkan masih ada struktur yang belum tertangkap.

4.9 Variable Importance

Variable importance pada model terbaik dihitung dengan fungsi summary() pada objek gbm menggunakan jumlah iterasi optimal. Nilai relative influence menunjukkan besar kontribusi relatif setiap variabel dalam mengurangi galat model.

imp     <- summary(boost_list[[best_idx]], n.trees = best_iter[[best_idx]],
                   plotit = FALSE)
imp$var <- as.character(imp$var)

kable(imp, digits = 4, row.names = FALSE, align = "c",
      caption = "Tabel 8. Relative Influence Variabel pada Model Terbaik")
Tabel 8. Relative Influence Variabel pada Model Terbaik
var rel.inf
x.4 38.4746
x.1 28.2478
x.2 13.8418
x.3 11.7264
x.5 5.4518
x.6 1.0221
x.7 0.4197
x.10 0.4045
x.9 0.2587
x.8 0.1526
barplot(imp$rel.inf, names.arg = imp$var, las = 2,
        col = "steelblue", ylab = "Relative Influence",
        main = paste("Variable Importance - Gradient Boosting (shrinkage =",
                     best_lab, ")"))

Interpretasi:

Berdasarkan Tabel 8, variabel yang paling berpengaruh adalah x.4 dengan relative influence sebesar 38.47%, diikuti oleh x.1 sebesar 28.25% dan x.2 sebesar 13.84%. Pada data Friedman #1, hanya variabel x.1 sampai x.5 yang benar-benar membentuk respon, sedangkan x.6 sampai x.10 merupakan noise. Jumlah relative influence variabel x.1 sampai x.5 sebesar 97.74%, sedangkan variabel noise hanya 2.26%. Hal ini menunjukkan bahwa Gradient Boosting berhasil membedakan variabel yang informatif dari variabel noise.

5.1 Kesimpulan

Boosting adalah metode ensemble learning yang membangun serangkaian model sederhana (weak learner) secara berurutan, di mana setiap model baru dibangun dengan memperhatikan kesalahan yang masih dilakukan oleh model sebelumnya, sehingga gabungan model membentuk strong learner. Berbeda dengan bagging yang membangun model secara paralel dan independen, boosting bersifat sequential, dan kekuatannya berasal dari gabungan banyak model sederhana yang secara bertahap memperbaiki hasil prediksi. Pada kasus klasifikasi, boosting diperkenalkan melalui AdaBoost yang memberikan bobot lebih besar pada observasi yang salah diklasifikasikan, sedangkan pada kasus regresi diperkenalkan melalui Gradient Boosting yang mempelajari residual yang masih tersisa.

Metode Boosting dapat diimplementasikan menggunakan R melalui tahapan persiapan data, pembentukan model, dan evaluasi hasil prediksi. Pada kasus klasifikasi, algoritma AdaBoost digunakan untuk meningkatkan kemampuan model dalam mengklasifikasikan data dengan memberikan perhatian lebih pada observasi yang salah diklasifikasikan, sedangkan pada kasus regresi, Gradient Boosting digunakan untuk memperbaiki kesalahan prediksi secara bertahap dengan mempelajari residual dari model sebelumnya.

Performa model boosting dievaluasi dengan membandingkan nilai aktual dan nilai hasil prediksi pada data testing menggunakan ukuran evaluasi yang sesuai dengan jenis variabel respon. Pada kasus klasifikasi, evaluasi dilakukan dengan confusion matrix yang berisi true positive, true negative, false positive, dan false negative, kemudian dihitung Accuracy, Precision, Recall, Specificity, dan F1-score. Pada kasus regresi, evaluasi dilakukan dengan menghitung Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (\(R^2\)). Model klasifikasi dikatakan baik apabila nilai accuracy, precision, recall, specificity, dan F1-score tinggi, sedangkan model regresi dikatakan baik apabila nilai MSE, RMSE, dan MAE kecil serta \(R^2\) mendekati 1. Selain itu, evaluasi dapat dilengkapi dengan plot aktual terhadap prediksi, plot residual, perkembangan error, dan variable importance untuk melihat kesesuaian prediksi serta variabel yang paling berpengaruh.

Berdasarkan hasil analisis regresi Gradient Boosting pada data Friedman #1, diperoleh bahwa nilai shrinkage sebesar 0,01, 0,05, dan 0,10 menghasilkan jumlah iterasi optimal masing-masing sebanyak 2038, 458, dan 212. Model dengan shrinkage 0,10 menghasilkan nilai cross-validation MSE terkecil sebesar 3.963, sehingga menjadi model terbaik berdasarkan validasi silang. Selanjutnya, evaluasi menggunakan MSE, RMSE, MAE, dan \(R^2\) pada data testing dilakukan untuk membandingkan kemampuan prediksi ketiga model. Analisis variable importance menunjukkan variabel prediktor yang memberikan kontribusi relatif terbesar dalam membangun model, sedangkan pemeriksaan residual digunakan untuk mengevaluasi pola kesalahan prediksi. Pada data Friedman #1, variabel x.1 hingga x.5 merupakan variabel informatif yang membentuk respons, sedangkan x.6 hingga x.10 merupakan variabel noise. Dengan demikian, metode Gradient Boosting dapat digunakan untuk memodelkan hubungan nonlinier antara prediktor dan respons serta mengidentifikasi kontribusi relatif variabel prediktor. Pemilihan model terbaik perlu mempertimbangkan hasil evaluasi pada data testing, bukan hanya berdasarkan nilai cross-validation MSE atau jumlah iterasi optimal.

5.2 Saran

Pada praktikum Machine Learning berikutnya, disarankan agar praktikan lebih teliti dalam memasukkan dan mengolah data menggunakan RStudio, terutama dalam penggunaan sintaks serta interpretasi Gradient Boosting. Selain itu, pemilihan nilai learning rate, jumlah pohon maksimum, dan kedalaman pohon perlu diperhatikan agar model tidak mengalami underfitting maupun overfitting dan waktu komputasi tetap wajar. Untuk penelitian selanjutnya, perbandingan dapat diperluas dengan mencoba nilai interaction.depth dan bag.fraction yang berbeda serta membandingkan hasilnya dengan metode lain seperti bagging atau random forest.

DAFTAR PUSTAKA

Erkamim, M., Tanniewa, A. M., AP, I., & Nurhayati. (2024). Analisis perbandingan metode AdaBoost, Gradient Boosting, dan XGBoost untuk klasifikasi status gizi pada balita. Building of Informatics, Technology and Science (BITS), 6(3), 1799–1807.

Fransiska, H. (2026). Modul Praktikum Machine Learning. Universitas Bengkulu.

Vincent, & Rachmat, N. (2025). Penerapan algoritma gradient boosting dalam mendiagnosa penyakit kucing dan anjing. Jurnal Buana Informatika, 16(2), 134–143.