BAB I PENDAHULUAN

1.1 Latar Belakang

Regresi merupakan salah satu metode machine learning yang digunakan untuk memprediksi nilai numerik berdasarkan variabel prediktor. Dalam penerapannya, hubungan antara variabel prediktor dan variabel respons tidak selalu bersifat linier. Oleh karena itu, diperlukan metode yang mampu mempelajari hubungan nonlinier dan interaksi antarvariabel.

Random Forest merupakan metode ensemble learning berbasis decision tree yang membangun banyak pohon keputusan dan menggabungkan hasil prediksinya. Metode ini merupakan pengembangan dari Bootstrap Aggregating (Bagging) dengan menambahkan pengacakan pemilihan prediktor pada setiap node. Pengacakan tersebut bertujuan mengurangi korelasi antar-pohon sehingga dapat meningkatkan kemampuan generalisasi model.

Pada praktikum Pertemuan V, Random Forest Regression diterapkan pada dataset Friedman untuk mempelajari hubungan antara sejumlah variabel prediktor dan variabel respons numerik. Model dibangun dengan membandingkan parameter mtry sebesar 2, 3, dan 5 serta jumlah pohon sebanyak 200, 500, dan 1000.

Performa model dievaluasi menggunakan data testing berdasarkan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (\(R^2\)). Selain itu, analisis residual plot dan variable importance dilakukan untuk mendukung interpretasi hasil. Nilai Out-of-Bag Mean Squared Error (OOB MSE) juga digunakan sebagai evaluasi internal model.

1.2 Rumusan Masalah

  1. Bagaimana penerapan Random Forest Regression pada dataset Friedman menggunakan paket ranger di R?
  2. Bagaimana perbandingan performa Random Forest Regression dengan mtry sebesar 2, 3, dan 5 serta jumlah pohon sebanyak 200, 500, dan 1000?
  3. Bagaimana perbandingan nilai MSE, RMSE, MAE, dan \(R^2\) pada data testing untuk sembilan kombinasi model?
  4. Bagaimana hasil evaluasi internal model berdasarkan OOB MSE?
  5. Bagaimana pola residual dan tingkat kepentingan variabel pada model Random Forest Regression?
  6. Kombinasi parameter manakah yang menghasilkan performa terbaik berdasarkan hasil evaluasi data testing?

1.3 Tujuan

  1. Mengimplementasikan Random Forest Regression pada dataset Friedman menggunakan paket ranger.
  2. Membandingkan sembilan kombinasi parameter mtry dan jumlah pohon.
  3. Menghitung MSE, RMSE, MAE, dan \(R^2\) berdasarkan prediksi pada data testing.
  4. Mengevaluasi model menggunakan OOB MSE sebagai ukuran kesalahan internal.
  5. Menampilkan dan menginterpretasikan residual plot serta variable importance.
  6. Menentukan model terbaik berdasarkan hasil evaluasi data testing.

1.4 Manfaat

Praktikum ini diharapkan dapat menambah pemahaman mengenai konsep dan penerapan Random Forest Regression, pengaruh parameter model terhadap performa prediksi, serta penggunaan metrik evaluasi regresi. Praktikum ini juga diharapkan membantu memahami fungsi OOB MSE, residual plot, dan variable importance dalam mengevaluasi model.

1.5 Batasan Masalah

  1. Dataset yang digunakan adalah Friedman No. 1 dari paket mlbench.
  2. Dataset dibentuk menggunakan 200 pengamatan sesuai dengan sintaks pada modul praktikum.
  3. Variabel respons berupa data numerik dan variabel prediktor terdiri atas X1 hingga X10.
  4. Data dibagi menjadi 70% data training dan 30% data testing.
  5. Pembagian data dilakukan secara acak dengan set.seed(234).
  6. Pemodelan menggunakan fungsi ranger() dengan tipe regresi.
  7. Nilai mtry yang digunakan adalah 2, 3, dan 5.
  8. Jumlah pohon yang digunakan adalah 200, 500, dan 1000.
  9. Evaluasi testing menggunakan MSE, RMSE, MAE, dan \(R^2\).
  10. Evaluasi internal menggunakan OOB MSE.
  11. Analisis visual mencakup residual plot dan variable importance.
  12. Model terbaik ditentukan berdasarkan RMSE terendah pada data testing.

1.6 Sistematika Penulisan

Laporan ini terdiri atas lima bab utama. Bab I membahas pendahuluan, Bab II menjelaskan tinjauan pustaka, Bab III menjelaskan metode penelitian, Bab IV menyajikan hasil dan pembahasan, sedangkan Bab V berisi kesimpulan dan saran. Bagian akhir laporan dilengkapi daftar pustaka dan kode program.

BAB II TINJAUAN PUSTAKA

2.1 Bagging dan Random Forest

Random Forest merupakan metode ensemble learning berbasis pohon keputusan yang dikembangkan dari konsep Bootstrap Aggregating atau Bagging. Bagging membangun banyak model menggunakan sampel bootstrap yang diambil dari data training dengan pengembalian. Prediksi akhir diperoleh dengan menggabungkan prediksi dari seluruh model.

