BAB I PENDAHULUAN

1.1 Latar Belakang

   Random Forest merupakan metode ensemble learning yang menggabungkan sejumlah pohon keputusan untuk menghasilkan prediksi yang lebih stabil. Metode ini memiliki kemampuan dalam menangani hubungan nonlinier serta interaksi antarvariabel tanpa memerlukan asumsi distribusi tertentu terhadap variabel prediktor. Fleksibilitas tersebut menjadikan Random Forest dapat diterapkan pada berbagai permasalahan analisis data yang memiliki karakteristik kompleks (Hu & Szymczak, 2023).
   Salah satu pengembangan dari metode Random Forest adalah Double Random Forest (DRF). Metode ini dikembangkan untuk mengatasi keterbatasan Random Forest, terutama ketika model mengalami underfitting. Khairunnisa et al. (2024)  dalam penelitian berjudul A Comparative Study of Random Forest and Double Random Forest Models from View Points of Their Interpretability membandingkan kedua metode berdasarkan aspek interpretabilitas. Penelitian tersebut menggunakan teknik association rules untuk menjelaskan pola yang dihasilkan oleh model. Hasil penelitian menunjukkan bahwa interpretabilitas Double Random Forest lebih baik dibandingkan Random Forest, khususnya ketika digunakan pada kondisi data yang menghasilkan model underfitting. Hal ini menunjukkan bahwa Double Random Forest dapat menjadi alternatif pengembangan Random Forest dalam meningkatkan kemampuan model untuk mengenali pola data.
   Random Forest dan Double Random Forest merupakan metode berbasis pohon keputusan yang dapat digunakan untuk membangun model prediksi. Random Forest memiliki kemampuan dalam menangani hubungan antarvariabel yang kompleks, sedangkan Double Random Forest dikembangkan untuk mengatasi kondisi underfitting yang dapat terjadi pada Random Forest. Meskipun demikian, peningkatan kinerja Double Random Forest tidak selalu terjadi pada setiap karakteristik data. Oleh karena itu, diperlukan penelitian lebih lanjut untuk membandingkan kedua metode tersebut berdasarkan karakteristik data dan ukuran evaluasi yang digunakan sehingga dapat diketahui metode yang memberikan hasil prediksi lebih baik

1.2 Rumusan Masalah

 1. Bagaimana konsep Random Forest dan Double Random Forest sebagai metode ensemble berbasis decision tree.?
 2. Bagaimana cara mengimplementasikan Random Forest untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi?
 3. Bagaimana cara mengevaluasi performa model, memahami Out-of-Bag (OOB) error, dan membandingkan Random Forest dengan Double Random Forest?

1.3 Tujuan Penelitian

 1. Mahasiswa mampu memahami Random Forest dan Double Random Forest sebagai metode ensemble berbasis decision tree.
 2. Mahasiswa mampu mengimplementasikan Random Forest untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi.
 3. Mahasiswa mampu mengevaluasi performa model, memahami Out-of-Bag (OOB) error, dan membandingkan Random Forest dengan Double Random Forest

1.4 Batasan Masalah

   Adapun batasan masalah pada penelitian ini yaitu lakukan Random Forest Regression pada data Friedman. Bandingkan mtry = 2, 3, dan 5 dengan num.trees = 200, 500, dan 1000. Bandingkan performa data testing berdasarkan MSE, RMSE, MAE, R2, residual plot, dan variable importance. Tampilkan pula OOB MSE sebagai evaluasi internal model!

BAB II TINJAUAN PUSTAKA

2.1 Random Forest

  Random Forest merupakan salah satu metode dalam pembelajaran mesin (machine learning) yang termasuk ke dalam teknik ensemble learning. Metode ini menggabungkan sejumlah pohon keputusan (decision tree) untuk menghasilkan suatu model prediksi. Setiap pohon dibentuk melalui proses pengambilan sampel secara acak dan pemilihan sebagian variabel prediktor sehingga menghasilkan pohon-pohon dengan karakteristik yang berbeda. Penggabungan hasil prediksi dari seluruh pohon bertujuan meningkatkan kestabilan model dan mengurangi risiko kesalahan prediksi yang dihasilkan oleh satu pohon keputusan(Hu & Szymczak, 2023).
  Misalkan tersedia data latih akan dibentuk sebanyak B pohon keputusan (tree). Secara sederhana, proses pembentukan Random Forest dilakukan melalui tahapan berikut (Fransiska, 2026):
    1. Mengambil sampel bootstrap dari data latih untuk membentuk data bagi pohon ke-b.
  2. Pada setiap simpul (node), memilih sebanyak mtry prediktor secara acak dari seluruh p prediktor.
  3. Menentukan pemisahan terbaik (best split) berdasarkan prediktor yang terpilih.
  4. Menumbuhkan pohon keputusan hingga memenuhi aturan penghentian, misalnya ukuran minimum simpul (minimum node size).
  5. Mengulangi proses tersebut hingga diperoleh sebanyak B pohon, kemudian menggabungkan seluruh hasil prediksi pohon.
     Untuk kasus klasifikasi, hasil akhir diperoleh melalui suara terbanyak (majority voting), yang dirumuskan sebagai berikut:

\[ \hat{G}_{RF}(x) = \operatorname{mode}\{G_1(x), G_2(x), \ldots, G_B(x)\} \]

 Untuk kasus regresi, hasil akhir diperoleh dengan merata-ratakan prediksi seluruh pohon, yang dirumuskan sebagai berikut:

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

 Dengan demikian, Random Forest tetap merupakan metode parallel ensemble, dengan setiap tree dapat dibentuk secara relatif independen, berbeda dari Boosting yang bersifat sequential.

