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).
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.
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).
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:
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.
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).
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\) |
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).
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.
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 |
gbm
untuk membangun model Gradient Boosting, mlbench
untuk membangkitkan data Friedman, caret untuk membagi
data, dan knitr untuk menampilkan tabel.gbm() dengan nilai shrinkage sebesar 0,01,
0,05, dan 0,10, serta cv.folds = 10.gbm.perf().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
## '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 ...
## 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
## 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.
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
## [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.
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.
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")| 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)
}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.
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)")| 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.
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")| 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.
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")
}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.
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")
}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.
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")| 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.
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.
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.
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.