Pada Random Forest, selain menggunakan bootstrap sampling, dilakukan pula pemilihan sejumlah prediktor secara acak pada setiap node ketika mencari pemisahan terbaik. Mekanisme ini membedakan Random Forest dari Bagging biasa, yang pada umumnya mempertimbangkan seluruh prediktor pada setiap pemisahan.

Tujuan pengacakan prediktor adalah mengurangi korelasi antar-pohon. Dengan menggabungkan banyak pohon yang memiliki keragaman, Random Forest dapat mengurangi variansi prediksi dan meningkatkan kemampuan generalisasi.

Pada regresi, prediksi akhir diperoleh melalui rata-rata prediksi dari seluruh pohon:

\[ \hat{f}_{RF}(x)= \frac{1}{B}\sum_{b=1}^{B}T_b(x) \]

dengan:

  • \(B\) adalah jumlah pohon yang dibangun.
  • \(T_b(x)\) adalah prediksi pohon ke-\(b\).
  • \(\hat{f}_{RF}(x)\) adalah prediksi akhir Random Forest.

2.2 Proses Pembentukan Random Forest

Proses pembentukan Random Forest Regression secara umum terdiri atas beberapa tahapan berikut.

  1. Mengambil sampel bootstrap dari data training.
  2. Memilih sejumlah mtry prediktor secara acak pada setiap node.
  3. Menentukan pemisahan terbaik berdasarkan prediktor yang terpilih.
  4. Menumbuhkan pohon hingga memenuhi aturan penghentian.
  5. Mengulangi proses hingga jumlah pohon yang ditentukan tercapai.
  6. Menggabungkan prediksi seluruh pohon melalui rata-rata prediksi.

Random Forest termasuk metode parallel ensemble, karena setiap pohon dapat dibangun secara relatif independen. Hal ini berbeda dengan metode Boosting, yang membangun model secara berurutan dengan memperhatikan kesalahan model sebelumnya.

2.3 Parameter Random Forest

2.3.1 Parameter mtry

Parameter mtry menentukan banyaknya prediktor yang dipilih secara acak untuk dipertimbangkan pada setiap node. Nilai mtry memengaruhi struktur pohon, keragaman antar-pohon, dan performa prediksi.

Pada praktikum ini, nilai mtry yang digunakan adalah 2, 3, dan 5. Ketiga nilai tersebut dibandingkan untuk mengetahui pengaruh jumlah kandidat prediktor terhadap hasil prediksi.

2.3.2 Parameter num.trees

Parameter num.trees pada fungsi ranger() menentukan jumlah pohon yang dibangun dalam ensemble. Semakin banyak pohon yang digunakan, semakin banyak prediksi yang digabungkan untuk menghasilkan prediksi akhir.

Pada praktikum ini, jumlah pohon ditetapkan sebesar 200, 500, dan 1000. Penambahan pohon dapat membantu menstabilkan prediksi, tetapi juga meningkatkan waktu komputasi.

2.3.3 Parameter min.node.size

Parameter min.node.size menentukan ukuran minimum node terminal. Nilai parameter ini memengaruhi tingkat kompleksitas pohon dan kemampuan model dalam menangkap pola data.

Pada praktikum ini, min.node.size ditetapkan sebesar 5 untuk seluruh model agar perbandingan berfokus pada pengaruh mtry dan jumlah pohon.

2.3.4 Parameter importance

Parameter importance digunakan untuk mengatur perhitungan kepentingan variabel. Dalam praktikum ini digunakan nilai "permutation" untuk memperoleh ukuran kepentingan berdasarkan perubahan kesalahan prediksi ketika nilai suatu variabel diacak.

2.4 Dataset Friedman

Friedman No. 1 merupakan dataset simulasi yang digunakan untuk menguji kemampuan metode regresi dalam mempelajari hubungan nonlinier.

Dataset ini terdiri atas sepuluh variabel prediktor dan satu variabel respons. Lima prediktor pertama digunakan secara langsung dalam fungsi pembentuk respons, sedangkan lima prediktor lainnya berperan sebagai prediktor tambahan.

Hubungan respons pada Friedman No. 1 secara umum dapat dituliskan sebagai:

\[ \begin{aligned} Y={}&10\sin(\pi X_1X_2)\\ &+20(X_3-0.5)^2\\ &+10X_4+5X_5+\varepsilon \end{aligned} \]

dengan \(\varepsilon\) sebagai komponen galat acak. Hubungan tersebut bersifat nonlinier sehingga dapat digunakan untuk mengevaluasi kemampuan Random Forest dalam mempelajari pola prediksi yang kompleks.

2.5 Out-of-Bag Error

Pada proses bootstrap, pengambilan sampel dilakukan dengan pengembalian. Akibatnya, sebagian observasi dapat terpilih lebih dari satu kali, sedangkan sebagian lainnya tidak terpilih dalam sampel bootstrap suatu pohon.

Secara rata-rata, proporsi observasi unik yang masuk ke dalam sampel bootstrap mendekati:

\[ 1-e^{-1}\approx 0.632 \]

Dengan demikian, sekitar 36,8% observasi tidak digunakan untuk membangun pohon tertentu. Observasi tersebut disebut Out-of-Bag (OOB).