2.2 Double Random Forest

   Double Random Forest (DRF) merupakan pengembangan dari metode Random Forest yang bertujuan mengatasi keterbatasan model Random Forest, khususnya kondisi underfitting. Kondisi underfitting terjadi ketika model tidak mampu mempelajari pola data secara memadai sehingga hubungan antara variabel prediktor dan variabel respons belum dapat direpresentasikan dengan baik. DRF menggunakan mekanisme pembentukan pohon keputusan yang berbeda dari Random Forest, terutama pada proses pengambilan sampel untuk menentukan pemisahan pada setiap simpul (node). Dalam DRF, seluruh data pelatihan digunakan dalam pembentukan pohon, sedangkan pengacakan dilakukan pada setiap simpul untuk menentukan pemisahan data. Mekanisme tersebut memungkinkan terbentuknya pohon yang lebih besar dibandingkan Random Forest pada kondisi tertentu (Purwanto et al., 2025):
   Secara sederhana, proses Double Random Forest dilakukan sebagai berikut (Fransiska, 2026):
   1. Memulai setiap tree dengan seluruh data training, bukan satu bootstrap sample untuk seluruh tree.
   2.   Pada node yang sedang diproses, mengambil bootstrap sample dari observasi yang mencapai node tersebut. 
   3.   Memilih mtry prediktor secara acak dan mencari split terbaik menggunakan bootstrap sample pada node. 
   4.   Setelah split terbaik ditemukan, bootstrap sample tidak diteruskan. Split tersebut diterapkan kembali pada data asli yang mencapai node, kemudian observasi asli dikirim ke child nodes. 
   5.   Mengulangi proses pada node berikutnya sampai aturan penghentian tercapai, lalu mengulangi untuk seluruh tree. 
   6.   Menggabungkan prediksi seluruh tree. Pada klasifikasi, hasil akhir diperoleh melalui majority voting, sedangkan pada regresi prediksi akhir diperoleh dengan merata ratakan prediksi seluruh tree

2.3 Out-of-Bag (OOB) Error

   Pada proses bootstrap sampling, sampel berukuran n diambil dengan pengembalian (with replacement) dari n observasi data latih. Akibatnya, beberapa observasi dapat terambil lebih dari satu kali, sedangkan sebagian observasi lainnya tidak terambil sama sekali. Secara rata-rata, proporsi observasi unik yang masuk ke dalam satu sampel bootstrap mendekati 63,2%, yang diperoleh dari perhitungan dari rumus berikut:

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

  Dengan demikian, sekitar 36,8% observasi tidak digunakan dalam pembentukan pohon tertentu. Observasi yang tidak terambil tersebut disebut Out-of-Bag (OOB) observations (Fransiska, 2026).

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

   Jenis data yang digunakan dalam penelitian ini adalah data kuantitatif, yaitu data berbentuk angka yang dapat diolah dan dianalisis secara statistik. Data yang digunakan merupakan data simulasi yang dibangkitkan menggunakan fungsi mlbench.friedman1() dari package mlbench dalam perangkat lunak R. Dataset ini terdiri atas variabel respons (Y) dan sejumlah variabel prediktor (X) yang digunakan untuk membangun model prediksi regresi menggunakan metode Gradient Boosting.

3.2 Variabel Penelitian

   Variabel yang digunakan dalam penelitian ini terdiri atas satu variabel respons dan beberapa variabel prediktor. Variabel respons yang digunakan adalah (Y), sedangkan variabel prediktor terdiri atas (X1, X2, ..., X10). Variabel-variabel tersebut digunakan untuk membentuk model regresi Gradient Boosting dalam memprediksi nilai variabel respons berdasarkan informasi dari variabel prediktor.

3.3 Analisis Data

   Berikut adalah algoritma untuk menyelesaiankan batasan masalah:
   1. Memanggil package yang diperlukan, yaitu ranger, mlbench, dan caret.
   2. Membangkitkan dataset menggunakan fungsi mlbench.friedman1() dengan jumlah pengamatan sebanyak 200.
   3. Memeriksa struktur, ringkasan, dan ukuran dataset serta memastikan tidak terdapat nilai hilang (missing value).
   4. Membagi data menjadi data training sebesar 70% dan data testing sebesar 30% menggunakan fungsi createDataPartition(). Penetapan seed dilakukan agar pembagian data dapat direproduksi.
   5. Menentukan kombinasi parameter yang akan dibandingkan, yaitu jumlah variabel prediktor yang dipilih secara acak pada setiap node (mtry) sebesar 2, 3, dan 5 serta jumlah pohon (num.trees) sebanyak 200, 500, dan 1.000.
   6. Membangun sembilan model Random Forest Regression menggunakan fungsi ranger() berdasarkan seluruh kombinasi parameter yang telah ditentukan, dengan min.node.size sebesar 5, replace = TRUE, sample.fraction = 1, dan permutation importance untuk mengukur kepentingan variabel.
   7. Menghitung nilai Out-of-Bag Mean Squared Error (OOB MSE) dan OOB R² sebagai evaluasi internal untuk masing-masing model.
   8. Melakukan prediksi terhadap data testing menggunakan masing-masing model yang telah dibangun.
   9. Menghitung nilai Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (R²) untuk mengevaluasi kinerja setiap model pada data testing.
   10. Membandingkan hasil evaluasi kesembilan model berdasarkan nilai MSE, RMSE, MAE, dan R². Model dengan nilai galat yang lebih kecil dan nilai R² yang lebih tinggi menunjukkan kinerja prediksi yang lebih baik.
   11. Menentukan model terbaik berdasarkan nilai MSE terkecil pada data testing.
   12. Menggunakan model terbaik untuk memperoleh hasil prediksi dan residual pada data testing.
   13.  Memvisualisasikan perbandingan nilai aktual dan prediksi serta membuat residual plot untuk seluruh model guna melihat pola kesalahan prediksi.
   14. Mengidentifikasi tingkat kepentingan variabel prediktor (variable importance) menggunakan metode permutation importance untuk mengetahui kontribusi masing-masing variabel dalam setiap model.
   15. Menyajikan perbandingan hasil OOB MSE, OOB R², dan evaluasi data testing serta menarik kesimpulan berdasarkan hasil pemodelan Random Forest Regression.
   16. Selesai.
   

BAB IV HASIL DAN PEMBAHASAN

4.1 MEMBENTUK LIBRARY DAN DATASET

library(mlbench)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(ranger)
set.seed(234)
reg.data <- as.data.frame(mlbench.friedman1(200))

