BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

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.

1.2 Rumusan Masalah

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

1.3 Tujuan

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

BAB II TINJAUAN PUSTAKA

2.1 Ensemble Learning dan Boosting

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.

2.2 Gradient Boosting

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".

2.3 Cross-Validation dan Pemilihan Jumlah Iterasi

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.

2.4 Ukuran Evaluasi Model Regresi

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.

BAB III METODE PENELITIAN

3.1 Sumber Data

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.

3.2 Variabel Penelitian

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

3.3 Langkah-langkah Analisis

Analisis dilakukan melalui tahapan berikut.

  1. Memanggil paket yang dibutuhkan dan membangkitkan data Friedman.
  2. Memeriksa struktur data, ringkasan statistik, dan keberadaan nilai hilang.
  3. Membagi data menjadi 80% data latih dan 20% data uji menggunakan set.seed(234).
  4. Membentuk tiga model Gradient Boosting dengan nilai shrinkage 0,01, 0,05, dan 0,10. Setiap model menggunakan cross-validation lima lipatan.
  5. Menentukan jumlah iterasi optimal untuk setiap model berdasarkan galat cross-validation.
  6. Melakukan prediksi pada data uji menggunakan jumlah iterasi optimal.
  7. Menghitung MSE, RMSE, MAE, dan \(R^2\) pada data uji.
  8. Membandingkan hasil model, membuat visualisasi, dan menginterpretasikan performa serta kepentingan variabel.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Persiapan Data

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
str(data_friedman)
## '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.

summary(data_friedman)
##       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.

colSums(is.na(data_friedman))
##  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
sum(duplicated(data_friedman))
## [1] 0

Pada data simulasi yang dibangkitkan langsung, diharapkan tidak terdapat nilai hilang. Jika pemeriksaan menunjukkan tidak ada nilai hilang, imputasi tidak diperlukan.

4.2 Eksplorasi Data

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

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

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.

4.3 Pembagian Data

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
cat("Jumlah data latih:", nrow(data_train), "\n")
## Jumlah data latih: 800
cat("Jumlah data uji:", nrow(data_test), "\n")
## Jumlah data uji: 200

4.4 Pembentukan Model Gradient Boosting

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")
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.

4.5 Prediksi dan Evaluasi Model

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")
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
cat("Jumlah iterasi optimal:",
    model_terbaik$Iterasi_Optimal, "\n")
## Jumlah iterasi optimal: 2315
cat("MSE:", round(model_terbaik$MSE, 4), "\n")
## MSE: 1.1805
cat("RMSE:", round(model_terbaik$RMSE, 4), "\n")
## RMSE: 1.0865
cat("MAE:", round(model_terbaik$MAE, 4), "\n")
## MAE: 0.9038
cat("R-squared:", round(model_terbaik$R2, 4), "\n")
## 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.

4.6 Visualisasi Perbandingan Metrik

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

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

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.

4.7 Visualisasi Nilai Aktual dan Prediksi

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

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.

4.8 Kepentingan Variabel

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

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.

4.9 Interpretasi Hasil Secara Keseluruhan

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:

  • MSE = 1.1805
  • RMSE = 1.0865
  • MAE = 0.9038
  • R-squared = 0.9520

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:

  1. Memiliki satuan yang sama dengan variabel respons, sehingga mudah diinterpretasikan.
  2. Memberikan penalti lebih besar pada kesalahan prediksi yang besar (karena mengkuadratkan galat).
  3. Konsisten dengan metrik lain: model terbaik juga memiliki MSE dan MAE yang lebih rendah serta R-squared yang lebih tinggi dibandingkan dua model lainnya.

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.

BAB V KESIMPULAN

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.

DAFTAR PUSTAKA

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