Prediksi OOB diperoleh dengan menggabungkan prediksi dari pohon-pohon yang tidak menggunakan observasi terkait dalam proses pembentukan pohon. Pada regresi, OOB error dinyatakan sebagai Mean Squared Error (MSE).

OOB MSE dapat digunakan untuk menilai kesalahan prediksi internal Random Forest tanpa menyediakan data validasi tambahan. Namun, OOB MSE tidak sama dengan MSE pada data testing karena keduanya menggunakan mekanisme evaluasi yang berbeda.

2.6 Metrik Evaluasi Regresi

2.6.1 Mean Squared Error (MSE)

MSE merupakan rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi.

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

MSE yang lebih kecil menunjukkan kesalahan kuadrat rata-rata yang lebih rendah. Karena menggunakan kuadrat residual, MSE memberikan penalti lebih besar terhadap kesalahan prediksi yang besar.

2.6.2 Root Mean Squared Error (RMSE)

RMSE merupakan akar kuadrat dari MSE.

\[ RMSE=\sqrt{MSE} \]

RMSE memiliki satuan yang sama dengan variabel respons sehingga lebih mudah diinterpretasikan dalam konteks nilai prediksi. Nilai RMSE yang lebih kecil menunjukkan performa prediksi yang lebih baik.

2.6.3 Mean Absolute Error (MAE)

MAE mengukur rata-rata nilai absolut selisih antara nilai aktual dan nilai prediksi.

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

Nilai MAE yang lebih kecil menunjukkan bahwa rata-rata besar kesalahan prediksi semakin rendah.

2.6.4 Koefisien Determinasi (\(R^2\))

Koefisien determinasi mengukur kemampuan prediksi model dalam menjelaskan variasi nilai respons pada data evaluasi.

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

Nilai \(R^2\) yang mendekati 1 menunjukkan performa yang lebih baik. Nilai \(R^2\) dapat negatif apabila kesalahan model lebih besar daripada kesalahan ketika seluruh pengamatan diprediksi menggunakan rata-rata nilai aktual.

2.7 Residual Plot

Residual merupakan selisih antara nilai aktual dan nilai prediksi:

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

Residual plot menggambarkan hubungan antara nilai prediksi dan residual. Grafik ini digunakan untuk melihat apakah kesalahan prediksi tersebar secara acak di sekitar nol atau menunjukkan pola tertentu.

Residual yang tersebar di sekitar nol tanpa pola sistematis umumnya menunjukkan bahwa model telah menangkap sebagian besar pola hubungan data. Sebaliknya, pola melengkung atau perubahan penyebaran residual dapat mengindikasikan adanya struktur hubungan yang belum tertangkap dengan baik.

2.8 Variable Importance

Variable importance merupakan ukuran yang digunakan untuk menilai kontribusi relatif prediktor terhadap performa model.

Pada Random Forest dengan pengaturan "permutation", nilai kepentingan variabel dihitung berdasarkan perubahan kesalahan prediksi ketika nilai prediktor diacak. Variabel yang menyebabkan peningkatan kesalahan prediksi lebih besar ketika diacak umumnya dianggap lebih penting bagi model.

Hasil variable importance membantu mengidentifikasi prediktor yang berkontribusi terhadap prediksi. Namun, ukuran ini tidak membuktikan hubungan sebab-akibat dan dapat dipengaruhi oleh karakteristik data serta hubungan antarvariabel.

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

Data yang digunakan adalah dataset simulasi Friedman No. 1 yang dibangkitkan melalui fungsi mlbench.friedman1() dari paket mlbench pada R.

Sesuai dengan sintaks pada modul praktikum, jumlah pengamatan yang digunakan adalah 200. Dataset terdiri atas sepuluh variabel prediktor dan satu variabel respons numerik.

3.2 Variabel Penelitian

var_tab <- data.frame(
  Variabel = c("Y", paste0("X", 1:10)),
  Peran = c("Respons", rep("Prediktor", 10)),
  Keterangan = c(
    "Variabel numerik yang diprediksi",
    "Prediktor utama dalam fungsi Friedman",
    "Prediktor utama dalam fungsi Friedman",
    "Prediktor utama dalam fungsi Friedman",
    "Prediktor utama dalam fungsi Friedman",
    "Prediktor utama dalam fungsi Friedman",
    rep("Prediktor tambahan", 5)
  )
)

knitr::kable(
  var_tab,
  caption = "Tabel 3.1 Variabel penelitian"
)
Tabel 3.1 Variabel penelitian
Variabel Peran Keterangan
Y Respons Variabel numerik yang diprediksi
X1 Prediktor Prediktor utama dalam fungsi Friedman
X2 Prediktor Prediktor utama dalam fungsi Friedman
X3 Prediktor Prediktor utama dalam fungsi Friedman
X4 Prediktor Prediktor utama dalam fungsi Friedman
X5 Prediktor Prediktor utama dalam fungsi Friedman
X6 Prediktor Prediktor tambahan
X7 Prediktor Prediktor tambahan
X8 Prediktor Prediktor tambahan
X9 Prediktor Prediktor tambahan
X10 Prediktor Prediktor tambahan

3.3 Rancangan Eksperimen

Penelitian membandingkan sembilan kombinasi parameter Random Forest Regression sebagai berikut.

rancangan <- expand.grid(
  mtry = c(2, 3, 5),
  num.trees = c(200, 500, 1000)
)

