BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan data yang semakin besar dan kompleks menuntut model prediksi yang tidak hanya akurat, tetapi juga stabil ketika data pelatihan berubah. Model tunggal, seperti pohon keputusan, mudah dibangun dan diinterpretasikan, tetapi kemampuan prediksinya terbatas dan rentan mengalami overfitting. Salah satu pendekatan untuk mengatasi masalah tersebut adalah ensemble learning, yaitu menggabungkan beberapa model dasar (base learner) agar kinerja prediksi lebih baik dan lebih konsisten dibandingkan model tunggal (Mienye & Sun, 2022). Dua pendekatan ensemble berbasis pohon yang banyak digunakan adalah bagging dan boosting. Bagging membentuk banyak model secara paralel dari sampel bootstrap kemudian mengagregasikan hasilnya, sedangkan boosting membentuk model secara berurutan sehingga setiap model baru berusaha memperbaiki kesalahan yang masih dilakukan model sebelumnya (Fransiska, 2026).

Boosting menggabungkan banyak model sederhana yang disebut weak learner, misalnya pohon yang dangkal, menjadi satu model akhir yang lebih kuat atau strong learner (James dkk., 2021). Pada kasus klasifikasi, Adaptive Boosting (AdaBoost) memberikan perhatian lebih besar pada observasi yang salah diklasifikasikan. Metode ini telah digunakan pada klasifikasi Indeks Pembangunan Manusia (IPM) kabupaten/kota di Indonesia (Arumnisaa & Wijayanto, 2023) dan dibandingkan kinerjanya dengan bagging pada data multi-class (Lukas dkk., 2022). Pada kasus regresi, Gradient Boosting melatih learner baru untuk mempelajari residual yang masih tersisa, dan telah diterapkan, misalnya, pada prediksi harga rumah dengan evaluasi cross-validation berbasis RMSE (Fitri, 2023). Kinerja boosting dipengaruhi oleh jumlah iterasi, learning rate, dan kedalaman pohon sehingga parameter tersebut perlu dipilih dengan hati-hati (Fransiska, 2026).

Berdasarkan hal tersebut, praktikum ini dilakukan untuk memahami konsep dasar dan prinsip kerja boosting, mengimplementasikannya menggunakan perangkat lunak R, serta mengevaluasi kinerjanya. Sesuai soal untuk NPM ganjil, analisis dilakukan menggunakan Gradient Boosting pada kasus regresi dengan data Friedman. Nilai learning rate (shrinkage) sebesar 0.01, 0.05, dan 0.10 dibandingkan, jumlah iterasi optimal pada masing-masing model ditentukan melalui cross-validation, dan kinerja model diukur menggunakan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (\(R^2\)).

1.2 Rumusan Masalah

  1. Apa yang kamu ketahui mengenai 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 menggunakan soal untuk NPM ganjil (NPM 25), yakni 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 (Mienye & Sun, 2022). Boosting adalah metode ensemble yang membentuk serangkaian model sederhana secara berurutan (sequential). Model berikutnya dibangun dengan memperhatikan kesalahan yang masih dilakukan oleh model sebelumnya, sehingga kekuatan boosting tidak berasal dari satu model yang sangat kompleks, melainkan dari gabungan banyak model sederhana yang secara bertahap memperbaiki hasil prediksi (James dkk., 2021).

Model-model sederhana pada setiap tahap disebut weak learner, yaitu model dengan kemampuan prediksi terbatas apabila digunakan sendiri. Setelah sejumlah weak learner digabungkan, diperoleh model akhir yang lebih kuat, yang disebut strong learner. Pada boosting berbasis pohon, pohon keputusan dengan kedalaman yang dibatasi sering digunakan sebagai base learner sehingga setiap pohon tetap sederhana. Perbedaan bagging dan boosting dirangkum pada Tabel 1 (Fransiska, 2026).

Tabel 1. Perbedaan Bagging dan Boosting

Aspek Bagging Boosting
Cara membangun model Paralel/relatif independen Sequential; learner berikutnya bergantung pada hasil sebelumnya
Data tiap learner Umumnya sampel bootstrap Data, bobot, atau target dapat disesuaikan berdasarkan kesalahan sebelumnya
Fokus utama Mengurangi variance melalui agregasi Memperbaiki kesalahan secara bertahap
Kontribusi learner Umumnya setara pada bagging dasar Dapat berbeda; misalnya pada AdaBoost melalui \(\alpha_m\)
Base learner Sering menggunakan pohon yang relatif besar Umumnya menggunakan 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 algoritma boosting yang banyak digunakan untuk kasus klasifikasi. Prinsip utamanya adalah memberikan perhatian lebih besar pada observasi yang masih salah diklasifikasikan (Fransiska, 2026). Untuk klasifikasi biner, misalkan tersedia data latih \((x_i, y_i),\ i = 1, 2, \dots, n\). Proses AdaBoost dilakukan sebagai berikut.

