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\)).
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.
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 |
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.
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.
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).
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).
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.
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.
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 |
gbm
untuk membangun model Gradient Boosting, mlbench
untuk membangkitkan data Friedman, caret untuk membagi
data, dan knitr untuk menampilkan tabel.mlbench.friedman1(), kemudian mengubahnya menjadi
data frame. Pembangkitan data diawali dengan
set.seed(234) agar hasil dapat direproduksi.createDataPartition().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.gbm.perf(method = "cv").predict() dengan jumlah iterasi optimal, lalu
menyusun perbandingan nilai aktual dan nilai prediksi.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")
| 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).
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.
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.
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
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")
| 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.
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)")
| 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.
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")
| 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.
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
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
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.
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")
| 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
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)\).
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.
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.
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.