rancangan <- rancangan[
  order(rancangan$mtry, rancangan$num.trees),
]

rownames(rancangan) <- NULL

rancangan$Model <- paste0(
  "RF_mtry", rancangan$mtry,
  "_trees", rancangan$num.trees
)

knitr::kable(
  rancangan[, c("Model", "mtry", "num.trees")],
  caption = "Tabel 3.2 Rancangan sembilan model Random Forest"
)
Tabel 3.2 Rancangan sembilan model Random Forest
Model mtry num.trees
RF_mtry2_trees200 2 200
RF_mtry2_trees500 2 500
RF_mtry2_trees1000 2 1000
RF_mtry3_trees200 3 200
RF_mtry3_trees500 3 500
RF_mtry3_trees1000 3 1000
RF_mtry5_trees200 5 200
RF_mtry5_trees500 5 500
RF_mtry5_trees1000 5 1000

3.4 Tahapan Analisis

Tahapan analisis yang dilakukan adalah:

  1. Membentuk dataset Friedman No. 1.
  2. Memeriksa struktur dan ringkasan data.
  3. Membagi data menjadi training dan testing dengan proporsi 70:30.
  4. Membentuk sembilan model Random Forest Regression.
  5. Menghitung OOB MSE dari masing-masing model.
  6. Melakukan prediksi terhadap data testing.
  7. Menghitung MSE, RMSE, MAE, dan \(R^2\).
  8. Membandingkan hasil evaluasi sembilan model.
  9. Menentukan model terbaik berdasarkan RMSE testing terendah.
  10. Menampilkan residual plot dan variable importance model terbaik.
  11. Menyusun kesimpulan berdasarkan hasil analisis.

3.5 Diagram Alir Penelitian

Gambar 3.1. Diagram alir penelitian Random Forest Regression.

BAB IV HASIL DAN PEMBAHASAN

4.1 Pembentukan dan Pemeriksaan Data

set.seed(234)

data_friedman <- mlbench::mlbench.friedman1(200)

data_analisis <- as.data.frame(data_friedman$x)
names(data_analisis) <- paste0("X", 1:10)

data_analisis$Y <- as.numeric(data_friedman$y)

cat("Jumlah pengamatan:", nrow(data_analisis), "\n")
## Jumlah pengamatan: 200
cat("Jumlah prediktor:", ncol(data_analisis) - 1, "\n")
## Jumlah prediktor: 10
cat("Jumlah variabel keseluruhan:", ncol(data_analisis), "\n")
## Jumlah variabel keseluruhan: 11
str(data_analisis)
## 'data.frame':    200 obs. of  11 variables:
##  $ X1 : num  0.7456 0.7817 0.02 0.7761 0.0669 ...
##  $ X2 : num  0.575 0.316 0.765 0.229 0.172 ...
##  $ X3 : num  0.0289 0.9375 0.7978 0.668 0.5974 ...
##  $ X4 : num  0.72 0.185 0.534 0.553 0.755 ...
##  $ X5 : num  0.875 0.704 0.952 0.478 0.533 ...
##  $ X6 : num  0.276 0.643 0.987 0.843 0.733 ...
##  $ X7 : num  0.9332 0.4018 0.0874 0.893 0.1024 ...
##  $ X8 : num  0.60746 0.00369 0.0106 0.44639 0.83494 ...
##  $ X9 : num  0.756 0.405 0.247 0.144 0.187 ...
##  $ X10: num  0.718 0.534 0.667 0.68 0.595 ...
##  $ Y  : num  24.35 18.05 12.02 12.1 9.91 ...

Dataset yang digunakan memiliki 200 pengamatan, 10 variabel prediktor, dan satu variabel respons numerik. Dataset ini digunakan untuk mengevaluasi kemampuan Random Forest dalam mempelajari hubungan nonlinier.

knitr::kable(
  head(data_analisis, 6),
  caption = "Tabel 4.1 Enam pengamatan pertama dataset Friedman"
)
Tabel 4.1 Enam pengamatan pertama dataset Friedman
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 Y
0.7456200 0.5754994 0.0288559 0.7201653 0.8748022 0.2761835 0.9331909 0.6074629 0.7560942 0.7179672 24.349507
0.7817124 0.3157821 0.9374539 0.1849746 0.7039934 0.6426889 0.4017780 0.0036875 0.4046106 0.5338439 18.046792
0.0200371 0.7646459 0.7977729 0.5338609 0.9515834 0.9873938 0.0874300 0.0105981 0.2473974 0.6669937 12.018651
0.7760854 0.2289793 0.6679795 0.5534984 0.4780999 0.8425175 0.8930220 0.4463931 0.1443539 0.6802987 12.101870
0.0669101 0.1715219 0.5974095 0.7547957 0.5332404 0.7327976 0.1024456 0.8349360 0.1874371 0.5950115 9.911772
0.6447951 0.6473963 0.0135133 0.7894812 0.2376348 0.4302338 0.8823674 0.8435092 0.6166422 0.1081932 21.874286
knitr::kable(
  data.frame(
    Statistik = c("Minimum", "Kuartil 1", "Median",
                  "Rata-rata", "Kuartil 3", "Maksimum"),
    Nilai_Y = c(
      min(data_analisis$Y),
      unname(quantile(data_analisis$Y, 0.25)),
      median(data_analisis$Y),
      mean(data_analisis$Y),
      unname(quantile(data_analisis$Y, 0.75)),
      max(data_analisis$Y)
    )
  ),
  digits = 4,
  caption = "Tabel 4.2 Ringkasan statistik variabel respons"
)
Tabel 4.2 Ringkasan statistik variabel respons
Statistik Nilai_Y
Minimum 3.0821
Kuartil 1 10.5935
Median 13.8105
Rata-rata 14.2697
Kuartil 3 18.0632
Maksimum 26.1458