Memberikan bobot awal yang sama pada semua observasi.

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

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

dengan \(I\{\cdot\}\) adalah fungsi indikator yang bernilai 1 apabila observasi ke-\(i\) salah diklasifikasikan dan 0 apabila diklasifikasikan dengan benar.

Memperbarui bobot observasi. Observasi yang salah diklasifikasikan memperoleh bobot yang lebih besar sehingga learner berikutnya memberikan perhatian lebih besar pada observasi tersebut (James dkk., 2021).

\[ w_i^{(m+1)} = w_i^{(m)} \exp\left(\alpha_m \, I\{y_i \neq G_m(x_i)\}\right) \]

Menggabungkan learner. Setiap learner diberi bobot berdasarkan performanya, kemudian prediksi akhir diperoleh melalui weighted voting.

\[ \alpha_m = \log\left(\frac{1 - err_m}{err_m}\right), \qquad G(x) = \text{sign}\left[\sum_{m=1}^{M} \alpha_m G_m(x)\right] \]

dengan \(M\) adalah jumlah seluruh weak learner. Dengan demikian, pada AdaBoost terdapat dua jenis bobot, yaitu bobot observasi yang mengatur perhatian terhadap data latih dan bobot learner yang mengatur kontribusi setiap learner terhadap prediksi akhir.

2.3 Gradient Boosting

Pada kasus regresi, kesalahan model dapat dilihat melalui residual, yaitu selisih antara nilai aktual dan nilai hasil prediksi (Fransiska, 2026).

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

Residual menunjukkan bagian dari respon yang masih belum dapat diprediksi dengan baik oleh model. Gradient Boosting membangun weak learner berikutnya untuk mempelajari bagian kesalahan tersebut (James dkk., 2021). Proses Gradient Boosting secara sederhana dilakukan sebagai berikut.

  1. Membentuk model awal \(f_0(x)\), yaitu rata-rata nilai respon pada fungsi loss kuadrat.
  2. Menghitung residual dari model tersebut.
  3. Membentuk weak learner baru \(h_m(x)\) untuk mempelajari residual.
  4. Menambahkan kontribusi learner baru ke model sebelumnya.
  5. Menghitung residual baru dan mengulangi proses sampai iterasi ke-\(M\).

Model kemudian diperbarui secara bertahap menurut persamaan berikut.

\[ 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 learning rate mengatur seberapa besar kontribusi learner baru terhadap model. Nilai yang lebih kecil membuat proses pembelajaran berlangsung lebih perlahan dan biasanya membutuhkan lebih banyak iterasi (James dkk., 2021).

2.4 Boosting untuk Klasifikasi dan Regresi serta Parameter Pentingnya

Jika AdaBoost memperbaiki klasifikasi dengan memberikan perhatian lebih besar pada observasi yang sulit, maka pada Gradient Boosting regresi learner berikutnya diarahkan untuk mempelajari residual yang masih tersisa. Perbedaan keduanya dirangkum pada Tabel 2, sedangkan parameter penting dalam boosting dirangkum pada Tabel 3 (Fransiska, 2026).

Tabel 2. Perbedaan Klasifikasi dan Regresi pada Boosting

Aspek Klasifikasi Regresi
Metode AdaBoost Gradient Boosting
Respon 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\)

Tabel 3. Parameter Penting dalam Boosting

Parameter Peran
Jumlah iterasi/jumlah learner Menentukan berapa banyak learner yang ditambahkan
Learning rate \(\nu\) Mengatur besar kontribusi setiap learner baru
Kedalaman pohon Mengatur kompleksitas setiap weak learner

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

2.5 Evaluasi Kinerja Model Regresi

Evaluasi kinerja model dilakukan untuk mengetahui seberapa dekat nilai prediksi dengan nilai aktual. Pada Gradient Boosting regresi, ukuran evaluasi yang umum digunakan adalah Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (\(R^2\)) (James dkk., 2021).

MSE adalah rata-rata dari kuadrat selisih antara nilai aktual dan nilai prediksi. Karena selisih dikuadratkan, kesalahan yang besar memberikan pengaruh yang lebih besar terhadap nilai MSE. Semakin kecil nilai MSE, semakin baik model.