# Melihat struktur, ringkasan, dan dimensi data
str(reg.data)
## 'data.frame':    200 obs. of  11 variables:
##  $ x.1 : num  0.7456 0.7817 0.02 0.7761 0.0669 ...
##  $ x.2 : num  0.575 0.316 0.765 0.229 0.172 ...
##  $ x.3 : num  0.0289 0.9375 0.7978 0.668 0.5974 ...
##  $ x.4 : num  0.72 0.185 0.534 0.553 0.755 ...
##  $ x.5 : num  0.875 0.704 0.952 0.478 0.533 ...
##  $ x.6 : num  0.276 0.643 0.987 0.843 0.733 ...
##  $ x.7 : num  0.9332 0.4018 0.0874 0.893 0.1024 ...
##  $ x.8 : num  0.60746 0.00369 0.0106 0.44639 0.83494 ...
##  $ x.9 : num  0.756 0.405 0.247 0.144 0.187 ...
##  $ x.10: num  0.718 0.534 0.667 0.68 0.595 ...
##  $ y   : num  24.35 18.05 12.02 12.1 9.91 ...
summary(reg.data)
##       x.1                x.2                x.3               x.4         
##  Min.   :0.001198   Min.   :0.004583   Min.   :0.01021   Min.   :0.00707  
##  1st Qu.:0.274097   1st Qu.:0.255644   1st Qu.:0.24506   1st Qu.:0.20772  
##  Median :0.541847   Median :0.436813   Median :0.48965   Median :0.50295  
##  Mean   :0.509759   Mean   :0.465323   Mean   :0.48570   Mean   :0.48821  
##  3rd Qu.:0.741416   3rd Qu.:0.651439   3rd Qu.:0.73476   3rd Qu.:0.76599  
##  Max.   :0.993590   Max.   :0.999850   Max.   :0.99985   Max.   :0.99761  
##       x.5                x.6                x.7                x.8          
##  Min.   :0.008246   Min.   :0.005504   Min.   :0.001884   Min.   :0.002496  
##  1st Qu.:0.267523   1st Qu.:0.194431   1st Qu.:0.226788   1st Qu.:0.249826  
##  Median :0.522081   Median :0.446060   Median :0.491332   Median :0.480306  
##  Mean   :0.503282   Mean   :0.468544   Mean   :0.503754   Mean   :0.482050  
##  3rd Qu.:0.751688   3rd Qu.:0.746035   3rd Qu.:0.780325   3rd Qu.:0.696675  
##  Max.   :0.994604   Max.   :0.999021   Max.   :0.993044   Max.   :0.995613  
##       x.9                x.10                y         
##  Min.   :0.004483   Min.   :0.005544   Min.   : 3.082  
##  1st Qu.:0.203254   1st Qu.:0.329160   1st Qu.:10.593  
##  Median :0.453476   Median :0.592614   Median :13.810  
##  Mean   :0.471873   Mean   :0.540708   Mean   :14.270  
##  3rd Qu.:0.742412   3rd Qu.:0.765353   3rd Qu.:18.063  
##  Max.   :0.997436   Max.   :0.998141   Max.   :26.146
dim(reg.data)
## [1] 200  11

Intepretasi Hasil 4.1

data yang digunakan merupakan data simulasi Friedman1 dari package mlbench yang terdiri atas 200 observasi dan 11 variabel, yaitu 10 variabel prediktor (X1 sampai X10) dan 1 variabel respons (Y). Hasil str() menunjukkan bahwa seluruh variabel bertipe numerik (numeric), sehingga dapat digunakan dalam analisis regresi. Berdasarkan hasil summary(), variabel prediktor memiliki nilai minimum yang mendekati 0 dan maksimum yang mendekati 1, sedangkan variabel respons (Y) memiliki nilai minimum sebesar 3,082, maksimum 26,146, rata-rata 14,270, dan median 13,810. Selanjutnya, fungsi dim() menunjukkan bahwa data memiliki 200 baris dan 11 kolom. Dengan demikian, data tersebut dapat digunakan untuk membangun model regresi menggunakan metode Random Forest dengan variabel Y sebagai variabel respons dan X1 sampai X10 sebagai variabel prediktor.

4.2 MEMBAGI DATA TRAINING DAN TESTING

set.seed(234)
idx.reg <- createDataPartition(
  reg.data$y,
  p = 0.70,
  list = FALSE
)

reg.train <- reg.data[idx.reg, ]
reg.test  <- reg.data[-idx.reg, ]

# Melihat dimensi data
dim(reg.train)
## [1] 140  11
dim(reg.test)
## [1] 60 11

Intepretasi hasil 4.2

Berdasarkan hasil pembagian data, diperoleh data training sebanyak 140 observasi dengan 11 variabel dan data testing sebanyak 60 observasi dengan 11 variabel. Pembagian tersebut menunjukkan bahwa 70% dari total data digunakan untuk membangun model Gradient Boosting, sedangkan 30% sisanya digunakan untuk menguji kinerja model dalam memprediksi data yang belum digunakan pada proses pelatihan. Dengan demikian, pembagian data ini memungkinkan model dibangun menggunakan data training dan dievaluasi menggunakan data testing secara terpisah.

4.3 MEMBENTUK MODEL RANDOM FOREST DAN MODE TERBAIK

# Menentukan kombinasi parameter
kombinasi <- expand.grid(
  mtry = c(2, 3, 5),
  num.trees = c(200, 500, 1000)
)

# Menyiapkan penyimpanan model dan hasil evaluasi
model.rf <- list()
hasil.evaluasi <- data.frame()