4.2 Pembagian Data Training dan Testing

Data dibagi menjadi 70% data training dan 30% data testing. Pembagian dilakukan secara acak dengan set.seed(234) agar dapat direproduksi.

set.seed(234)

n_total <- nrow(data_analisis)

idx_train <- sample(
  seq_len(n_total),
  size = floor(0.70 * n_total)
)

data_train <- data_analisis[idx_train, , drop = FALSE]
data_test <- data_analisis[-idx_train, , drop = FALSE]

ringkasan_pembagian <- data.frame(
  Data = c("Keseluruhan", "Training", "Testing"),
  Jumlah = c(
    nrow(data_analisis),
    nrow(data_train),
    nrow(data_test)
  ),
  Persentase = c(
    100,
    100 * nrow(data_train) / n_total,
    100 * nrow(data_test) / n_total
  )
)

knitr::kable(
  ringkasan_pembagian,
  digits = 2,
  caption = "Tabel 4.3 Pembagian data training dan testing"
)
Tabel 4.3 Pembagian data training dan testing
Data Jumlah Persentase
Keseluruhan 200 100
Training 140 70
Testing 60 30

Data training digunakan untuk membangun model Random Forest, sedangkan data testing digunakan untuk mengevaluasi performa prediksi pada pengamatan yang tidak digunakan dalam pelatihan.

4.3 Pemodelan Random Forest Regression

Sembilan model dibangun menggunakan kombinasi mtry sebesar 2, 3, dan 5 serta jumlah pohon sebesar 200, 500, dan 1000. Parameter jumlah pohon dituliskan sebagai num.trees sesuai fungsi ranger().

Parameter min.node.size ditetapkan sebesar 5 dan importance menggunakan metode "permutation". Seluruh model menggunakan data training yang sama agar perbandingan lebih terarah.

nilai_mtry <- c(2, 3, 5)
nilai_trees <- c(200, 500, 1000)

model_list <- list()
prediksi_list <- list()
residual_list <- list()
hasil_model <- list()

for (m in nilai_mtry) {
  for (nt in nilai_trees) {

    nama_model <- paste0(
      "RF_mtry", m,
      "_trees", nt
    )

    set.seed(234)

    model <- ranger::ranger(
      formula = Y ~ .,
      data = data_train,
      num.trees = nt,
      mtry = m,
      min.node.size = 5,
      replace = TRUE,
      sample.fraction = 1,
      importance = "permutation",
      seed = 234
    )

    prediksi <- predict(
      model,
      data = data_test
    )$predictions

    aktual <- data_test$Y
    residual <- aktual - prediksi

    mse <- mean(residual^2)
    rmse <- sqrt(mse)
    mae <- mean(abs(residual))

    r2 <- 1 -
      sum(residual^2) /
      sum((aktual - mean(aktual))^2)

    # Pada ranger untuk regresi, prediction.error
    # merupakan estimasi OOB MSE.
    oob_mse <- model$prediction.error

    model_list[[nama_model]] <- model
    prediksi_list[[nama_model]] <- prediksi
    residual_list[[nama_model]] <- residual

    hasil_model[[nama_model]] <- data.frame(
      Model = nama_model,
      mtry = m,
      num.trees = nt,
      OOB_MSE = oob_mse,
      MSE = mse,
      RMSE = rmse,
      MAE = mae,
      R2 = r2
    )
  }
}

tabel_hasil <- do.call(rbind, hasil_model)
rownames(tabel_hasil) <- NULL

tabel_hasil <- tabel_hasil[
  order(tabel_hasil$mtry, tabel_hasil$num.trees),
]

tabel_hasil_tampil <- tabel_hasil

kolom_metrik <- c(
  "OOB_MSE", "MSE", "RMSE", "MAE", "R2"
)

tabel_hasil_tampil[kolom_metrik] <- lapply(
  tabel_hasil_tampil[kolom_metrik],
  fmt
)

knitr::kable(
  tabel_hasil_tampil,
  caption = "Tabel 4.4 Hasil evaluasi sembilan model Random Forest"
)
Tabel 4.4 Hasil evaluasi sembilan model Random Forest
Model mtry num.trees OOB_MSE MSE RMSE MAE R2
RF_mtry2_trees200 2 200 8.8009 7.9691 2.8230 2.2390 0.6524
RF_mtry2_trees500 2 500 8.3630 8.0263 2.8331 2.2475 0.6499
RF_mtry2_trees1000 2 1000 8.2434 7.8975 2.8102 2.2456 0.6556
RF_mtry3_trees200 3 200 7.4579 7.4211 2.7242 2.1780 0.6763
RF_mtry3_trees500 3 500 7.2766 7.2625 2.6949 2.1746 0.6833
RF_mtry3_trees1000 3 1000 7.2317 7.2026 2.6838 2.1597 0.6859
RF_mtry5_trees200 5 200 6.6030 7.0778 2.6604 2.1505 0.6913
RF_mtry5_trees500 5 500 6.5659 7.3454 2.7102 2.1681 0.6796
RF_mtry5_trees1000 5 1000 6.5798 7.2505 2.6927 2.1575 0.6838