\[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]

RMSE adalah akar kuadrat dari MSE. Ukuran ini memiliki satuan yang sama dengan variabel respon sehingga lebih mudah diinterpretasikan, tetapi tetap sensitif terhadap pencilan.

\[ RMSE = \sqrt{MSE} \]

MAE adalah rata-rata dari nilai absolut selisih antara nilai aktual dan nilai prediksi. Ukuran ini memberikan bobot yang sama pada setiap kesalahan sehingga tidak terlalu dipengaruhi oleh pencilan dibandingkan RMSE.

\[ MAE = \frac{1}{n} \sum_{i=1}^{n} \left| y_i - \hat{y}_i \right| \]

Koefisien determinasi menunjukkan proporsi keragaman nilai aktual yang dapat dijelaskan oleh model. Nilai \(R^2\) yang mendekati 1 menunjukkan bahwa model mampu menjelaskan sebagian besar keragaman data.

\[ R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} \]

dengan \(y_i\) adalah nilai aktual, \(\hat{y}_i\) nilai prediksi, dan \(\bar{y}\) rata-rata nilai aktual. Nilai MSE, RMSE, dan MAE yang semakin kecil serta \(R^2\) yang mendekati 1 menunjukkan model yang semakin baik.

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. 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 dengan learning rate (shrinkage) 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

Tabel 5. Parameter Model Gradient Boosting

Parameter Nilai Keterangan
distribution “gaussian” Fungsi loss kuadrat untuk respon numerik
n.trees 1000 Jumlah maksimum pohon (iterasi)
interaction.depth 2 Kedalaman maksimum setiap pohon (weak learner)
shrinkage 0.01, 0.05, 0.10 Learning rate (\(\nu\)) yang dibandingkan
bag.fraction 1 Seluruh data training digunakan pada tiap iterasi
cv.folds 10 Jumlah lipatan cross-validation
n.minobsinnode 5 Jumlah minimum observasi pada simpul akhir

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 sebanyak 200 pengamatan menggunakan fungsi mlbench.friedman1(), kemudian mengubahnya menjadi data frame. Pembangkitan data diawali dengan set.seed(234) agar hasil dapat direproduksi.
  3. Membagi data menjadi data training (70%) dan data testing (30%) menggunakan fungsi createDataPartition().
  4. Membangun model Gradient Boosting menggunakan fungsi gbm() dengan variabel respon \(y\) dan seluruh variabel prediktor (\(x\).1 sampai \(x\).10) pada shrinkage 0.01, 0.05, dan 0.10, dengan cv.folds = 10.
  5. Menentukan jumlah iterasi optimal pada masing-masing model menggunakan gbm.perf(method = "cv").
  6. Memprediksi nilai respon pada data testing menggunakan fungsi predict() dengan jumlah iterasi optimal, lalu menyusun perbandingan nilai aktual dan nilai prediksi.
  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 dan prediksi, plot residual, serta variable importance untuk melihat kesesuaian hasil prediksi dan variabel yang paling berpengaruh.
  10. 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 training dan testing, 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))