# Membentuk model berdasarkan seluruh kombinasi parameter
for (i in 1:nrow(kombinasi)) {
  
  m <- kombinasi$mtry[i]
  nt <- kombinasi$num.trees[i]
  
  set.seed(234)
  model <- ranger(
    y ~ .,
    data = reg.train,
    num.trees = nt,
    mtry = m,
    min.node.size = 5,
    replace = TRUE,
    sample.fraction = 1,
    importance = "permutation",
    seed = 234
  )
  
  # Menyimpan model
  nama.model <- paste0("RF_mtry", m, "_tree", nt)
  model.rf[[nama.model]] <- model
  
  # Prediksi data testing
  prediksi <- predict(
    model,
    data = reg.test
  )$predictions
  
  aktual <- reg.test$y
  
  # Menghitung evaluasi data testing
  MSE <- mean((aktual - prediksi)^2)
  RMSE <- sqrt(MSE)
  MAE <- mean(abs(aktual - prediksi))
  R2 <- 1 - sum((aktual - prediksi)^2) /
    sum((aktual - mean(aktual))^2)
  
  # Menyimpan hasil evaluasi dan OOB
  hasil.evaluasi <- rbind(
    hasil.evaluasi,
    data.frame(
      Model = nama.model,
      mtry = m,
      num.trees = nt,
      OOB_MSE = model$prediction.error,
      OOB_R2 = model$r.squared,
      MSE = MSE,
      RMSE = RMSE,
      MAE = MAE,
      R2 = R2
    )
  )
}

# Menampilkan hasil evaluasi seluruh model
hasil.evaluasi[, -1] <- round(
  hasil.evaluasi[, -1],
  4
)

hasil.evaluasi
##               Model mtry num.trees OOB_MSE OOB_R2    MSE   RMSE    MAE     R2
## 1  RF_mtry2_tree200    2       200  8.2222 0.6905 7.8700 2.8054 2.3414 0.6717
## 2  RF_mtry3_tree200    3       200  7.7097 0.7097 7.8139 2.7953 2.2981 0.6740
## 3  RF_mtry5_tree200    5       200  7.0632 0.7341 7.6596 2.7676 2.2726 0.6805
## 4  RF_mtry2_tree500    2       500  8.1267 0.6940 8.1774 2.8596 2.3832 0.6589
## 5  RF_mtry3_tree500    3       500  7.4424 0.7198 7.8278 2.7978 2.3058 0.6734
## 6  RF_mtry5_tree500    5       500  6.8750 0.7412 7.3826 2.7171 2.2312 0.6920
## 7 RF_mtry2_tree1000    2      1000  8.0553 0.6967 8.1181 2.8492 2.3794 0.6613
## 8 RF_mtry3_tree1000    3      1000  7.3547 0.7231 7.7780 2.7889 2.2996 0.6755
## 9 RF_mtry5_tree1000    5      1000  6.8260 0.7430 7.1925 2.6819 2.2054 0.6999
# Mengurutkan model berdasarkan MSE terkecil
hasil.urut <- hasil.evaluasi[
  order(hasil.evaluasi$MSE),
]

hasil.urut
##               Model mtry num.trees OOB_MSE OOB_R2    MSE   RMSE    MAE     R2
## 9 RF_mtry5_tree1000    5      1000  6.8260 0.7430 7.1925 2.6819 2.2054 0.6999
## 6  RF_mtry5_tree500    5       500  6.8750 0.7412 7.3826 2.7171 2.2312 0.6920
## 3  RF_mtry5_tree200    5       200  7.0632 0.7341 7.6596 2.7676 2.2726 0.6805
## 8 RF_mtry3_tree1000    3      1000  7.3547 0.7231 7.7780 2.7889 2.2996 0.6755
## 2  RF_mtry3_tree200    3       200  7.7097 0.7097 7.8139 2.7953 2.2981 0.6740
## 5  RF_mtry3_tree500    3       500  7.4424 0.7198 7.8278 2.7978 2.3058 0.6734
## 1  RF_mtry2_tree200    2       200  8.2222 0.6905 7.8700 2.8054 2.3414 0.6717
## 7 RF_mtry2_tree1000    2      1000  8.0553 0.6967 8.1181 2.8492 2.3794 0.6613
## 4  RF_mtry2_tree500    2       500  8.1267 0.6940 8.1774 2.8596 2.3832 0.6589
# Mengambil model terbaik
model.terbaik <- hasil.urut[1, ]
model.terbaik
##               Model mtry num.trees OOB_MSE OOB_R2    MSE   RMSE    MAE     R2
## 9 RF_mtry5_tree1000    5      1000   6.826  0.743 7.1925 2.6819 2.2054 0.6999
# Mengambil objek model terbaik
nama.terbaik <- as.character(model.terbaik$Model)
rf.terbaik <- model.rf[[nama.terbaik]]

Intepretasi Hasil 4.3

Berdasarkan hasil perbandingan sembilan model Random Forest dengan variasi parameter mtry sebesar 2, 3, dan 5 serta num.trees sebesar 200, 500, dan 1.000, terlihat bahwa peningkatan nilai mtry cenderung menurunkan nilai OOB_MSE dan meningkatkan OOB_R2. Model terbaik diperoleh pada kombinasi mtry = 5 dan num.trees = 1.000, dengan nilai OOB_MSE sebesar 6,8260 dan OOB_R2 sebesar 0,7430. Selain itu, model tersebut menghasilkan nilai MSE sebesar 7,1925 dan RMSE sebesar 2,6819, yang merupakan nilai terendah dibandingkan model lainnya. Hal ini menunjukkan bahwa model dengan kombinasi parameter tersebut memiliki kinerja prediksi terbaik di antara sembilan model yang diuji karena menghasilkan kesalahan prediksi paling kecil dan kemampuan menjelaskan variasi data respons sebesar 74,30%.

#Intepretasi

4.4 PREDIKSI DATA TESTING MODEL TERBAIK

pred.rf <- predict(
  rf.terbaik,
  data = reg.test
)$predictions

actual.reg <- reg.test$y

# Menyusun hasil prediksi
hasil.prediksi <- data.frame(
  Aktual = actual.reg,
  Prediksi = pred.rf,
  Residual = actual.reg - pred.rf
)

# Menampilkan 10 hasil prediksi pertama
head(hasil.prediksi, 10)
##       Aktual Prediksi  Residual
## 1  10.232309 12.54560 -2.313287
## 2  11.845301 10.28195  1.563355
## 3  10.335689 12.78220 -2.446509
## 4  16.727262 13.72361  3.003650
## 5  25.077119 20.44406  4.633058
## 6  15.446886 14.44204  1.004842
## 7  15.642915 12.79740  2.845519
## 8   7.110835 12.57824 -5.467401
## 9  13.351277 15.52667 -2.175391
## 10 12.871960 14.88958 -2.017625