Tabel 4.4 menunjukkan perbandingan OOB MSE dan metrik evaluasi pada data testing. MSE, RMSE, dan MAE yang lebih kecil menunjukkan kesalahan prediksi yang lebih rendah, sedangkan \(R^2\) yang lebih besar umumnya menunjukkan kemampuan prediksi yang lebih baik.

OOB MSE dihitung secara internal oleh ranger(). Nilai tersebut berbeda dari MSE testing karena OOB MSE menggunakan prediksi observasi yang tidak digunakan pada pembentukan pohon terkait, sedangkan MSE testing menggunakan data testing yang terpisah.

4.4 Perbandingan Metrik Data Testing

data_plot <- rbind(
  data.frame(
    Model = tabel_hasil$Model,
    mtry = factor(tabel_hasil$mtry),
    num.trees = factor(tabel_hasil$num.trees),
    Metrik = "MSE",
    Nilai = tabel_hasil$MSE
  ),
  data.frame(
    Model = tabel_hasil$Model,
    mtry = factor(tabel_hasil$mtry),
    num.trees = factor(tabel_hasil$num.trees),
    Metrik = "RMSE",
    Nilai = tabel_hasil$RMSE
  ),
  data.frame(
    Model = tabel_hasil$Model,
    mtry = factor(tabel_hasil$mtry),
    num.trees = factor(tabel_hasil$num.trees),
    Metrik = "MAE",
    Nilai = tabel_hasil$MAE
  ),
  data.frame(
    Model = tabel_hasil$Model,
    mtry = factor(tabel_hasil$mtry),
    num.trees = factor(tabel_hasil$num.trees),
    Metrik = "R2",
    Nilai = tabel_hasil$R2
  )
)

ggplot(
  data_plot,
  aes(
    x = num.trees,
    y = Nilai,
    group = mtry,
    color = mtry
  )
) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2.5) +
  facet_wrap(~ Metrik, scales = "free_y") +
  labs(
    title = "Perbandingan Metrik Testing Random Forest",
    x = "Jumlah pohon (num.trees)",
    y = "Nilai metrik",
    color = "mtry"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    ),
    legend.position = "bottom"
  )

Gambar 4.1. Perbandingan MSE, RMSE, MAE, dan \(R^2\) berdasarkan mtry dan jumlah pohon.

Grafik digunakan untuk mengamati perubahan performa ketika jumlah pohon meningkat dari 200 menjadi 500 dan 1000. Perbedaan garis menunjukkan bagaimana pengaturan mtry berhubungan dengan kesalahan prediksi pada jumlah pohon yang berbeda.

4.5 Evaluasi Internal Menggunakan OOB MSE

ggplot(
  tabel_hasil,
  aes(
    x = num.trees,
    y = OOB_MSE,
    color = factor(mtry),
    group = factor(mtry)
  )
) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2.5) +
  labs(
    title = "Perbandingan OOB MSE",
    x = "Jumlah pohon (num.trees)",
    y = "OOB MSE",
    color = "mtry"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    ),
    legend.position = "bottom"
  )

Gambar 4.2. Perbandingan OOB MSE pada sembilan model Random Forest.

OOB MSE merupakan ukuran kesalahan internal model yang dihitung berdasarkan pengamatan out-of-bag. Nilai yang lebih kecil menunjukkan estimasi kesalahan internal yang lebih rendah. Namun, OOB MSE tidak menggantikan evaluasi data testing karena kedua ukuran tersebut berasal dari mekanisme evaluasi yang berbeda.

4.6 Penentuan Model Terbaik

Model terbaik ditentukan berdasarkan RMSE testing terendah. Apabila terdapat nilai RMSE yang sama, MSE yang lebih rendah digunakan sebagai kriteria pembanding. Nilai \(R^2\) yang lebih tinggi menjadi pembanding berikutnya.

peringkat <- tabel_hasil[
  order(
    tabel_hasil$RMSE,
    tabel_hasil$MSE,
    -tabel_hasil$R2
  ),
]

rownames(peringkat) <- NULL

peringkat_tampil <- peringkat

peringkat_tampil[kolom_metrik] <- lapply(
  peringkat_tampil[kolom_metrik],
  fmt
)