# Jumlah observasi dan variabel
dim(reg.data)
## [1] 200  11
# Struktur data
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 ...
# Ringkasan data
summary(reg.data)
##       x.1                x.2                x.3               x.4         
##  Min.   :0.001198   Min.   :0.004583   Min.   :0.01021   Min.   :0.00707  
##  1st Qu.:0.274097   1st Qu.:0.255644   1st Qu.:0.24506   1st Qu.:0.20772  
##  Median :0.541847   Median :0.436813   Median :0.48965   Median :0.50295  
##  Mean   :0.509759   Mean   :0.465323   Mean   :0.48570   Mean   :0.48821  
##  3rd Qu.:0.741416   3rd Qu.:0.651439   3rd Qu.:0.73476   3rd Qu.:0.76599  
##  Max.   :0.993590   Max.   :0.999850   Max.   :0.99985   Max.   :0.99761  
##       x.5                x.6                x.7                x.8          
##  Min.   :0.008246   Min.   :0.005504   Min.   :0.001884   Min.   :0.002496  
##  1st Qu.:0.267523   1st Qu.:0.194431   1st Qu.:0.226788   1st Qu.:0.249826  
##  Median :0.522081   Median :0.446060   Median :0.491332   Median :0.480306  
##  Mean   :0.503282   Mean   :0.468544   Mean   :0.503754   Mean   :0.482050  
##  3rd Qu.:0.751688   3rd Qu.:0.746035   3rd Qu.:0.780325   3rd Qu.:0.696675  
##  Max.   :0.994604   Max.   :0.999021   Max.   :0.993044   Max.   :0.995613  
##       x.9                x.10                y         
##  Min.   :0.004483   Min.   :0.005544   Min.   : 3.082  
##  1st Qu.:0.203254   1st Qu.:0.329160   1st Qu.:10.593  
##  Median :0.453476   Median :0.592614   Median :13.810  
##  Mean   :0.471873   Mean   :0.540708   Mean   :14.270  
##  3rd Qu.:0.742412   3rd Qu.:0.765353   3rd Qu.:18.063  
##  Max.   :0.997436   Max.   :0.998141   Max.   :26.146
kable(head(reg.data, 6), digits = 4, caption = "Tabel 6. Enam Pengamatan Pertama Data Friedman")
Tabel 6. Enam Pengamatan Pertama Data Friedman
x.1 x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10 y
0.7456 0.5755 0.0289 0.7202 0.8748 0.2762 0.9332 0.6075 0.7561 0.7180 24.3495
0.7817 0.3158 0.9375 0.1850 0.7040 0.6427 0.4018 0.0037 0.4046 0.5338 18.0468
0.0200 0.7646 0.7978 0.5339 0.9516 0.9874 0.0874 0.0106 0.2474 0.6670 12.0187
0.7761 0.2290 0.6680 0.5535 0.4781 0.8425 0.8930 0.4464 0.1444 0.6803 12.1019
0.0669 0.1715 0.5974 0.7548 0.5332 0.7328 0.1024 0.8349 0.1874 0.5950 9.9118
0.6448 0.6474 0.0135 0.7895 0.2376 0.4302 0.8824 0.8435 0.6166 0.1082 21.8743

Interpretasi: Data Friedman yang dibangkitkan terdiri dari 200 pengamatan dan 11 variabel, yaitu satu variabel respon (y) dan sepuluh variabel prediktor (x.1 sampai x.10). Seluruh variabel bertipe numerik. Nilai respon y berkisar dari 3.08 sampai 26.15 dengan rata-rata 14.27, sedangkan seluruh prediktor berada pada interval 0 sampai 1 sesuai distribusi seragamnya. Data tidak memiliki nilai hilang sehingga dapat langsung dianalisis (jumlah nilai hilang = 0).

4.2 Pembagian Data Training dan Testing

Data dibagi menjadi data training sebesar 70% untuk membangun model dan data testing sebesar 30% untuk menguji kemampuan prediksi model pada data baru. Pembagian dilakukan dengan fungsi createDataPartition() dan set.seed(234).

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, ]

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

Interpretasi: Data training terdiri dari 140 pengamatan (70%) dan data testing terdiri dari 60 pengamatan (30%). Pembagian ini mendekati proporsi 70:30 yang diminta. Data training digunakan untuk membangun model dan menentukan jumlah iterasi optimal melalui cross-validation, sedangkan data testing hanya digunakan untuk evaluasi akhir sehingga hasil evaluasi tidak bias oleh proses pelatihan.

4.3 Pembentukan Model Gradient Boosting

Model Gradient Boosting dibangun dengan fungsi gbm() menggunakan variabel respon y dan seluruh variabel prediktor. Model dibuat tiga kali dengan learning rate (shrinkage) sebesar 0.01, 0.05, dan 0.10. Argumen cv.folds = 10 digunakan untuk cross-validation 10 lipatan, dan set.seed(234) diulang pada setiap model agar pembagian lipatan sama sehingga perbandingannya adil.

shrink_set <- c(0.01, 0.05, 0.10)
boost_list <- list()

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

for (nm in names(boost_list)) {
  cat("shrinkage =", nm, "\n")
  print(boost_list[[nm]])
  cat("\n")
}
## shrinkage = 0.01 
## gbm(formula = y ~ ., distribution = "gaussian", data = reg.train, 
##     n.trees = 1000, interaction.depth = 2, n.minobsinnode = 5, 
##     shrinkage = v, bag.fraction = 1, cv.folds = 10, verbose = FALSE)
## A gradient boosted model with gaussian loss function.
## 1000 iterations were performed.
## The best cross-validation iteration was 999.
## There were 10 predictors of which 9 had non-zero influence.
## 
## shrinkage = 0.05 
## gbm(formula = y ~ ., distribution = "gaussian", data = reg.train, 
##     n.trees = 1000, interaction.depth = 2, n.minobsinnode = 5, 
##     shrinkage = v, bag.fraction = 1, cv.folds = 10, verbose = FALSE)
## A gradient boosted model with gaussian loss function.
## 1000 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 = 1000, interaction.depth = 2, n.minobsinnode = 5, 
##     shrinkage = v, bag.fraction = 1, cv.folds = 10, verbose = FALSE)
## A gradient boosted model with gaussian loss function.
## 1000 iterations were performed.
## The best cross-validation iteration was 212.
## There were 10 predictors of which 10 had non-zero influence.