Intepretasi Hasil 4.4

Berdasarkan tabel perbandingan nilai aktual, prediksi, dan residual pada 10 observasi, terlihat bahwa hasil prediksi model Random Forest memiliki nilai yang cukup mendekati nilai aktual, meskipun masih terdapat beberapa perbedaan. Residual diperoleh dari selisih antara nilai aktual dan nilai prediksi. Residual positif menunjukkan bahwa nilai aktual lebih besar daripada nilai prediksi, sedangkan residual negatif menunjukkan bahwa nilai prediksi lebih besar daripada nilai aktual. Pada tabel tersebut, residual terbesar terdapat pada observasi ke-5 sebesar 4,633058, sedangkan residual terkecil terdapat pada observasi ke-6 sebesar 1,004842 secara absolut. Sementara itu, residual terbesar secara negatif terdapat pada observasi ke-8 sebesar -5,467401. Hal ini menunjukkan bahwa tingkat kesalahan prediksi berbeda pada setiap observasi, tetapi secara umum model mampu menghasilkan prediksi yang cukup mendekati nilai aktual.

4.5 PLOT AKTUAL DAN PREDIKSI MODEL TERBAIK

plot(
  actual.reg,
  pred.rf,
  pch = 19,
  xlab = "Nilai Aktual",
  ylab = "Nilai Prediksi",
  main = paste("Aktual vs Prediksi:", nama.terbaik)
)

abline(
  a = 0,
  b = 1,
  lty = 2,
  lwd = 2
)

Intepretasi Hasil 4.5

Berdasarkan grafik aktual vs prediksi model Random Forest dengan kombinasi parameter mtry = 5 dan num.trees = 1.000, terlihat bahwa sebagian besar titik pengamatan berada cukup dekat dengan garis diagonal putus-putus yang menunjukkan kondisi prediksi ideal, yaitu ketika nilai prediksi sama dengan nilai aktual. Hal ini menunjukkan bahwa model mampu memprediksi nilai respons dengan cukup baik. Meskipun demikian, masih terdapat beberapa titik yang berada cukup jauh dari garis diagonal, terutama pada nilai aktual sekitar 15–20, yang menunjukkan adanya perbedaan antara nilai aktual dan hasil prediksi. Secara keseluruhan, pola sebaran titik menunjukkan bahwa nilai prediksi cenderung mengikuti pola nilai aktual, sehingga model Random Forest memiliki kemampuan yang cukup baik dalam menggambarkan hubungan antara variabel prediktor dan variabel respons.

4.6 RESIDUAL PLOT SELURUH MODEL

par(mfrow = c(3, 3))

for (i in 1:length(model.rf)) {
  
  # Prediksi data testing
  prediksi <- predict(
    model.rf[[i]],
    data = reg.test
  )$predictions
  
  # Menghitung residual
  residual <- reg.test$y - prediksi
  
  # Membuat residual plot
  plot(
    prediksi,
    residual,
    pch = 19,
    xlab = "Nilai Prediksi",
    ylab = "Residual",
    main = names(model.rf)[i]
  )
  
  abline(
    h = 0,
    lty = 2,
    lwd = 2
  )
}

par(mfrow = c(1, 1))

Intepretasi Hasil 4.6

Berdasarkan grafik diagnostik residual dari sembilan model Random Forest dengan variasi parameter mtry dan num.trees, terlihat bahwa sebagian besar titik residual tersebar di sekitar garis horizontal nol tanpa membentuk pola tertentu. Hal ini menunjukkan bahwa residual cenderung menyebar secara acak terhadap nilai prediksi, sehingga tidak terlihat adanya pola sistematis yang kuat pada kesalahan prediksi. Selain itu, pola penyebaran residual pada setiap model relatif serupa, baik dengan jumlah pohon 200, 500, maupun 1.000. Meskipun demikian, masih terdapat beberapa titik residual yang menyimpang dari garis nol. Secara keseluruhan, grafik menunjukkan bahwa kesalahan prediksi pada model relatif tersebar secara acak dan tidak menunjukkan pola tertentu, sehingga model Random Forest dapat dikatakan mampu menangkap pola hubungan antara variabel prediktor dan variabel respons dengan cukup baik.

4.7 PERBANDINGAN OOB MSE

hasil.oob <- hasil.evaluasi[
  ,
  c("Model", "mtry", "num.trees", "OOB_MSE", "OOB_R2", "MSE")
]

hasil.oob
##               Model mtry num.trees OOB_MSE OOB_R2    MSE
## 1  RF_mtry2_tree200    2       200  8.2222 0.6905 7.8700
## 2  RF_mtry3_tree200    3       200  7.7097 0.7097 7.8139
## 3  RF_mtry5_tree200    5       200  7.0632 0.7341 7.6596
## 4  RF_mtry2_tree500    2       500  8.1267 0.6940 8.1774
## 5  RF_mtry3_tree500    3       500  7.4424 0.7198 7.8278
## 6  RF_mtry5_tree500    5       500  6.8750 0.7412 7.3826
## 7 RF_mtry2_tree1000    2      1000  8.0553 0.6967 8.1181
## 8 RF_mtry3_tree1000    3      1000  7.3547 0.7231 7.7780
## 9 RF_mtry5_tree1000    5      1000  6.8260 0.7430 7.1925

Intepretasi Hasil 4.7

Berdasarkan tabel perbandingan sembilan model Random Forest, diketahui bahwa setiap model memiliki kinerja yang berbeda berdasarkan variasi parameter mtry dan num.trees. Model dengan kombinasi mtry = 5 dan num.trees = 1.000 menghasilkan kinerja terbaik dengan nilai OOB_MSE sebesar 6,8260, OOB_R2 sebesar 0,7430, dan MSE sebesar 7,1925. Nilai OOB_MSE dan MSE yang paling rendah menunjukkan bahwa model tersebut memiliki tingkat kesalahan prediksi paling kecil dibandingkan model lainnya, sedangkan nilai OOB_R2 sebesar 0,7430 menunjukkan bahwa model mampu menjelaskan 74,30% variasi pada variabel respons. Dengan demikian, model RF_mtry5_tree1000 dipilih sebagai model Random Forest terbaik karena menghasilkan nilai kesalahan prediksi terendah dan kemampuan penjelasan variasi data tertinggi di antara sembilan model yang dibandingkan.