knitr::kable(
  peringkat_tampil,
  caption = "Tabel 4.5 Peringkat model berdasarkan RMSE testing"
)
Tabel 4.5 Peringkat model berdasarkan RMSE testing
Model mtry num.trees OOB_MSE MSE RMSE MAE R2
RF_mtry5_trees200 5 200 6.6030 7.0778 2.6604 2.1505 0.6913
RF_mtry3_trees1000 3 1000 7.2317 7.2026 2.6838 2.1597 0.6859
RF_mtry5_trees1000 5 1000 6.5798 7.2505 2.6927 2.1575 0.6838
RF_mtry3_trees500 3 500 7.2766 7.2625 2.6949 2.1746 0.6833
RF_mtry5_trees500 5 500 6.5659 7.3454 2.7102 2.1681 0.6796
RF_mtry3_trees200 3 200 7.4579 7.4211 2.7242 2.1780 0.6763
RF_mtry2_trees1000 2 1000 8.2434 7.8975 2.8102 2.2456 0.6556
RF_mtry2_trees200 2 200 8.8009 7.9691 2.8230 2.2390 0.6524
RF_mtry2_trees500 2 500 8.3630 8.0263 2.8331 2.2475 0.6499
model_terbaik_nama <- peringkat$Model[1]
model_terbaik <- model_list[[model_terbaik_nama]]

cat(
  "\nModel terbaik:", model_terbaik_nama,
  "\nRMSE testing:", round(peringkat$RMSE[1], 4),
  "\nMSE testing:", round(peringkat$MSE[1], 4),
  "\nMAE testing:", round(peringkat$MAE[1], 4),
  "\nR2 testing:", round(peringkat$R2[1], 4),
  "\nOOB MSE:", round(peringkat$OOB_MSE[1], 4),
  "\n"
)
## 
## Model terbaik: RF_mtry5_trees200 
## RMSE testing: 2.6604 
## MSE testing: 7.0778 
## MAE testing: 2.1505 
## R2 testing: 0.6913 
## OOB MSE: 6.603

Berdasarkan aturan evaluasi yang telah ditetapkan, model pada peringkat pertama merupakan model dengan RMSE testing terendah. Hasil tersebut menunjukkan bahwa model memiliki akar kesalahan kuadrat rata-rata paling kecil pada pembagian data yang digunakan.

Meskipun demikian, RMSE perlu diinterpretasikan bersama MSE, MAE, dan \(R^2\). Model dengan RMSE terendah belum tentu menghasilkan MAE terendah atau \(R^2\) tertinggi.

4.7 Residual Plot Model Terbaik

Residual plot digunakan untuk memeriksa pola kesalahan prediksi pada model terbaik. Residual didefinisikan sebagai nilai aktual dikurangi nilai prediksi.

data_residual <- data.frame(
  Aktual = data_test$Y,
  Prediksi = prediksi_list[[model_terbaik_nama]],
  Residual = residual_list[[model_terbaik_nama]]
)