Interpretasi: Ketiga model berhasil dibentuk dengan fungsi loss gaussian dan 1000 iterasi maksimum. Setiap iterasi menambahkan satu pohon regresi dengan kedalaman maksimum 2 (weak learner) yang mempelajari residual dari model sebelumnya, dan kontribusinya diskalakan oleh nilai shrinkage. Keluaran masing-masing model juga memuat iterasi terbaik menurut cross-validation serta banyaknya prediktor yang memiliki pengaruh tidak nol.

4.4 Penentuan Jumlah Iterasi Optimal

Jumlah iterasi optimal ditentukan dengan fungsi gbm.perf(method = "cv"), yaitu jumlah pohon yang menghasilkan galat cross-validation terkecil. Pemilihan ini penting karena jumlah iterasi yang terlalu sedikit menyebabkan underfitting, sedangkan jumlah iterasi yang terlalu banyak berpotensi menyebabkan overfitting.

best_iter <- integer(0)

par(mfrow = c(1, 3))
for (nm in names(boost_list)) {
  best_iter[nm] <- gbm.perf(boost_list[[nm]], method = "cv", plot.it = TRUE)
  title(main = paste("shrinkage =", nm))
}
Gambar 1. Galat Training dan Cross-Validation terhadap Jumlah Iterasi

Gambar 1. Galat Training dan Cross-Validation terhadap Jumlah Iterasi

par(mfrow = c(1, 1))
tab_iter <- data.frame(
  Shrinkage       = names(boost_list),
  Iterasi_Optimal = unname(best_iter[names(boost_list)]),
  MSE_CV          = sapply(boost_list, function(m) min(m$cv.error)),
  row.names       = NULL
)
kable(tab_iter, digits = 4, align = "c",
      caption = "Tabel 7. Jumlah Iterasi Optimal dan Galat Cross-Validation Minimum")
Tabel 7. Jumlah Iterasi Optimal dan Galat Cross-Validation Minimum
Shrinkage Iterasi_Optimal MSE_CV
0.01 999 4.3015
0.05 458 4.0046
0.10 212 3.9630

Interpretasi: Berdasarkan Gambar 1 dan Tabel 7, jumlah iterasi optimal untuk shrinkage 0.01, 0.05, dan 0.10 berturut-turut adalah 999, 458, dan 212 iterasi, dengan galat cross-validation minimum (MSE CV) berturut-turut sebesar 4.3015, 4.0046, dan 3.9630. Pola ini sesuai dengan teori: semakin kecil learning rate, semakin kecil kontribusi setiap pohon sehingga model memerlukan lebih banyak iterasi untuk mencapai galat validasi silang yang minimum. Pada grafik, galat training (garis hitam) terus menurun seiring bertambahnya iterasi, sedangkan galat cross-validation (garis hijau) menurun lalu mendatar atau naik kembali. Garis putus-putus biru menandai iterasi optimal, yaitu titik ketika model paling baik memprediksi data yang tidak ikut dilatih. Jumlah iterasi optimal pada shrinkage 0.01 berada di dekat batas maksimum n.trees = 1000, sehingga model tersebut kemungkinan belum sepenuhnya konvergen dan dapat diberi jumlah pohon yang lebih besar.

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 <- list()

for (nm in names(boost_list)) {
  pred_list[[nm]] <- as.numeric(predict(boost_list[[nm]], newdata = reg.test,
                                        n.trees = best_iter[nm], type = "response"))
}

hasil_pred <- data.frame(
  Aktual = actual,
  setNames(as.data.frame(pred_list), paste0("Pred_", names(pred_list)))
)
kable(head(hasil_pred, 10), digits = 4, align = "c",
      caption = "Tabel 8. Perbandingan Nilai Aktual dan Prediksi (10 Pengamatan Pertama Data Testing)")