4.8 VARIABLE IMPORTANCE SELURUH MODEL

importance.rf <- data.frame()

for (i in 1:length(model.rf)) {
  
  # Mengambil nilai variable importance
  nilai.importance <- model.rf[[i]]$variable.importance
  
  # Menyusun hasil variable importance
  temp <- data.frame(
    Model = names(model.rf)[i],
    Variabel = names(nilai.importance),
    Importance = as.numeric(nilai.importance)
  )
  
  importance.rf <- rbind(
    importance.rf,
    temp
  )
}

# Menampilkan hasil variable importance
importance.rf
##                Model Variabel   Importance
## 1   RF_mtry2_tree200      x.1  7.056402842
## 2   RF_mtry2_tree200      x.2  4.103479945
## 3   RF_mtry2_tree200      x.3  2.630648488
## 4   RF_mtry2_tree200      x.4 10.300689487
## 5   RF_mtry2_tree200      x.5  1.497595283
## 6   RF_mtry2_tree200      x.6  0.243901550
## 7   RF_mtry2_tree200      x.7 -0.168485417
## 8   RF_mtry2_tree200      x.8  0.016045797
## 9   RF_mtry2_tree200      x.9 -0.226556931
## 10  RF_mtry2_tree200     x.10  0.238938308
## 11  RF_mtry3_tree200      x.1  7.961441583
## 12  RF_mtry3_tree200      x.2  3.457770950
## 13  RF_mtry3_tree200      x.3  1.799914151
## 14  RF_mtry3_tree200      x.4 10.936625336
## 15  RF_mtry3_tree200      x.5  0.801224075
## 16  RF_mtry3_tree200      x.6 -0.142122996
## 17  RF_mtry3_tree200      x.7 -0.291552239
## 18  RF_mtry3_tree200      x.8  0.055217155
## 19  RF_mtry3_tree200      x.9 -0.115099299
## 20  RF_mtry3_tree200     x.10  0.120569021
## 21  RF_mtry5_tree200      x.1  9.434048063
## 22  RF_mtry5_tree200      x.2  3.255413296
## 23  RF_mtry5_tree200      x.3  1.663861471
## 24  RF_mtry5_tree200      x.4 12.328727376
## 25  RF_mtry5_tree200      x.5  0.882374511
## 26  RF_mtry5_tree200      x.6  0.223386219
## 27  RF_mtry5_tree200      x.7 -0.124867790
## 28  RF_mtry5_tree200      x.8  0.112827321
## 29  RF_mtry5_tree200      x.9 -0.102671921
## 30  RF_mtry5_tree200     x.10 -0.102819997
## 31  RF_mtry2_tree500      x.1  7.281171058
## 32  RF_mtry2_tree500      x.2  3.978849876
## 33  RF_mtry2_tree500      x.3  2.703048247
## 34  RF_mtry2_tree500      x.4  9.589757633
## 35  RF_mtry2_tree500      x.5  1.315871833
## 36  RF_mtry2_tree500      x.6  0.087094427
## 37  RF_mtry2_tree500      x.7 -0.225811480
## 38  RF_mtry2_tree500      x.8 -0.080118231
## 39  RF_mtry2_tree500      x.9  0.035186132
## 40  RF_mtry2_tree500     x.10  0.288219756
## 41  RF_mtry3_tree500      x.1  8.171805449
## 42  RF_mtry3_tree500      x.2  3.556322153
## 43  RF_mtry3_tree500      x.3  2.233852516
## 44  RF_mtry3_tree500      x.4 11.013712844
## 45  RF_mtry3_tree500      x.5  1.012069618
## 46  RF_mtry3_tree500      x.6 -0.132610434
## 47  RF_mtry3_tree500      x.7 -0.166863098
## 48  RF_mtry3_tree500      x.8 -0.101421845
## 49  RF_mtry3_tree500      x.9 -0.036803366
## 50  RF_mtry3_tree500     x.10  0.153295624
## 51  RF_mtry5_tree500      x.1  9.211047217
## 52  RF_mtry5_tree500      x.2  3.436769442
## 53  RF_mtry5_tree500      x.3  1.740485054
## 54  RF_mtry5_tree500      x.4 12.742513925
## 55  RF_mtry5_tree500      x.5  0.882063578
## 56  RF_mtry5_tree500      x.6  0.143975996
## 57  RF_mtry5_tree500      x.7 -0.164765218
## 58  RF_mtry5_tree500      x.8 -0.033853940
## 59  RF_mtry5_tree500      x.9 -0.076846602
## 60  RF_mtry5_tree500     x.10  0.032523216
## 61 RF_mtry2_tree1000      x.1  7.327525783
## 62 RF_mtry2_tree1000      x.2  3.826732204
## 63 RF_mtry2_tree1000      x.3  2.576426409
## 64 RF_mtry2_tree1000      x.4  9.464248061
## 65 RF_mtry2_tree1000      x.5  1.228531540
## 66 RF_mtry2_tree1000      x.6 -0.050256445
## 67 RF_mtry2_tree1000      x.7 -0.247929894
## 68 RF_mtry2_tree1000      x.8 -0.191476230
## 69 RF_mtry2_tree1000      x.9  0.026979395
## 70 RF_mtry2_tree1000     x.10  0.059092035
## 71 RF_mtry3_tree1000      x.1  8.183378670
## 72 RF_mtry3_tree1000      x.2  3.577988543
## 73 RF_mtry3_tree1000      x.3  2.283376053
## 74 RF_mtry3_tree1000      x.4 10.981225121
## 75 RF_mtry3_tree1000      x.5  1.093136982
## 76 RF_mtry3_tree1000      x.6 -0.125417507
## 77 RF_mtry3_tree1000      x.7 -0.148611169
## 78 RF_mtry3_tree1000      x.8 -0.109432850
## 79 RF_mtry3_tree1000      x.9 -0.126854670
## 80 RF_mtry3_tree1000     x.10  0.078835375
## 81 RF_mtry5_tree1000      x.1  9.387495698
## 82 RF_mtry5_tree1000      x.2  3.821133252
## 83 RF_mtry5_tree1000      x.3  1.825483548
## 84 RF_mtry5_tree1000      x.4 12.931369548
## 85 RF_mtry5_tree1000      x.5  0.972018449
## 86 RF_mtry5_tree1000      x.6  0.099989113
## 87 RF_mtry5_tree1000      x.7 -0.143027440
## 88 RF_mtry5_tree1000      x.8 -0.009637107
## 89 RF_mtry5_tree1000      x.9 -0.080222740
## 90 RF_mtry5_tree1000     x.10  0.097567088

