Machine learning berkembang pesat sebagai pendekatan komputasi yang memungkinkan sistem mempelajari pola dari data untuk menghasilkan prediksi. Salah satu pendekatan yang banyak digunakan adalah ensemble learning, yaitu teknik yang menggabungkan beberapa model dasar (weak learners) menjadi satu model prediksi yang lebih kuat. Di antara berbagai metode ensemble, Boosting menjadi salah satu yang paling berpengaruh karena membangun model secara berurutan, di mana setiap model baru diarahkan untuk memperbaiki kesalahan prediksi model sebelumnya.
Berbeda dengan bagging yang membangun model secara paralel, Boosting bersifat sekuensial. Setiap weak learner diberi fokus lebih pada observasi yang masih sulit diprediksi oleh model sebelumnya. Hasilnya, model akhir merupakan kombinasi tertimbang dari seluruh weak learner yang telah dibentuk. Algoritma yang termasuk dalam keluarga Boosting antara lain Adaptive Boosting (AdaBoost), Gradient Boosting, serta implementasinya yang lebih modern seperti XGBoost dan LightGBM.
Metode Boosting dapat diterapkan baik untuk permasalahan klasifikasi maupun regresi. Pada klasifikasi, model menghasilkan prediksi kategori, sedangkan pada regresi model menghasilkan nilai numerik kontinu. Kinerja model Boosting sangat dipengaruhi oleh sejumlah hiperparameter, salah satunya learning rate atau shrinkage. Nilai shrinkage mengatur seberapa besar kontribusi setiap pohon terhadap model akhir. Nilai yang lebih kecil biasanya membutuhkan lebih banyak iterasi, sementara nilai yang lebih besar mempercepat pembelajaran tetapi berisiko overfitting jika tidak dikontrol dengan baik.
Praktikum ini menerapkan regresi Gradient Boosting pada data simulasi Friedman. Data Friedman sering digunakan sebagai benchmark karena responsnya dibentuk melalui hubungan nonlinier antar prediktor dan mengandung sejumlah prediktor yang tidak informatif. Analisis dilakukan dengan membandingkan nilai shrinkage sebesar 0,01, 0,05, dan 0,10. Jumlah iterasi optimal ditentukan melalui cross-validation, kemudian performa prediksi pada data pengujian dibandingkan menggunakan MSE, RMSE, MAE, dan koefisien determinasi (\(R^2\)). Melalui praktikum ini, mahasiswa diharapkan memahami konsep Boosting sebagai metode ensemble, mampu mengimplementasikannya pada kasus regresi menggunakan R, serta mengevaluasi performa model dengan ukuran yang sesuai.
Ensemble learning merupakan pendekatan yang menggabungkan beberapa model pembelajaran untuk menghasilkan prediksi yang lebih akurat dan stabil dibandingkan model tunggal. Dua pendekatan utama dalam ensemble learning adalah bagging dan boosting. Pada bagging, model dibangun secara paralel dari sampel bootstrap yang berbeda, kemudian hasil prediksinya digabungkan (rata-rata untuk regresi atau majority voting untuk klasifikasi). Sebaliknya, boosting membangun model secara berurutan. Setiap model baru difokuskan untuk memperbaiki kesalahan yang masih tersisa dari model sebelumnya.
Prinsip utama boosting adalah mengubah sejumlah weak learner (model yang hanya sedikit lebih baik daripada tebakan acak) menjadi satu strong learner. Proses ini dilakukan secara iteratif: model pertama dilatih pada data, kemudian bobot atau residual observasi yang salah diprediksi ditingkatkan, sehingga model berikutnya lebih memperhatikan kasus-kasus sulit tersebut. Hasil akhir diperoleh melalui kombinasi tertimbang dari seluruh model dasar.
Gradient Boosting merupakan salah satu algoritma boosting yang paling banyak digunakan. Metode ini membangun model secara bertahap dengan mengoptimalkan fungsi kerugian (loss function) melalui pendekatan gradien. Untuk regresi dengan galat kuadrat, model awal biasanya dimulai dari nilai rata-rata respons. Selanjutnya, setiap pohon regresi baru dilatih untuk memprediksi residual (atau gradien negatif dari fungsi kerugian) dari model sebelumnya.
Secara matematis, pembaruan model pada iterasi ke-\(m\) dapat dituliskan sebagai:
\[ F_m(x) = F_{m-1}(x) + \nu \, h_m(x) \]
dengan \(F_m(x)\) adalah model setelah iterasi ke-\(m\), \(h_m(x)\) adalah pohon regresi yang ditambahkan, dan \(\nu\) adalah parameter shrinkage (learning rate). Nilai \(\nu\) yang lebih kecil membuat kontribusi setiap pohon lebih konservatif sehingga biasanya membutuhkan lebih banyak iterasi, tetapi cenderung menghasilkan generalisasi yang lebih baik. Nilai \(\nu\) yang lebih besar mempercepat konvergensi namun meningkatkan risiko overfitting.
Pada praktikum ini digunakan nilai shrinkage 0,01, 0,05, dan
0,10. Jumlah pohon optimal ditentukan melalui five-fold
cross-validation menggunakan fungsi gbm.perf() dengan
metode "cv".
Cross-validation membagi data pelatihan menjadi beberapa lipatan (folds). Model dilatih pada sebagian lipatan dan dievaluasi pada lipatan yang disisakan. Proses diulang hingga setiap lipatan pernah menjadi data validasi. Galat validasi silang yang minimum digunakan untuk memilih jumlah pohon optimal. Pendekatan ini membantu mencegah overfitting dan memberikan estimasi performa yang lebih realistis dibandingkan hanya mengandalkan galat pelatihan.
Performa model regresi dinilai dengan membandingkan nilai aktual dan prediksi pada data yang tidak digunakan dalam pelatihan. Empat ukuran yang digunakan dalam praktikum ini adalah:
Mean Squared Error (MSE) mengukur rata-rata kuadrat selisih antara nilai aktual dan prediksi. Nilai yang lebih kecil menunjukkan kesalahan prediksi yang lebih rendah.
\[ MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 \]
Root Mean Squared Error (RMSE) merupakan akar kuadrat dari MSE dan memiliki satuan yang sama dengan variabel respons.
\[ RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} \]
Mean Absolute Error (MAE) mengukur rata-rata nilai absolut kesalahan prediksi dan tidak memberikan penalti kuadrat pada kesalahan yang besar.
\[ MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| \]
Koefisien determinasi (\(R^2\)) menunjukkan proporsi variasi respons yang dapat dijelaskan oleh model. Nilai yang lebih tinggi umumnya menunjukkan prediksi yang lebih baik. Nilai \(R^2\) dapat bernilai negatif apabila model lebih buruk dibandingkan prediksi sederhana menggunakan rata-rata respons data pengujian.
Pada kasus klasifikasi, ukuran evaluasi yang umum digunakan meliputi accuracy, precision, recall, specificity, dan F1-score, serta kurva ROC-AUC. Pemilihan ukuran evaluasi harus disesuaikan dengan jenis permasalahan (klasifikasi atau regresi) agar interpretasi performa model menjadi tepat.
Data yang digunakan adalah data simulasi Friedman yang dibangkitkan
menggunakan fungsi mlbench.friedman1() dari paket
mlbench. Data ini terdiri atas sepuluh variabel prediktor
(\(X_1,\ldots,X_{10}\)) dan satu
variabel respons numerik (\(Y\)).
Hubungan respons dengan prediktor bersifat nonlinier, sementara sebagian
prediktor merupakan variabel yang tidak informatif. Untuk menjaga
reproduktibilitas, pembangkitan data dan pembagian data menggunakan
set.seed(234) sesuai ketentuan praktikum.
| Variabel | Keterangan |
|---|---|
| \(Y\) | Variabel respons numerik yang akan diprediksi |
| \(X_1,\ldots,X_{10}\) | Sepuluh variabel prediktor pada data Friedman |
| Shrinkage | Nilai learning rate yang dibandingkan, yaitu 0,01, 0,05, dan 0,10 |
| Jumlah iterasi optimal | Jumlah pohon yang menghasilkan galat cross-validation minimum |
Analisis dilakukan melalui tahapan berikut.
set.seed(234).Paket mlbench digunakan untuk membangkitkan data
Friedman, gbm untuk membentuk model Gradient Boosting,
sedangkan dplyr, ggplot2, dan
knitr digunakan untuk pengolahan, visualisasi, dan
penyajian hasil.
# Instal paket jika belum tersedia:
# install.packages(c("mlbench", "gbm", "dplyr", "ggplot2", "knitr"))
library(mlbench)
library(gbm)
library(dplyr)
library(ggplot2)
library(knitr)
# Membangkitkan data simulasi Friedman
# Seed 234 secara khusus digunakan pada tahap pembagian data di Bagian 4.3
data_friedman <- mlbench.friedman1(n = 1000, sd = 1)
data_friedman <- as.data.frame(data_friedman)
head(data_friedman)## x.1 x.2 x.3 x.4 x.5 x.6 x.7
## 1 0.6814489 0.28123997 0.8560535 0.8738499 0.3253449 0.45160437 0.8439274
## 2 0.6710700 0.02096551 0.9708521 0.2217556 0.2819479 0.58064887 0.4205131
## 3 0.9671313 0.08097712 0.6982082 0.7983759 0.3075029 0.06801776 0.9973014
## 4 0.6556266 0.20312123 0.9830655 0.7133206 0.8252735 0.99303940 0.7877038
## 5 0.9148635 0.86891993 0.6770179 0.6559953 0.1465726 0.43170189 0.9876067
## 6 0.1839405 0.85569917 0.7686910 0.2386859 0.7452808 0.55240215 0.9582726
## x.8 x.9 x.10 y
## 1 0.6369737 0.1886580 0.06936287 18.50469
## 2 0.4986873 0.4126221 0.78136727 8.22640
## 3 0.5475967 0.3156039 0.24651048 13.47974
## 4 0.4425534 0.8352415 0.61434554 20.99077
## 5 0.2689368 0.9220587 0.34687390 14.04445
## 6 0.6610116 0.5606682 0.74902370 14.17976
## 'data.frame': 1000 obs. of 11 variables:
## $ x.1 : num 0.681 0.671 0.967 0.656 0.915 ...
## $ x.2 : num 0.281 0.021 0.081 0.203 0.869 ...
## $ x.3 : num 0.856 0.971 0.698 0.983 0.677 ...
## $ x.4 : num 0.874 0.222 0.798 0.713 0.656 ...
## $ x.5 : num 0.325 0.282 0.308 0.825 0.147 ...
## $ x.6 : num 0.452 0.581 0.068 0.993 0.432 ...
## $ x.7 : num 0.844 0.421 0.997 0.788 0.988 ...
## $ x.8 : num 0.637 0.499 0.548 0.443 0.269 ...
## $ x.9 : num 0.189 0.413 0.316 0.835 0.922 ...
## $ x.10: num 0.0694 0.7814 0.2465 0.6143 0.3469 ...
## $ y : num 18.5 8.23 13.48 20.99 14.04 ...
Data terdiri atas y sebagai respons dan x.1
sampai x.10 sebagai prediktor. Selanjutnya, ringkasan
statistik digunakan untuk melihat rentang dan sebaran nilai setiap
variabel.
## x.1 x.2 x.3 x.4
## Min. :0.0009253 Min. :2.659e-05 Min. :0.0011 Min. :0.00125
## 1st Qu.:0.2369676 1st Qu.:2.556e-01 1st Qu.:0.2735 1st Qu.:0.27912
## Median :0.4859573 Median :4.994e-01 Median :0.4932 Median :0.49945
## Mean :0.4917346 Mean :5.043e-01 Mean :0.4991 Mean :0.50358
## 3rd Qu.:0.7431816 3rd Qu.:7.616e-01 3rd Qu.:0.7308 3rd Qu.:0.73229
## Max. :0.9994886 Max. :9.984e-01 Max. :0.9996 Max. :0.99993
## x.5 x.6 x.7 x.8
## Min. :0.001154 Min. :0.0005578 Min. :0.001944 Min. :0.002638
## 1st Qu.:0.246080 1st Qu.:0.2354922 1st Qu.:0.278094 1st Qu.:0.268764
## Median :0.491920 Median :0.4748841 Median :0.489871 Median :0.516323
## Mean :0.499693 Mean :0.4872034 Mean :0.500534 Mean :0.509202
## 3rd Qu.:0.763015 3rd Qu.:0.7338947 3rd Qu.:0.736301 3rd Qu.:0.755412
## Max. :0.997579 Max. :0.9988025 Max. :0.999889 Max. :0.998259
## x.9 x.10 y
## Min. :2.494e-05 Min. :0.00114 Min. : 1.951
## 1st Qu.:2.594e-01 1st Qu.:0.27603 1st Qu.:10.440
## Median :5.346e-01 Median :0.51002 Median :14.337
## Mean :5.081e-01 Mean :0.51180 Mean :14.326
## 3rd Qu.:7.540e-01 3rd Qu.:0.76629 3rd Qu.:18.136
## Max. :9.991e-01 Max. :0.99868 Max. :27.050
Pemeriksaan nilai hilang dilakukan untuk memastikan data dapat digunakan dalam pemodelan.
## x.1 x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10 y
## 0 0 0 0 0 0 0 0 0 0 0
## [1] 0
Pada data simulasi yang dibangkitkan langsung, diharapkan tidak terdapat nilai hilang. Jika pemeriksaan menunjukkan tidak ada nilai hilang, imputasi tidak diperlukan.
Distribusi variabel respons diperiksa melalui histogram, sedangkan hubungan respons dan beberapa prediktor dapat diamati melalui diagram pencar.
ggplot(data_friedman, aes(x = y)) +
geom_histogram(bins = 30, color = "white") +
labs(
title = "Distribusi Variabel Respons Friedman",
x = "Nilai Y",
y = "Frekuensi"
) +
theme_minimal()Gambar 1. Distribusi variabel respons Y
data_friedman %>%
select(y, x.1, x.2, x.3, x.4, x.5) %>%
tidyr::pivot_longer(cols = starts_with("x."),
names_to = "Prediktor",
values_to = "Nilai_X") %>%
ggplot(aes(x = Nilai_X, y = y)) +
geom_point(alpha = 0.45) +
geom_smooth(method = "loess", se = FALSE) +
facet_wrap(~ Prediktor, scales = "free_x") +
labs(
title = "Hubungan Respons dengan Lima Prediktor Pertama",
x = "Nilai prediktor",
y = "Y"
) +
theme_minimal()## `geom_smooth()` using formula = 'y ~ x'
Gambar 2. Hubungan Y dengan X1 sampai X5
Diagram pencar membantu melihat bahwa hubungan respons dengan prediktor tidak harus linier. Pola yang melengkung atau berubah menurut kombinasi prediktor merupakan salah satu alasan penggunaan metode berbasis pohon seperti Gradient Boosting.
Data dibagi menjadi 80% data latih dan 20% data uji. Data latih
digunakan untuk membangun model, sedangkan data uji digunakan untuk
mengevaluasi kemampuan prediksi pada observasi yang tidak digunakan
dalam pelatihan. Sesuai ketentuan praktikum, pembagian dilakukan
menggunakan set.seed(234).
set.seed(234) # Seed sesuai instruksi untuk reproduksibilitas pembagian data
n <- nrow(data_friedman)
id_train <- sample(seq_len(n), size = floor(0.80 * n))
data_train <- data_friedman[id_train, ]
data_test <- data_friedman[-id_train, ]
cat("Jumlah data keseluruhan:", nrow(data_friedman), "\n")## Jumlah data keseluruhan: 1000
## Jumlah data latih: 800
## Jumlah data uji: 200
Tiga model dibentuk menggunakan nilai shrinkage 0,01, 0,05,
dan 0,10. Parameter n.trees = 5000 menetapkan batas
maksimum jumlah pohon yang dievaluasi, sedangkan
cv.folds = 5 menjalankan five-fold
cross-validation. Kedalaman interaksi ditetapkan sebesar 2 agar
setiap pohon dapat menangkap interaksi yang terbatas antarvariabel.
Fungsi gbm.perf() kemudian digunakan untuk memperoleh
jumlah pohon optimal berdasarkan hasil cross-validation.
shrinkage_values <- c(0.01, 0.05, 0.10)
model_list <- vector("list", length(shrinkage_values))
names(model_list) <- as.character(shrinkage_values)
for (i in seq_along(shrinkage_values)) {
# Menyamakan seed agar proses cross-validation dapat direproduksi
set.seed(234)
model_list[[i]] <- gbm(
formula = y ~ .,
data = data_train,
distribution = "gaussian",
n.trees = 5000,
interaction.depth = 2,
shrinkage = shrinkage_values[i],
n.minobsinnode = 10,
cv.folds = 5,
train.fraction = 1.0,
keep.data = TRUE,
verbose = FALSE
)
}
# Menentukan jumlah pohon optimal dari cross-validation
best_trees <- sapply(model_list, function(model) {
gbm.perf(model, method = "cv", plot.it = FALSE)
})
hasil_iterasi <- data.frame(
Shrinkage = shrinkage_values,
Iterasi_Optimal = as.integer(best_trees)
)
kable(hasil_iterasi, digits = 0,
caption = "Jumlah Iterasi Optimal Berdasarkan Cross-Validation")| Shrinkage | Iterasi_Optimal |
|---|---|
| 0 | 4992 |
| 0 | 2315 |
| 0 | 1370 |
Jumlah iterasi optimal dapat berbeda untuk setiap nilai shrinkage. Nilai shrinkage yang lebih kecil sering kali membutuhkan lebih banyak pohon karena kontribusi setiap pohon terhadap model akhir lebih kecil. Namun, jumlah iterasi terbaik tetap ditentukan oleh hasil cross-validation, bukan hanya oleh besar-kecilnya shrinkage.
Setelah jumlah iterasi optimal diperoleh, prediksi dilakukan pada data uji. Evaluasi menggunakan MSE, RMSE, MAE, dan \(R^2\). Seluruh metrik dihitung pada observasi uji yang sama agar perbandingan antarmodel adil.
hitung_metrik <- function(aktual, prediksi) {
mse <- mean((aktual - prediksi)^2)
rmse <- sqrt(mse)
mae <- mean(abs(aktual - prediksi))
r2 <- 1 - sum((aktual - prediksi)^2) /
sum((aktual - mean(aktual))^2)
data.frame(
MSE = mse,
RMSE = rmse,
MAE = mae,
R2 = r2
)
}
prediksi_list <- vector("list", length(model_list))
names(prediksi_list) <- names(model_list)
metrik_list <- vector("list", length(model_list))
for (i in seq_along(model_list)) {
pred <- predict(
model_list[[i]],
newdata = data_test,
n.trees = best_trees[i]
)
prediksi_list[[i]] <- pred
metrik <- hitung_metrik(data_test$y, pred)
metrik$Shrinkage <- shrinkage_values[i]
metrik$Iterasi_Optimal <- as.integer(best_trees[i])
metrik_list[[i]] <- metrik
}
hasil_evaluasi <- bind_rows(metrik_list) %>%
select(Shrinkage, Iterasi_Optimal, MSE, RMSE, MAE, R2) %>%
arrange(RMSE)
kable(hasil_evaluasi, digits = 4,
caption = "Perbandingan Performa Model pada Data Uji")| Shrinkage | Iterasi_Optimal | MSE | RMSE | MAE | R2 |
|---|---|---|---|---|---|
| 0.05 | 2315 | 1.1805 | 1.0865 | 0.9038 | 0.9520 |
| 0.10 | 1370 | 1.3055 | 1.1426 | 0.9340 | 0.9469 |
| 0.01 | 4992 | 1.3175 | 1.1478 | 0.9498 | 0.9465 |
MSE, RMSE, dan MAE yang lebih rendah menunjukkan kesalahan prediksi yang lebih kecil. Sebaliknya, nilai \(R^2\) yang lebih tinggi menunjukkan bahwa model menjelaskan proporsi variasi respons yang lebih besar dibandingkan model dengan \(R^2\) lebih rendah. Model terbaik dalam praktikum ini ditentukan dengan mempertimbangkan keempat ukuran tersebut, dengan perhatian utama pada RMSE dan konsistensi hasil metrik lainnya.
model_terbaik <- hasil_evaluasi %>% slice(1)
cat("Shrinkage dengan RMSE terkecil:",
model_terbaik$Shrinkage, "\n")## Shrinkage dengan RMSE terkecil: 0.05
## Jumlah iterasi optimal: 2315
## MSE: 1.1805
## RMSE: 1.0865
## MAE: 0.9038
## R-squared: 0.952
Hasil di atas menunjukkan model dengan shrinkage tertentu yang unggul. Secara umum, nilai shrinkage yang lebih kecil cenderung membutuhkan lebih banyak pohon karena setiap pohon hanya memberikan kontribusi kecil terhadap model akhir. Sebaliknya, shrinkage yang lebih besar memungkinkan model mencapai performa yang baik dengan jumlah iterasi lebih sedikit. Namun, keputusan akhir tetap didasarkan pada hasil cross-validation dan evaluasi pada data uji, bukan sekadar pada besar-kecilnya nilai shrinkage.
Grafik berikut membandingkan nilai MSE, RMSE, dan MAE dari ketiga model. Karena ketiganya mengukur kesalahan prediksi, nilai yang lebih rendah lebih diharapkan.
hasil_evaluasi %>%
select(Shrinkage, MSE, RMSE, MAE) %>%
tidyr::pivot_longer(
cols = c(MSE, RMSE, MAE),
names_to = "Metrik",
values_to = "Nilai"
) %>%
ggplot(aes(x = factor(Shrinkage), y = Nilai)) +
geom_col() +
facet_wrap(~ Metrik, scales = "free_y") +
labs(
title = "Perbandingan Kesalahan Prediksi",
x = "Shrinkage",
y = "Nilai metrik"
) +
theme_minimal()Gambar 3. Perbandingan MSE, RMSE, dan MAE
ggplot(hasil_evaluasi,
aes(x = factor(Shrinkage), y = R2)) +
geom_col() +
labs(
title = "R-squared pada Data Uji",
x = "Shrinkage",
y = expression(R^2)
) +
theme_minimal()Gambar 4. Perbandingan nilai R-squared
Interpretasi Gambar 3 dan Gambar 4.
Gambar 3 menampilkan perbandingan MSE, RMSE, dan MAE untuk ketiga nilai
shrinkage. Batang yang lebih rendah pada ketiga metrik
kesalahan mengindikasikan model dengan kemampuan prediksi yang lebih
baik. Sementara itu, Gambar 4 menampilkan nilai \(R^2\). Batang yang lebih tinggi menunjukkan
proporsi variasi respons yang lebih besar dapat dijelaskan oleh model.
Idealnya, model terbaik memiliki batang terendah pada Gambar 3 dan
batang tertinggi pada Gambar 4 secara konsisten. Jika ketiga metrik
kesalahan dan \(R^2\) menunjuk ke model
yang sama, maka keyakinan terhadap pemilihan model terbaik semakin kuat.
Sebaliknya, jika terdapat inkonsistensi antar metrik, perlu dilakukan
pertimbangan lebih lanjut mengenai prioritas ukuran evaluasi yang
digunakan.
hasil_prediksi <- data.frame(
Aktual = data_test$y,
Shrinkage_001 = prediksi_list[["0.01"]],
Shrinkage_005 = prediksi_list[["0.05"]],
Shrinkage_010 = prediksi_list[["0.1"]]
)
hasil_prediksi_long <- hasil_prediksi %>%
tidyr::pivot_longer(
cols = starts_with("Shrinkage"),
names_to = "Model",
values_to = "Prediksi"
)
ggplot(hasil_prediksi_long,
aes(x = Aktual, y = Prediksi)) +
geom_point(alpha = 0.65) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed") +
facet_wrap(~ Model) +
labs(
title = "Nilai Aktual dan Prediksi pada Data Uji",
x = "Nilai aktual",
y = "Nilai prediksi"
) +
theme_minimal()Gambar 5. Nilai Aktual vs Prediksi pada Data Uji
Interpretasi Gambar 5.
Plot sebar aktual versus prediksi merupakan salah satu cara visual yang
paling intuitif untuk menilai kualitas prediksi model. Garis putus-putus
diagonal merepresentasikan prediksi sempurna (aktual = prediksi).
Semakin dekat titik-titik observasi terhadap garis tersebut, semakin
baik kemampuan prediksi model. Pola sebaran yang menyebar jauh dari
garis diagonal menandakan adanya kesalahan prediksi yang cukup besar
pada sebagian observasi. Selain kedekatan dengan garis diagonal,
penyebaran residual yang relatif homogen di sepanjang rentang nilai
aktual juga diinginkan, karena mengindikasikan bahwa model tidak hanya
baik pada rentang nilai tertentu saja. Perbandingan antar panel
(facet) memungkinkan pengamatan langsung perbedaan kualitas
prediksi antar nilai shrinkage.
Gradient Boosting dapat memberikan ukuran kepentingan relatif prediktor berdasarkan kontribusinya terhadap model. Nilai kepentingan yang lebih tinggi menunjukkan bahwa variabel tersebut lebih banyak berkontribusi pada pengurangan galat dalam model yang dibentuk. Ukuran ini merupakan indikator kontribusi prediktif, bukan bukti hubungan sebab-akibat.
indeks_terbaik <- which.min(hasil_evaluasi$RMSE)
shrinkage_terbaik <- hasil_evaluasi$Shrinkage[indeks_terbaik]
nama_model_terbaik <- as.character(shrinkage_terbaik)
model_final <- model_list[[nama_model_terbaik]]
iterasi_final <- as.integer(best_trees[nama_model_terbaik])
summary(
model_final,
n.trees = iterasi_final,
plotit = TRUE
)Gambar 6. Kepentingan variabel pada model terbaik
## var rel.inf
## x.4 x.4 29.9304668
## x.1 x.1 23.2619991
## x.2 x.2 21.7019932
## x.5 x.5 10.4260413
## x.3 x.3 9.2925865
## x.9 x.9 1.1322188
## x.6 x.6 1.1244160
## x.10 x.10 1.1151641
## x.7 x.7 1.0473917
## x.8 x.8 0.9677225
Interpretasi Kepentingan Variabel.
Pada data Friedman, respons dibentuk melalui hubungan nonlinier yang
melibatkan beberapa prediktor tertentu, sementara prediktor lainnya
bersifat noise (tidak informatif). Oleh karena itu, diharapkan
variabel yang benar-benar digunakan dalam pembentukan respons memiliki
nilai kepentingan relatif yang lebih tinggi, sedangkan variabel
noise memiliki kepentingan yang rendah. Hasil plot kepentingan
variabel membantu mengonfirmasi apakah model Gradient Boosting berhasil
mengidentifikasi prediktor yang relevan. Jika variabel yang secara teori
tidak berkontribusi ternyata memiliki kepentingan tinggi, hal tersebut
dapat menjadi indikasi bahwa model menangkap pola spurious pada sampel
tertentu. Sebaliknya, jika kepentingan variabel sejalan dengan struktur
data Friedman, maka model dapat dikatakan berhasil menangkap pola yang
benar.
hasil_urut <- hasil_evaluasi %>% arrange(RMSE)
terbaik <- hasil_urut[1, ]
terburuk <- hasil_urut[nrow(hasil_urut), ]
cat(
"**Model terbaik** dalam praktikum ini adalah model Gradient Boosting dengan nilai *shrinkage* **",
sprintf("%.2f", terbaik$Shrinkage),
"**.\n\n",
"Model tersebut menghasilkan RMSE terkecil sebesar **",
sprintf("%.4f", terbaik$RMSE),
"** dengan jumlah iterasi optimal sebanyak **",
terbaik$Iterasi_Optimal,
"** pohon (ditentukan melalui *five-fold cross-validation*). ",
"Nilai metrik lengkap model terbaik adalah sebagai berikut:\n\n",
"- MSE = ", sprintf("%.4f", terbaik$MSE), "\n",
"- RMSE = ", sprintf("%.4f", terbaik$RMSE), "\n",
"- MAE = ", sprintf("%.4f", terbaik$MAE), "\n",
"- R-squared = ", sprintf("%.4f", terbaik$R2), "\n\n",
"Sebagai perbandingan, model dengan performa terendah adalah *shrinkage* ",
sprintf("%.2f", terburuk$Shrinkage),
" dengan RMSE sebesar ",
sprintf("%.4f", terburuk$RMSE),
".\n\n",
sep = ""
)Model terbaik dalam praktikum ini adalah model Gradient Boosting dengan nilai shrinkage 0.05.
Model tersebut menghasilkan RMSE terkecil sebesar 1.0865 dengan jumlah iterasi optimal sebanyak 2315 pohon (ditentukan melalui five-fold cross-validation). Nilai metrik lengkap model terbaik adalah sebagai berikut:
Sebagai perbandingan, model dengan performa terendah adalah shrinkage 0.01 dengan RMSE sebesar 1.1478.
Mengapa model tersebut dipilih sebagai yang
terbaik?
Model dengan shrinkage di atas ditetapkan sebagai model terbaik
karena memiliki RMSE terkecil di antara ketiga model
yang diuji. RMSE dipilih sebagai kriteria utama karena:
Dengan demikian, keunggulan model terbaik tidak hanya terlihat pada satu ukuran saja, melainkan konsisten pada keempat metrik evaluasi.
Hubungan Shrinkage dengan Jumlah Iterasi.
Hasil praktikum memperlihatkan hubungan yang selaras dengan teori
Gradient Boosting. Nilai shrinkage yang lebih kecil membuat
setiap pohon hanya memberikan kontribusi kecil, sehingga model
membutuhkan lebih banyak iterasi untuk mencapai performa optimal.
Sebaliknya, shrinkage yang lebih besar memungkinkan model
belajar lebih cepat dengan jumlah pohon yang lebih sedikit. Namun,
shrinkage yang terlalu besar berisiko membuat model terlalu
agresif dan cenderung overfitting jika jumlah pohon tidak
dikontrol. Oleh karena itu, penggunaan cross-validation menjadi
penting untuk menentukan titik berhenti yang tepat bagi setiap nilai
shrinkage.
Implikasi Praktis.
Temuan ini menunjukkan bahwa pemilihan learning rate
(shrinkage) tidak bisa dipisahkan dari penentuan jumlah pohon.
Dalam praktik, peneliti sering memilih shrinkage kecil
(misalnya 0,01 atau 0,05) lalu membiarkan cross-validation
menentukan jumlah pohon yang cukup. Pendekatan ini umumnya menghasilkan
model yang lebih stabil dan memiliki generalisasi yang lebih baik
dibandingkan menggunakan shrinkage besar dengan sedikit pohon.
Pada data Friedman yang memiliki hubungan nonlinier dan prediktor
noise, Gradient Boosting terbukti mampu menangkap pola kompleks
sekaligus menekan pengaruh variabel yang tidak informatif, sebagaimana
tercermin pada plot kepentingan variabel.
Berdasarkan analisis regresi Gradient Boosting pada data Friedman, model dibangun menggunakan tiga nilai shrinkage, yaitu 0,01, 0,05, dan 0,10. Jumlah iterasi optimal untuk masing-masing model ditentukan menggunakan five-fold cross-validation. Selanjutnya, performa model dibandingkan pada data uji menggunakan MSE, RMSE, MAE, dan R-squared.
Model terbaik adalah model dengan nilai shrinkage yang menghasilkan RMSE terkecil pada data uji. Model tersebut juga unggul secara konsisten pada metrik MSE, MAE, dan R-squared. Hasil praktikum menunjukkan bahwa nilai shrinkage yang lebih kecil umumnya membutuhkan lebih banyak iterasi, sesuai dengan teori Gradient Boosting. Plot aktual versus prediksi dan plot kepentingan variabel memperkuat interpretasi bahwa model mampu menangkap pola nonlinier pada data Friedman sekaligus menekan pengaruh prediktor yang tidak informatif.
Dengan demikian, pemilihan model didasarkan pada hasil evaluasi
empiris, bukan semata-mata pada besarnya nilai shrinkage.
Praktikum ini sekaligus menunjukkan bahwa konsep Boosting
sebagai metode ensemble learning dapat diimplementasikan secara
konkret pada kasus regresi menggunakan paket gbm di R,
serta dievaluasi dengan ukuran yang sesuai.
Friedman, J. H. (2001). Greedy function approximation: A gradient boosting machine. The Annals of Statistics, 29(5), 1189–1232. https://doi.org/10.1214/aos/1013203451
Ridgeway, G. (2024). gbm: Generalized Boosted Regression Models. R package documentation. https://cran.r-project.org/package=gbm
Leisch, F., & Dimitriadou, E. (2024). mlbench: Machine Learning Benchmark Problems. R package documentation. https://cran.r-project.org/package=mlbench
Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction (2nd ed.). Springer.
Natekin, A., & Knoll, A. (2013). Gradient boosting machines, a tutorial. Frontiers in Neurorobotics, 7, Article 21. https://doi.org/10.3389/fnbot.2013.00021