Tabel 8. Perbandingan Nilai Aktual dan Prediksi (10 Pengamatan Pertama Data Testing)
Aktual Pred_0.01 Pred_0.05 Pred_0.10
10.2323 11.0178 10.4685 10.4041
11.8453 11.2609 11.0154 10.8232
10.3357 11.6582 11.9167 11.9238
16.7273 15.0943 15.4890 15.5498
25.0771 22.6785 23.7882 23.8965
15.4469 15.7269 16.1648 16.0047
15.6429 14.7249 14.6507 14.8254
7.1108 11.7897 11.9708 12.1690
13.3513 16.1325 15.7817 15.8943
12.8720 14.7686 14.6484 14.4998

Interpretasi: Tabel 8 menampilkan nilai aktual dan prediksi dari ketiga model untuk 10 pengamatan pertama data testing. Nilai prediksi mengikuti besaran nilai aktual, tetapi tidak sama persis karena data Friedman memuat galat acak yang tidak dapat dijelaskan oleh model. Rata-rata selisih absolut prediksi antara model shrinkage 0.01 dan 0.10 pada seluruh data testing sebesar 0.3364, sehingga perbedaan prediksi antar nilai shrinkage relatif kecil. Perbandingan kinerja yang lebih tepat perlu dilihat dari metrik evaluasi pada subbab berikutnya.

4.6 Metrik Evaluasi

Kinerja model dievaluasi dengan MSE, RMSE, MAE, dan \(R^2\) yang dihitung dari nilai aktual dan prediksi pada data testing, ditambah galat cross-validation (MSE CV) dari data training sebagai pembanding.

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, R_Square = R2)
}

metrik <- t(sapply(pred_list, function(p) hitung_metrik(actual, p)))

metrik_df <- data.frame(
  Shrinkage       = names(pred_list),
  Iterasi_Optimal = unname(best_iter[names(pred_list)]),
  metrik,
  MSE_CV          = tab_iter$MSE_CV,
  row.names       = NULL
)
kable(metrik_df, digits = 4, align = "c",
      caption = "Tabel 9. Metrik Evaluasi Model Gradient Boosting pada Data Testing")
Tabel 9. Metrik Evaluasi Model Gradient Boosting pada Data Testing
Shrinkage Iterasi_Optimal MSE RMSE MAE R_Square MSE_CV
0.01 999 4.4962 2.1204 1.6464 0.8124 4.3015
0.05 458 4.2639 2.0649 1.6008 0.8221 4.0046
0.10 212 4.0312 2.0078 1.5579 0.8318 3.9630

Interpretasi: Berdasarkan Tabel 9, model dengan kinerja terbaik pada data testing adalah model dengan shrinkage 0.10 pada 212 iterasi, dengan MSE sebesar 4.0312, RMSE sebesar 2.0078, MAE sebesar 1.5579, dan \(R^2\) sebesar 0.8318. Artinya model mampu menjelaskan sekitar 83.18% keragaman nilai respon pada data testing, dan rata-rata prediksi menyimpang sekitar 1.5579 satuan dari nilai aktual. Urutan model dari yang terbaik ke yang terburuk berdasarkan RMSE adalah shrinkage 0.10, 0.05, 0.01, dengan selisih RMSE antara model terbaik dan terburuk sebesar 0.1126. Keempat metrik (MSE, RMSE, MAE, dan \(R^2\)) memilih model yang sama, yaitu shrinkage 0.10, sehingga kesimpulan ini konsisten.

Sebagai pembanding, galat acak pada data Friedman #1 berdistribusi normal baku (simpangan baku = 1), sehingga RMSE yang dicapai model tidak mungkin turun jauh di bawah 1. RMSE model terbaik sebesar 2.0078 atau sekitar 2.01 kali simpangan baku galat acak tersebut, yang menunjukkan bahwa masih terdapat ruang perbaikan dibandingkan batas kinerja teoretis. Model shrinkage 0.10 juga memiliki galat cross-validation terkecil, sehingga hasil pada data testing sejalan dengan hasil pada data training. Selain itu, perlu diperhatikan bahwa metrik pada data testing dihitung dari sampel yang relatif kecil sehingga perbedaan antar model yang sangat tipis sebaiknya tidak ditafsirkan terlalu jauh.

4.7 Plot Nilai Aktual vs Prediksi dan Plot Residual

Plot nilai aktual terhadap prediksi dibuat untuk melihat kesesuaian hasil prediksi, di mana titik yang berada dekat garis diagonal putus-putus menunjukkan prediksi yang mendekati nilai aktual. Plot residual dibuat untuk memeriksa apakah kesalahan prediksi menyebar acak di sekitar nol.