Intepretasi Hasil 4.8

Berdasarkan hasil perhitungan variable importance pada sembilan model Random Forest, terlihat bahwa variabel X4 secara konsisten memiliki nilai kepentingan tertinggi pada seluruh kombinasi parameter mtry dan num.trees, dengan nilai tertinggi sebesar 12,9314 pada model RF_mtry5_tree1000. Variabel X1 menempati urutan kedua dengan nilai kepentingan yang relatif tinggi, yaitu mencapai 9,4340 pada model RF_mtry5_tree200 dan 9,3875 pada model RF_mtry5_tree1000. Selanjutnya, variabel X2 dan X3 juga memberikan kontribusi terhadap kemampuan prediksi model, meskipun tingkat kepentingannya lebih rendah dibandingkan X1 dan X4. Sementara itu, variabel X5 hingga X10 memiliki nilai kepentingan yang relatif kecil, bahkan beberapa variabel seperti X6, X7, X8, X9, dan X10 menunjukkan nilai negatif pada beberapa model. Hal ini mengindikasikan bahwa variabel X4 dan X1 merupakan variabel yang paling berperan dalam proses prediksi, sedangkan variabel lainnya memberikan kontribusi yang relatif lebih kecil. Secara keseluruhan, pola tingkat kepentingan variabel relatif konsisten pada kesembilan model meskipun terdapat perubahan nilai akibat perbedaan parameter yang digunakan.

4.9 GRAFIK VARIABLE IMPORTANCE SELURUH MODEL

par(mfrow = c(3, 3))

for (i in 1:length(model.rf)) {
  
  # Mengurutkan variable importance
  nilai.importance <- sort(
    model.rf[[i]]$variable.importance,
    decreasing = TRUE
  )
  
  # Membuat grafik
  barplot(
    nilai.importance,
    las = 2,
    main = names(model.rf)[i],
    ylab = "Permutation Importance",
    cex.names = 0.8
  )
}

par(mfrow = c(1, 1))

Intepretasi Hasil 4.9

Berdasarkan grafik Permutation Importance pada sembilan model Random Forest, terlihat bahwa variabel X4 secara konsisten memiliki tingkat kepentingan tertinggi, diikuti oleh variabel X1 dan X2. Hal ini menunjukkan bahwa ketiga variabel tersebut memberikan kontribusi paling besar terhadap kemampuan prediksi model. Selanjutnya, variabel X3 dan X5 memiliki tingkat kepentingan yang lebih rendah, sedangkan variabel X6 hingga X10 cenderung memiliki nilai kepentingan yang sangat kecil. Pola tersebut relatif konsisten pada seluruh kombinasi parameter mtry dan num.trees, baik dengan jumlah pohon 200, 500, maupun 1.000. Dengan demikian, dapat disimpulkan bahwa variabel X4 merupakan variabel yang paling berpengaruh dalam proses prediksi model Random Forest, sedangkan variabel X6 hingga X10 memiliki kontribusi yang relatif kecil terhadap ketepatan prediksi model.

4.10 MENAMPILKAN RINGKASAN PERBANDINGAN MODEL

# Mengurutkan berdasarkan MSE testing terkecil
hasil.akhir <- hasil.evaluasi[
  order(hasil.evaluasi$MSE),
]

hasil.akhir
##               Model mtry num.trees OOB_MSE OOB_R2    MSE   RMSE    MAE     R2
## 9 RF_mtry5_tree1000    5      1000  6.8260 0.7430 7.1925 2.6819 2.2054 0.6999
## 6  RF_mtry5_tree500    5       500  6.8750 0.7412 7.3826 2.7171 2.2312 0.6920
## 3  RF_mtry5_tree200    5       200  7.0632 0.7341 7.6596 2.7676 2.2726 0.6805
## 8 RF_mtry3_tree1000    3      1000  7.3547 0.7231 7.7780 2.7889 2.2996 0.6755
## 2  RF_mtry3_tree200    3       200  7.7097 0.7097 7.8139 2.7953 2.2981 0.6740
## 5  RF_mtry3_tree500    3       500  7.4424 0.7198 7.8278 2.7978 2.3058 0.6734
## 1  RF_mtry2_tree200    2       200  8.2222 0.6905 7.8700 2.8054 2.3414 0.6717
## 7 RF_mtry2_tree1000    2      1000  8.0553 0.6967 8.1181 2.8492 2.3794 0.6613
## 4  RF_mtry2_tree500    2       500  8.1267 0.6940 8.1774 2.8596 2.3832 0.6589

Intepretasi Hasil 4.10

Berdasarkan tabel hasil pemeringkatan sembilan model Random Forest, terlihat bahwa model RF_mtry5_tree1000 menempati peringkat pertama dengan kombinasi parameter mtry = 5 dan num.trees = 1.000. Model tersebut menghasilkan nilai OOB_MSE sebesar 6,8260, OOB_R2 sebesar 0,7430, MSE sebesar 7,1925, dan RMSE sebesar 2,6819. Nilai tersebut menunjukkan bahwa model memiliki tingkat kesalahan prediksi paling rendah serta kemampuan menjelaskan variasi variabel respons sebesar 74,30% dibandingkan model lainnya. Sementara itu, model dengan kombinasi mtry = 2 dan num.trees = 500 menempati peringkat terakhir karena menghasilkan nilai OOB_MSE, MSE, dan RMSE yang relatif paling tinggi serta OOB_R2 yang paling rendah. Dengan demikian, model RF_mtry5_tree1000 dipilih sebagai model terbaik karena memberikan kinerja prediksi paling optimal berdasarkan nilai kesalahan prediksi dan kemampuan penjelasan model.