ggplot(
  data_residual,
  aes(
    x = Prediksi,
    y = Residual
  )
) +
  geom_point(alpha = 0.75) +
  geom_hline(
    yintercept = 0,
    linetype = "dashed",
    color = "#CB4335"
  ) +
  geom_smooth(
    method = "loess",
    se = FALSE,
    color = "#2874A6"
  ) +
  labs(
    title = paste(
      "Residual Plot Model Terbaik:",
      model_terbaik_nama
    ),
    x = "Nilai prediksi",
    y = "Residual (aktual - prediksi)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

Gambar 4.3. Residual plot model terbaik pada data testing.

Residual yang tersebar di sekitar garis nol tanpa pola sistematis umumnya menunjukkan bahwa model telah menangkap sebagian besar struktur hubungan data. Sebaliknya, pola melengkung atau perubahan penyebaran residual dapat mengindikasikan adanya pola yang belum tertangkap dengan baik.

Interpretasi akhir dilakukan berdasarkan pola yang benar-benar terlihat pada grafik hasil pemodelan.

4.8 Variable Importance

Analisis variable importance dilakukan menggunakan model terbaik. Metode permutation importance digunakan untuk mengukur perubahan kesalahan prediksi ketika nilai prediktor diacak.

importance_tab <- data.frame(
  Variabel = names(model_terbaik$variable.importance),
  Importance = as.numeric(
    model_terbaik$variable.importance
  )
)

importance_tab <- importance_tab[
  order(
    importance_tab$Importance,
    decreasing = TRUE
  ),
]

rownames(importance_tab) <- NULL

knitr::kable(
  transform(
    importance_tab,
    Importance = round(Importance, 4)
  ),
  caption = paste(
    "Tabel 4.6 Variable importance model",
    model_terbaik_nama
  )
)
Tabel 4.6 Variable importance model RF_mtry5_trees200
Variabel Importance
X4 11.8326
X1 10.2982
X2 4.5789
X3 1.9682
X5 0.4796
X9 0.1334
X10 0.0709
X6 0.0607
X7 0.0489
X8 0.0466
ggplot(
  importance_tab,
  aes(
    x = reorder(Variabel, Importance),
    y = Importance
  )
) +
  geom_col(
    fill = "#2E86C1",
    width = 0.7
  ) +
  coord_flip() +
  labs(
    title = paste(
      "Variable Importance:",
      model_terbaik_nama
    ),
    x = "Variabel prediktor",
    y = "Permutation importance"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

Gambar 4.4. Tingkat kepentingan variabel pada model terbaik.

Variabel dengan nilai permutation importance lebih besar menunjukkan kontribusi prediktif yang lebih tinggi berdasarkan ukuran yang digunakan. Pada dataset Friedman, lima prediktor pertama secara teoritis memengaruhi pembentukan respons.

Hasil analisis dapat digunakan untuk memeriksa apakah model memberikan tingkat kepentingan relatif yang sejalan dengan karakteristik data. Namun, ukuran kepentingan variabel tidak membuktikan hubungan sebab-akibat.

4.9 Pembahasan Hasil

terbaik <- peringkat[1, ]

cat(
  "**Model terbaik berdasarkan RMSE testing:** ",
  terbaik$Model, ".\n\n",
  sep = ""
)

Model terbaik berdasarkan RMSE testing: RF_mtry5_trees200.

cat(
  "- **MSE testing:** ", round(terbaik$MSE, 4), "\n",
  "- **RMSE testing:** ", round(terbaik$RMSE, 4), "\n",
  "- **MAE testing:** ", round(terbaik$MAE, 4), "\n",
  "- **R-squared testing:** ", round(terbaik$R2, 4), "\n",
  "- **OOB MSE:** ", round(terbaik$OOB_MSE, 4), "\n\n",
  sep = ""
)
  • MSE testing: 7.0778
  • RMSE testing: 2.6604
  • MAE testing: 2.1505
  • R-squared testing: 0.6913
  • OOB MSE: 6.603
cat(
  "Hasil tersebut menggambarkan performa model terbaik pada satu ",
  "pembagian data training dan testing. Metrik evaluasi perlu ",
  "diinterpretasikan bersama-sama, sedangkan residual plot dan ",
  "variable importance digunakan untuk melengkapi evaluasi numerik.\n",
  sep = ""
)

Hasil tersebut menggambarkan performa model terbaik pada satu pembagian data training dan testing. Metrik evaluasi perlu diinterpretasikan bersama-sama, sedangkan residual plot dan variable importance digunakan untuk melengkapi evaluasi numerik.

Perbandingan sembilan model menunjukkan bagaimana pengaturan mtry dan jumlah pohon berkaitan dengan performa prediksi. Nilai mtry memengaruhi keragaman pohon yang dibangun, sedangkan jumlah pohon memengaruhi banyaknya prediksi yang digabungkan.

OOB MSE memberikan gambaran kesalahan internal model, sedangkan MSE, RMSE, MAE, dan \(R^2\) pada data testing memberikan gambaran performa terhadap pengamatan yang tidak digunakan dalam pelatihan.

Residual plot digunakan untuk melengkapi evaluasi dengan memperlihatkan pola kesalahan prediksi. Sementara itu, variable importance memberikan informasi mengenai kontribusi relatif variabel prediktor pada model terbaik.

Kesimpulan numerik harus mengikuti hasil aktual pada tabel dan grafik. Model yang terbaik pada satu pembagian data belum tentu selalu terbaik apabila pembagian data berubah.

BAB V KESIMPULAN DAN SARAN

5.1 Kesimpulan

Random Forest Regression diterapkan pada dataset Friedman No. 1 dengan 200 pengamatan dan 10 variabel prediktor. Data dibagi menjadi 70% data training dan 30% data testing, kemudian digunakan untuk membangun sembilan kombinasi model dengan mtry sebesar 2, 3, dan 5 serta jumlah pohon sebanyak 200, 500, dan 1000.

Evaluasi performa dilakukan menggunakan MSE, RMSE, MAE, dan \(R^2\) pada data testing. OOB MSE digunakan sebagai evaluasi internal model, sedangkan residual plot dan variable importance digunakan untuk melengkapi interpretasi hasil.

Model terbaik ditentukan berdasarkan RMSE testing terendah. Nama model dan hasil evaluasinya ditampilkan pada Tabel 4.5. Kesimpulan akhir mengenai kombinasi parameter terbaik mengikuti hasil komputasi aktual yang diperoleh ketika dokumen dijalankan.

5.2 Saran

Penelitian berikutnya dapat menggunakan validasi silang atau beberapa pengulangan pembagian data untuk menilai kestabilan performa model. Rentang nilai mtry, jumlah pohon, dan min.node.size juga dapat diperluas untuk mengeksplorasi kombinasi parameter lainnya.

Perbandingan dengan metode regresi lain juga dapat dilakukan untuk mengetahui performa relatif Random Forest. Selain itu, analisis residual dan variable importance dapat digunakan bersama evaluasi numerik agar pemilihan model tidak hanya didasarkan pada satu metrik.

DAFTAR PUSTAKA

Breiman, L. (2001). Random forests. Machine Learning, 45, 5–32.

Friedman, J. H. (1991). Multivariate adaptive regression splines. The Annals of Statistics, 19(1), 1–67.

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

Wright, M. N., & Ziegler, A. (2017). ranger: A fast implementation of random forests for high dimensional data in C++ and R. Journal of Statistical Software, 77(1), 1–17.

R Core Team. (2026). R: A language and environment for statistical computing. R Foundation for Statistical Computing.

LAMPIRAN

Kode program tersedia pada setiap bagian kode dalam laporan ini. Jalankan dokumen menggunakan tombol Knit di RStudio untuk menghasilkan laporan HTML yang memuat tabel data, rancangan model, hasil evaluasi, grafik perbandingan metrik, OOB MSE, residual plot, dan variable importance berdasarkan hasil perhitungan aktual.