par(mfrow = c(1, 3))
for (nm in names(pred_list)) {
  plot(actual, pred_list[[nm]], pch = 19, col = "steelblue",
       xlab = "Nilai Aktual", ylab = "Nilai Prediksi",
       main = paste("Aktual vs Prediksi, shrinkage =", nm))
  abline(a = 0, b = 1, lty = 2, lwd = 2, col = "red")
}
Gambar 2. Nilai Aktual vs Prediksi pada Data Testing

Gambar 2. Nilai Aktual vs Prediksi pada Data Testing

par(mfrow = c(1, 1))
par(mfrow = c(1, 3))
for (nm in names(pred_list)) {
  res <- actual - pred_list[[nm]]
  plot(pred_list[[nm]], res, pch = 19, col = "steelblue",
       xlab = "Nilai Prediksi", ylab = "Residual",
       main = paste("Residual, shrinkage =", nm))
  abline(h = 0, lty = 2, lwd = 2, col = "red")
}
Gambar 3. Plot Residual pada Data Testing

Gambar 3. Plot Residual pada Data Testing

par(mfrow = c(1, 1))

Interpretasi: Pada Gambar 2, titik-titik untuk model terbaik (shrinkage 0.10) berada sangat dekat dengan garis diagonal, dengan korelasi antara nilai aktual dan prediksi sebesar 0.9215. Perbedaan sebaran titik antar ketiga nilai shrinkage relatif kecil sejalan dengan selisih metrik evaluasi pada Tabel 9. Pada Gambar 3, rata-rata residual model terbaik sebesar -0.3976 dan simpangan baku residual sebesar 1.9846. Residual masih menunjukkan kecenderungan terhadap nilai prediksi, yang mengindikasikan adanya kesalahan sistematis yang belum sepenuhnya ditangkap model. Prediksi pada nilai aktual yang ekstrem cenderung kurang tepat karena boosting membangun model secara bertahap dengan learning rate kecil sehingga prediksi cenderung tertarik ke nilai tengah.

4.8 Variable Importance

Variable importance pada Gradient Boosting diukur dengan relative influence, yaitu besarnya penurunan galat yang disumbangkan setiap variabel pada pemisahan pohon yang dirata-ratakan pada seluruh iterasi dan dinormalkan menjadi total 100. Pada bagian ini dihitung untuk model terbaik dengan jumlah iterasi optimalnya.

imp <- summary(boost_list[[best_nm]], n.trees = best_iter[best_nm], plotit = FALSE)
kable(imp, digits = 4, row.names = FALSE, align = "c",
      caption = "Tabel 10. Relative Influence Variabel pada Model Terbaik")
Tabel 10. 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 = as.character(imp$var), las = 2,
        col = "lightblue", main = "Variable Importance - Gradient Boosting",
        ylab = "Relative Influence")
Gambar 4. Variable Importance Model Terbaik

Gambar 4. Variable Importance Model Terbaik

Interpretasi: Berdasarkan Tabel 10 dan Gambar 4, variabel dengan pengaruh terbesar secara berurutan adalah x.4, x.1, x.2, dan dua variabel teratas (x.4 dan x.1) menyumbang 66.72% dari total pengaruh. Lima variabel dengan pengaruh terbesar tepat sama dengan lima prediktor yang memang membentuk fungsi Friedman (x.1 sampai x.5), sehingga model berhasil membedakan prediktor informatif dari variabel noise. Total pengaruh lima variabel noise (x.6 sampai x.10) hanya sebesar 2.26%, yang menunjukkan bahwa variabel yang sebenarnya tidak memengaruhi respon hanya mendapat porsi kecil dalam model. Hasil ini sejalan dengan bentuk fungsi pembangkit data Friedman, di mana \(x_4\) memiliki koefisien linear terbesar sedangkan \(x_1\) dan \(x_2\) berperan melalui interaksi \(\sin(\pi x_1 x_2)\).

BAB V Kesimpulan dan Saran

5.1 Kesimpulan

Boosting adalah 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 sehingga gabungan model membentuk strong learner. Berbeda dengan bagging yang membangun model secara paralel dan independen untuk menurunkan variance, boosting memperbaiki kesalahan secara bertahap dan lebih sulit diparalelkan. Untuk klasifikasi, AdaBoost memberikan bobot lebih besar pada observasi yang salah diklasifikasikan dan menggabungkan learner melalui weighted voting dengan bobot \(\alpha_m\). Untuk regresi, Gradient Boosting melatih learner baru untuk mempelajari residual dan memperbarui model menurut \(f_m(x) = f_{m-1}(x) + \nu h_m(x)\) dengan \(\nu\) sebagai learning rate.