BAB V KESIMPULAN

5.1 Kesimpulan

   Random Forest dan Double Random Forest merupakan metode ensemble learning berbasis decision tree yang menggabungkan sejumlah pohon keputusan untuk menghasilkan prediksi yang lebih baik dibandingkan penggunaan satu pohon keputusan. Random Forest membangun banyak pohon menggunakan teknik bootstrap sampling terhadap data training. Pada setiap pemisahan node, sejumlah variabel prediktor dipilih secara acak sebagai kandidat pemisah berdasarkan parameter mtry. Hasil prediksi seluruh pohon kemudian digabungkan menggunakan majority voting untuk klasifikasi dan rata-rata untuk regresi. Sementara itu, Double Random Forest (DRF) menerapkan mekanisme pengambilan sampel secara acak pada setiap node dalam proses pembentukan pohon. Sampel bootstrap digunakan untuk menentukan pemisah terbaik, sedangkan observasi asli yang mencapai node tersebut diteruskan ke node berikutnya. Dengan demikian, perbedaan utama kedua metode terletak pada mekanisme bootstrap sampling yang digunakan dalam pembentukan pohon keputusan.
   Implementasi Random Forest dan Double Random Forest untuk klasifikasi dan regresi dilakukan melalui beberapa tahapan, yaitu menyiapkan dataset, membagi data menjadi data training dan testing, membangun model, melakukan prediksi, serta mengevaluasi hasil prediksi. Pada klasifikasi, kedua metode digunakan untuk memprediksi variabel respons kategorik dengan menggabungkan hasil prediksi seluruh pohon berdasarkan suara mayoritas (majority voting). Sementara itu, pada regresi, kedua metode digunakan untuk memprediksi variabel respons numerik dengan menghitung rata-rata hasil prediksi seluruh pohon. Implementasi dapat dilakukan menggunakan bahasa pemrograman R dengan package yang sesuai, seperti ranger untuk Random Forest dan package yang menyediakan algoritma Double Random Forest. Parameter model disesuaikan dengan jenis data dan tujuan pemodelan.
   Evaluasi performa model dilakukan menggunakan ukuran evaluasi yang disesuaikan dengan jenis permasalahan. Pada klasifikasi, evaluasi dapat menggunakan confusion matrix, akurasi, presisi, sensitivitas (recall), F1-score, dan OOB error. Sementara itu, pada regresi dapat menggunakan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (R²). Out-of-Bag (OOB) merupakan observasi yang tidak terpilih dalam proses bootstrap sampling pada pembentukan suatu pohon. Secara rata-rata, sekitar 36,8% observasi tidak masuk ke dalam satu sampel bootstrap sehingga dapat digunakan untuk mengevaluasi prediksi pohon tersebut. Prediksi OOB diperoleh dari kumpulan pohon yang tidak menggunakan observasi bersangkutan dalam proses pembentukannya. Perbandingan Random Forest dan Double Random Forest dilakukan menggunakan dataset, pembagian data training dan testing, serta ukuran evaluasi yang sama. Metode terbaik ditentukan berdasarkan nilai kesalahan prediksi yang lebih kecil, nilai akurasi atau R² yang lebih tinggi, serta mempertimbangkan hasil variable importance dan waktu komputasi. 
   Berdasarkan seluruh hasil analisis, dapat disimpulkan bahwa metode Random Forest mampu membangun model regresi dengan baik pada data simulasi Friedman1 yang terdiri atas 200 observasi, 10 variabel prediktor, dan 1 variabel respons. Dari sembilan kombinasi parameter yang diuji, model terbaik diperoleh pada kombinasi `mtry = 5` dan `num.trees = 1.000` dengan nilai OOB_MSE sebesar 6,8260, OOB_R2 sebesar 0,7430, MSE sebesar 7,1925, dan RMSE sebesar 2,6819. Hasil visualisasi aktual dan prediksi menunjukkan bahwa sebagian besar nilai prediksi mengikuti pola nilai aktual, sedangkan grafik residual memperlihatkan penyebaran yang relatif acak di sekitar garis nol. Berdasarkan analisis variable importance dan Permutation Importance, variabel X4 merupakan variabel yang paling berpengaruh terhadap hasil prediksi, diikuti oleh X1 dan X2, sedangkan variabel lainnya memiliki tingkat kepentingan yang relatif lebih rendah. Dengan demikian, kombinasi parameter tersebut merupakan model Random Forest terbaik di antara model yang diuji karena menghasilkan kesalahan prediksi paling rendah dan kemampuan menjelaskan variasi variabel respons sebesar 74,30%.
   

5.2 Saran

   Dalam membuat laporan praktikum ini penulis menyarankan untuk selalu memperhatikan sintaks pada program R yang digunakan. Selain itu, perlu untuk memperhatikan tata cara penulisan yang sesuai dengan KBBI dan penulisan yang bercetak tebal. Sehingga dapat menghasilkan laporan yang baik

DAFTAR PUSTAKA

Fransiska, H. (2026). Modul Praktikum Machine Learning. Universitas Bengkulu.
Hu, J., & Szymczak, S. (2023). A review on longitudinal data analysis with random forest. In Briefings in Bioinformatics (Vol. 24, Number 2). Oxford University Press. https://doi.org/10.1093/bib/bbad002
Khairunnisa, A., Notodiputro, K. A., & Sartono, B. (2024). A Comparative Study of Random Forest and Double Random Forest Models from View Points of Their Interpretability. Scientific Journal of Informatics, 11(1), 207–218. https://doi.org/10.15294/sji.v11i1.48721
Purwanto, A., Sartono, B., & Notodiputro, K. A. (2025). A Comparison Of Random Forest And Double Random Forest: Dropout Rates Of Madrasah Students In Indonesia. BAREKENG: J. Math. & App, 19(1), 227–0236. https://doi.org/10.30598/barekengvol19iss1pp0227-0236