Metode Gradient Boosting dapat diimplementasikan di R menggunakan fungsi gbm() dari package gbm. Langkahnya diawali dengan membangkitkan data Friedman #1 sebanyak 200 pengamatan menggunakan mlbench.friedman1() dengan set.seed(234), membagi data menjadi training 70% dan testing 30%, lalu membangun model dengan pada shrinkage 0.01, 0.05, dan 0.10. Jumlah iterasi optimal ditentukan dengan gbm.perf(method = "cv"), kemudian nilai respon diprediksi menggunakan predict() dengan iterasi optimal tersebut.

Performa Gradient Boosting dievaluasi dengan membandingkan nilai aktual dan prediksi menggunakan MSE, RMSE, MAE, dan \(R^2\). Model dikatakan baik apabila nilai MSE, RMSE, dan MAE kecil serta nilai \(R^2\) mendekati 1. Berdasarkan hasil analisis pada data Friedman, jumlah iterasi optimal untuk shrinkage 0.01, 0.05, dan 0.10 berturut-turut adalah 999, 458, dan 212 iterasi. Model terbaik pada data testing adalah shrinkage 0.10 dengan MSE 4.0312, RMSE 2.0078, MAE 1.5579, dan \(R^2\) 0.8318. Perbedaan kinerja antar nilai shrinkage relatif kecil, sedangkan prediktor informatif (x.1 sampai x.5) memperoleh relative influence yang jauh lebih besar dibandingkan variabel noise (x.6 sampai x.10).

Perbandingan learning rate dan iterasi optimal. Jumlah iterasi optimal hasil cross-validation untuk shrinkage 0.01, 0.05, dan 0.10 berturut-turut adalah 999, 458, dan 212 iterasi. Perbandingan performa. RMSE pada data testing untuk shrinkage 0.01, 0.05, dan 0.10 berturut-turut adalah 2.1204, 2.0649, dan 2.0078, sedangkan \(R^2\) berturut-turut adalah 0.8124, 0.8221, dan 0.8318 (lengkap dengan MSE dan MAE pada Tabel 9). Model terbaik. Model terbaik adalah shrinkage 0.10 dengan 212 iterasi, yang mampu menjelaskan sekitar 83.18% keragaman respon pada data testing. Perbedaan kinerja antar ketiga nilai shrinkage relatif kecil (selisih RMSE 0.1126), sedangkan perbedaan yang lebih jelas terdapat pada jumlah iterasi yang dibutuhkan, sehingga pemilihan learning rate terutama menentukan efisiensi komputasi dan kestabilan proses pembelajaran. Model juga berhasil menempatkan prediktor informatif sebagai variabel yang paling berpengaruh.

5.2 Saran

Penelitian selanjutnya dapat menambah jumlah pohon (n.trees) terutama pada shrinkage yang kecil agar proses pembelajaran mencapai konvergensi. Perbandingan dengan metode lain, seperti bagging dan random forest, serta penerapan pada data nyata dapat dilakukan untuk menguji kekonsistenan hasil. Karena data testing berukuran kecil, evaluasi dapat diperkuat dengan pengulangan pembagian data atau repeated cross-validation.

DAFTAR PUSTAKA

Arumnisaa, R. I., & Wijayanto, A. W. (2023). Comparison of ensemble learning method: Random forest, support vector machine, AdaBoost for classification Human Development Index (HDI). SISTEMASI: Jurnal Sistem Informasi, 12(1), 206–218.

Fitri, E. (2023). Analisis perbandingan metode regresi linier, random forest regression dan gradient boosted trees regression method untuk prediksi harga rumah. Journal of Applied Computer Science and Technology, 4(1), 58–64.

Fransiska, H. (2026). Modul praktikum machine learning. Universitas Bengkulu.

James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.

Lukas, S., Vigo, O., Krisnadi, D., & Widjaja, P. (2022). Perbandingan performa bagging dan AdaBoost untuk klasifikasi data multi-class. Journal Information System Development (ISD), 7(2), 66–69.

Mienye, I. D., & Sun, Y. (2022). A survey of ensemble learning: Concepts, algorithms, applications, and prospects. IEEE Access, 10, 99129–99149.