BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

   Perkembangan teknologi informasi mendorong pemanfaatan metode statistika dan machine learning dalam mengolah serta menganalisis data. Salah satu permasalahan yang sering dihadapi dalam analisis data adalah bagaimana membangun model yang mampu menghasilkan prediksi secara akurat berdasarkan sejumlah variabel prediktor. Salah satu metode yang banyak digunakan adalah Random Forest, yaitu metode ensemble learning yang menggabungkan sejumlah pohon keputusan (decision tree) melalui proses pengambilan sampel data dan pemilihan variabel secara acak. Menurut Breiman (2001), Random Forest merupakan metode yang memanfaatkan kombinasi banyak pohon keputusan untuk meningkatkan akurasi prediksi serta mengendalikan kesalahan generalisasi model.
   Selain Random Forest, terdapat metode pengembangan yang dikenal sebagai Double Random Forest. Metode ini menerapkan proses pengacakan pada tahapan pembentukan pohon keputusan, khususnya dalam proses pengambilan sampel pada setiap simpul (node). Pendekatan tersebut memungkinkan pohon keputusan tumbuh dengan karakteristik yang berbeda dibandingkan Random Forest konvensional. Pengembangan ini bertujuan untuk meningkatkan kemampuan model dalam menangkap pola data serta menghasilkan prediksi yang lebih baik. Dengan demikian, kedua metode tersebut dapat digunakan sebagai alternatif dalam menyelesaikan permasalahan klasifikasi maupun regresi berdasarkan karakteristik data yang dianalisis.
   Praktikum mengenai Random Forest dan Double Random Forest dilakukan untuk memahami konsep, prinsip kerja, serta tahapan penerapan kedua metode dalam analisis data. Melalui praktikum ini, dilakukan pembentukan model menggunakan kedua metode, kemudian mengevaluasi hasil prediksi berdasarkan ukuran kinerja yang sesuai, seperti accuracy, precision, recall, dan F1-score untuk klasifikasi. Hasil evaluasi tersebut digunakan untuk membandingkan kemampuan kedua metode dalam menghasilkan prediksi. Dengan demikian, praktikum ini diharapkan dapat meningkatkan pemahaman mengenai penerapan Random Forest dan Double Random Forest serta mengetahui perbedaan kinerja keduanya dalam analisis data.

1.2 Rumusan Masalah

   Berdasarkan latar belakang, rumusan masalah yang disimpulkan adalah:
   1. Apa yang dimaksud dengan Random Forest dan Double Random Forest sebagai metode ensemble berbasis decision tree?
   2. Bagaimana 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

   Berdasarkan rumusan masalah, tujuan yang dapat disimpulkan adalah:
   1. Mahasiswa dapat memahami Random Forest dan Double Random Forest sebagai metode ensemble berbasis decision tree.
   2. Mahasiswa dapat mengimplementasikan Random Forest untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi.
   3. Mengevaluasi performa performa model, memahami Out-of-Bag (OOB) error, dan membandingkan Random Forest dengan Double Random Forest.

1.4 Manfaat Penelitian

   Adapun manfaat pada penelitian ini, yaitu: 
   1. Bagi penulis
      a. Dapat memberikan informasi serta pengetahuan tentang Random Forest dan Double Random Forest.
      b. Dapat menerapkan wawasan ilmu yang telah diperoleh dalam bidang statistika tentang Random Forest dan Double Random Forest.
   2. Bagi pembaca
      Menambah ilmu pengetahuan dan pemahaman yang berkaitan tentang Random Forest dan Double Random Forest.

1.5 Batasan Masalah

   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 adalah algoritma ensemble learning berbasis tree yang membangun banyak decision tree dan menggabungkan prediksinya untuk meningkatkan akurasi dan mengurangi overfitting. Menurut James, Witten, Hastie, dan Tibshirani dalam An Introduction to Statistical Learning (ISL), Random Forest merupakan pengembangan dari metode bagging (Bootstrap Aggregating) yang menggunakan kumpulan pohon keputusan (decision trees) sebagai model dasar. Metode ini dirancang untuk mengurangi variansi model dan meningkatkan kemampuan generalisasi.  Seperti Bagging, RF membentuk banyak pohon dari proses resampling dan kemudian menggabungkan hasil prediksinya. Perbedaannya, RF menambahkan pengacakan pada pemilihan prediktor di setiap node. Dengan demikian, pohon-pohon dalam forest tidak hanya dibangun dari sampel yang berbeda, tetapi juga tidak selalu mempertimbangkan prediktor yang sama ketika mencari split terbaik. Tujuan pengacakan prediktor adalah mengurangi korelasi antar-pohon. Apabila semua pohon terlalu mirip, manfaat agregasi menjadi terbatas. Dengan membuat pohon yang kuat tetapi tidak terlalu berkorelasi, Random Forest dapat mengurangi variance tanpa harus memangkas setiap pohon secara agresif (Fransiska, 2026). 
   Tahapan pembentukan model Random Forest diawali dengan menentukan jumlah pohon keputusan yang akan dibangun. Selanjutnya, dilakukan pengambilan sampel bootstrap dari data pelatihan untuk setiap pohon. Pada setiap simpul, dipilih sejumlah variabel prediktor secara acak, kemudian ditentukan pemisahan terbaik berdasarkan kriteria tertentu hingga memenuhi kondisi penghentian. Setelah seluruh pohon terbentuk, hasil prediksi digabungkan untuk memperoleh prediksi akhir. Pada klasifikasi, hasil akhir ditentukan berdasarkan suara terbanyak (majority voting), sedangkan pada regresi menggunakan rata-rata dari seluruh hasil prediksi pohon (Rais dkk., 2024).

2.2 Double Random Forest

   Double Random Forest (DRF) merupakan pengembangan dari metode Random Forest yang diperkenalkan untuk meningkatkan kemampuan prediksi, terutama ketika model Random Forest mengalami underfitting. Metode ini menerapkan mekanisme pengacakan melalui proses bootstrap pada setiap simpul pohon keputusan, bukan hanya satu kali pada awal pembentukan pohon. Berbeda dengan Random Forest yang menggunakan sampel bootstrap sebagai data awal setiap pohon, DRF menggunakan seluruh data pelatihan pada simpul akar (root node). Selanjutnya, pengambilan sampel bootstrap dilakukan kembali pada setiap simpul untuk menentukan kriteria pemisahan data. Mekanisme tersebut memungkinkan pembentukan pohon keputusan yang lebih besar dan beragam sehingga dapat meningkatkan kemampuan model dalam menangkap pola data (Han dkk., 2020). 
   Proses pembentukan Double Random Forest dimulai dengan menggunakan seluruh data pelatihan pada simpul akar setiap pohon. Selanjutnya, pada setiap simpul dilakukan pengambilan sampel bootstrap apabila jumlah pengamatan memenuhi kriteria tertentu. Setelah itu, dipilih sejumlah variabel prediktor secara acak untuk menentukan pemisahan terbaik berdasarkan kriteria pembentukan pohon keputusan. Proses tersebut dilakukan secara berulang hingga seluruh pohon memenuhi kriteria penghentian. Prediksi akhir diperoleh dengan menggabungkan hasil dari seluruh pohon yang terbentuk melalui majority voting untuk klasifikasi atau rata-rata untuk regresi. Rais et dkk. (2024) menunjukkan bahwa metode DRF dapat digunakan dalam klasifikasi dan dibandingkan dengan beberapa metode ensemble lainnya untuk menangani permasalahan ketidakseimbangan kelas.

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

   Jenis data pada penelitian ini adalah data kuantitatif. Data kuantitatif merupakan data atau informasi yang didapatkan dalam bentuk angka atau numerik. Sumber data yang digunakan pada batasan masalah ini adalah sekunder yaang merupakan data simulasi yang dibangkitkan menggunakan fungsi mlbench.friedman1() dari paket mlbench pada perangkat lunak R. melalui dataset BreastCancer pada package mlbench dalam perangkat lunak R.
   

3.2 Variabel Penelitian

   Variabel penelitian adalah atribut atau nilai yang memiliki variasi tertentu dan dipilih peneliti untuk dianalisis.Variabel yang digunakan dalam praktikum ini terdiri atas variabel prediktor (X) dan variabel respons (Y).Variabel yang digunakan dalam penelitian ini terdiri atas satu variabel respons (Y) dan sepuluh variabel prediktor (X).

3.3 Langkah-langkah Analisis

    Berikut adalah algoritma untuk menyelesaiankan batasan masalah:
   1. Membangkitkan data Friedman sebanyak 200 observasi.
   2. Membagi data menjadi 70% data training dan 30% data testing.
   3. Mengubah variabel respons numerik menjadi dua kategori, yaitu Rendah dan Tinggi berdasarkan nilai median.
   4. Menentukan kombinasi parameter mtry (2, 3, 5) dan num.trees (200, 500, 1.000).
   5. Membentuk sembilan model Random Forest Classification.
   6. Menghitung nilai OOB MSE pada setiap model.
   7. Mengevaluasi performa model menggunakan MSE, RMSE, MAE, dan R² pada data testing.
   8. Membuat residual plot dan menganalisis variable importance.
   9. Membandingkan hasil seluruh model untuk menentukan model terbaik.
   

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

library(mlbench)
library(ranger)
set.seed(123)
data.friedman <- as.data.frame(mlbench.friedman1(200))
# Melihat struktur dan beberapa data
str(data.friedman)
## 'data.frame':    200 obs. of  11 variables:
##  $ x.1 : num  0.288 0.788 0.409 0.883 0.94 ...
##  $ x.2 : num  0.239 0.962 0.601 0.515 0.403 ...
##  $ x.3 : num  0.986 0.137 0.905 0.576 0.395 ...
##  $ x.4 : num  0.237 0.686 0.226 0.318 0.174 ...
##  $ x.5 : num  0.471 0.366 0.121 0.047 0.263 ...
##  $ x.6 : num  0.274 0.594 0.16 0.853 0.848 ...
##  $ x.7 : num  0.859 0.887 0.489 0.718 0.487 ...
##  $ x.8 : num  0.2332 0.2307 0.0617 0.4971 0.2441 ...
##  $ x.9 : num  0.639 0.125 0.255 0.821 0.804 ...
##  $ x.10: num  0.155 0.846 0.214 0.67 0.618 ...
##  $ y   : num  10.6 17.2 13.1 13.3 10 ...
head(data.friedman)
##         x.1       x.2       x.3       x.4        x.5       x.6       x.7
## 1 0.2875775 0.2387260 0.9860543 0.2372297 0.47068183 0.2736227 0.8585914
## 2 0.7883051 0.9623589 0.1370675 0.6864904 0.36584547 0.5938669 0.8873848
## 3 0.4089769 0.6013657 0.9053096 0.2258184 0.12127205 0.1601848 0.4890915
## 4 0.8830174 0.5150297 0.5763018 0.3184946 0.04699368 0.8534302 0.7180918
## 5 0.9404673 0.4025733 0.3954489 0.1739838 0.26279630 0.8477392 0.4867056
## 6 0.0455565 0.8802465 0.4498025 0.8014296 0.96864117 0.4778868 0.9887089
##          x.8        x.9       x.10        y
## 1 0.23323974 0.63918581 0.15526414 10.59497
## 2 0.23065360 0.12482240 0.84585101 17.16530
## 3 0.06172627 0.25526578 0.21438043 13.11249
## 4 0.49711861 0.82057469 0.66987324 13.30344
## 5 0.24412509 0.80378039 0.61775645 10.00466
## 6 0.75818554 0.04583463 0.04999978 15.20495
dim(data.friedman)
## [1] 200  11
summary(data.friedman)
##       x.1                 x.2                x.3                 x.4          
##  Min.   :0.0006248   Min.   :0.006301   Min.   :0.0004654   Min.   :0.001192  
##  1st Qu.:0.2721181   1st Qu.:0.235623   1st Qu.:0.2736035   1st Qu.:0.246362  
##  Median :0.4820961   Median :0.469024   Median :0.5061597   Median :0.492065  
##  Mean   :0.5063919   Mean   :0.489122   Mean   :0.5022216   Mean   :0.493561  
##  3rd Qu.:0.7333708   3rd Qu.:0.741910   3rd Qu.:0.7570153   3rd Qu.:0.755200  
##  Max.   :0.9942698   Max.   :0.999405   Max.   :0.9966172   Max.   :0.994936  
##       x.5                x.6                x.7                x.8         
##  Min.   :0.003896   Min.   :0.002479   Min.   :0.001156   Min.   :0.01152  
##  1st Qu.:0.261924   1st Qu.:0.263275   1st Qu.:0.234549   1st Qu.:0.27500  
##  Median :0.518644   Median :0.478715   Median :0.487690   Median :0.49757  
##  Mean   :0.495092   Mean   :0.486666   Mean   :0.473317   Mean   :0.51007  
##  3rd Qu.:0.734548   3rd Qu.:0.719703   3rd Qu.:0.715833   3rd Qu.:0.75497  
##  Max.   :0.991745   Max.   :0.992616   Max.   :0.998883   Max.   :0.99952  
##       x.9                x.10                y        
##  Min.   :0.005364   Min.   :0.004609   Min.   : 4.39  
##  1st Qu.:0.272996   1st Qu.:0.249906   1st Qu.:10.73  
##  Median :0.556871   Median :0.497349   Median :14.56  
##  Mean   :0.528512   Mean   :0.492717   Mean   :14.60  
##  3rd Qu.:0.798814   3rd Qu.:0.729677   3rd Qu.:18.09  
##  Max.   :0.996372   Max.   :0.994995   Max.   :27.72

Interpretasi

Berdasarkan hasil pembangkitan data menggunakan fungsi mlbench.friedman1(200), diperoleh sebanyak 200 observasi dengan 11 variabel yang terdiri atas 10 variabel prediktor (X1 sampai X1010) dan 1 variabel respons (Y). Seluruh variabel prediktor memiliki tipe data numerik dengan nilai berkisar antara 0 hingga 1, sedangkan variabel respons (Y) memiliki nilai minimum sebesar 4,39 dan maksimum sebesar 27,72. Hasil statistik deskriptif menunjukkan bahwa rata-rata seluruh variabel prediktor berada di sekitar 0,47–0,53, dengan nilai median yang relatif mendekati nilai rata-ratanya. Sementara itu, variabel respons memiliki rata-rata sebesar 14,60, median sebesar 14,56, dan simpangan nilai yang cukup beragam. Jumlah data yang digunakan sebanyak 200 observasi dengan 10 variabel prediktor menunjukkan bahwa dataset ini dapat digunakan untuk penerapan metode Random Forest Regression maupun Double Random Forest Regression. Informasi struktur dan statistik deskriptif tersebut memberikan gambaran awal mengenai karakteristik data sebelum dilakukan pembagian data latih dan data uji serta pemodelan regresi.

4.2 Training dan Testing

set.seed(123)
n <- nrow(data.friedman)
indeks.train <- sample(1:n, size = 0.70 * n)
data.train <- data.friedman[indeks.train, ]
data.test  <- data.friedman[-indeks.train, ]
cat("\nJumlah Data Training:", nrow(data.train), "\n")
## 
## Jumlah Data Training: 140
cat("Jumlah Data Testing :", nrow(data.test), "\n")
## Jumlah Data Testing : 60

Intepretasi Hasil 4.2

Berdasarkan hasil pembagian data menggunakan metode random sampling dengan proporsi 70:30, dari total 200 observasi diperoleh sebanyak 140 observasi sebagai data training dan 60 observasi sebagai data testing. Data training digunakan untuk membangun dan melatih model Random Forest Regression maupun Double Random Forest Regression, sedangkan data testing digunakan untuk menguji kemampuan model dalam melakukan prediksi terhadap data yang belum pernah digunakan selama proses pelatihan. Pembagian data dilakukan menggunakan set.seed(123) agar proses pengambilan sampel bersifat konsisten sehingga menghasilkan pembagian data yang sama ketika kode dijalankan kembali. Proporsi pembagian tersebut diharapkan dapat memberikan jumlah data yang cukup untuk proses pembentukan model sekaligus mengevaluasi kemampuan prediksi masing-masing metode.

Mengubah Variabel Y Menjadi Kategori

# Menentukan batas kategori berdasarkan median training
batas <- median(data.train$y)

# Membentuk kategori training
data.train$kategori <- ifelse(
  data.train$y <= batas,
  "Rendah",
  "Tinggi")

# Membentuk kategori testing dengan batas yang sama
data.test$kategori <- ifelse(
  data.test$y <= batas,
  "Rendah",
  "Tinggi")

# Mengubah kategori menjadi factor
data.train$kategori <- factor(
  data.train$kategori,
  levels = c("Rendah", "Tinggi"))

data.test$kategori <- factor(
  data.test$kategori,
  levels = c("Rendah", "Tinggi"))

# Menghapus variabel y, karena sudah diubah menjadi kategori
data.train$y <- NULL
data.test$y <- NULL

cat("\nBatas Kategori:", batas, "\n")
## 
## Batas Kategori: 14.42483
cat("\nDistribusi Kategori Training:\n")
## 
## Distribusi Kategori Training:
print(table(data.train$kategori))
## 
## Rendah Tinggi 
##     70     70
cat("\nDistribusi Kategori Testing:\n")
## 
## Distribusi Kategori Testing:
print(table(data.test$kategori))
## 
## Rendah Tinggi 
##     28     32
cat("\nNama Variabel Training:\n")
## 
## Nama Variabel Training:
print(names(data.train))
##  [1] "x.1"      "x.2"      "x.3"      "x.4"      "x.5"      "x.6"     
##  [7] "x.7"      "x.8"      "x.9"      "x.10"     "kategori"

Intepretasi Hasil 4.3

Berdasarkan hasil pembentukan kategori, variabel respons (Y) yang semula berbentuk numerik diubah menjadi dua kategori, yaitu Rendah dan Tinggi, dengan menggunakan nilai median data training sebagai batas pemisah. Nilai median yang diperoleh sebesar 14,42483, sehingga observasi dengan nilai Y kurang dari atau sama dengan 14,42483 dikategorikan sebagai Rendah, sedangkan observasi dengan nilai Y lebih dari 14,42483 dikategorikan sebagai Tinggi. Hasil pengelompokan menunjukkan bahwa data training memiliki distribusi yang seimbang, yaitu 70 observasi kategori Rendah dan 70 observasi kategori Tinggi. Sementara itu, data testing terdiri atas 28 observasi kategori Rendah dan 32 observasi kategori Tinggi. Penggunaan batas median yang sama pada data training dan testing bertujuan untuk menjaga konsistensi pembentukan kategori serta menghindari kebocoran informasi dari data testing ke dalam proses pelatihan. Selanjutnya, variabel Y dihapus karena telah dikonversi menjadi variabel kategori, sehingga data siap digunakan untuk pemodelan klasifikasi menggunakan Random Forest

4.4 Menentukan Kombinasi Parameter

nilai.mtry <- c(2, 3, 5)
nilai.trees <- c(200, 500, 1000)

kombinasi <- expand.grid(
  mtry = nilai.mtry,
  num.trees = nilai.trees)

cat("\nKombinasi Parameter:\n")
## 
## Kombinasi Parameter:
print(kombinasi)
##   mtry num.trees
## 1    2       200
## 2    3       200
## 3    5       200
## 4    2       500
## 5    3       500
## 6    5       500
## 7    2      1000
## 8    3      1000
## 9    5      1000

Intepretasi Hasil 4.4

Berdasarkan hasil penentuan kombinasi parameter, digunakan dua parameter utama dalam pemodelan klasifikasi, yaitu mtry dan num.trees. Parameter mtry menggunakan tiga variasi nilai, yaitu 2, 3, dan 5, yang menunjukkan jumlah variabel prediktor yang dipertimbangkan secara acak pada setiap pemisahan simpul pohon. Sementara itu, parameter num.trees menggunakan variasi jumlah pohon sebanyak 200, 500, dan 1.000 pohon. Kombinasi kedua parameter tersebut menghasilkan 9 skenario pemodelan yang akan diuji untuk memperoleh konfigurasi terbaik. Pengujian berbagai kombinasi parameter bertujuan untuk mengetahui pengaruh jumlah variabel prediktor dan jumlah pohon terhadap kemampuan model dalam mengklasifikasikan observasi ke dalam kategori Rendah dan Tinggi. Selanjutnya, setiap kombinasi parameter akan dievaluasi menggunakan data testing berdasarkan nilai accuracy, precision, recall, dan F1-score untuk menentukan model dengan performa klasifikasi terbaik.

4.5 Membentuk Model Random Forest Classsification

hasil.model <- list()
hasil.prediksi <- list()
hasil.confusion <- list()
hasil.evaluasi <- data.frame()

for (i in 1:nrow(kombinasi)) {
  
  m <- kombinasi$mtry[i]
  nt <- kombinasi$num.trees[i]
  
  cat("\n====================================\n")
  cat("MODEL KE-", i, "\n")
  cat("mtry =", m, "\n")
  cat("num.trees =", nt, "\n")
  cat("====================================\n")
  
  # Membentuk model
  set.seed(123)
  
  rf <- ranger(
    dependent.variable.name = "kategori",
    data = data.train,
    mtry = m,
    num.trees = nt,
    importance = "permutation",
    seed = 123)
  
  nama.model <- paste0("Model_", i)
  
  hasil.model[[nama.model]] <- rf
  
  # MENGHITUNG OOB ERROR
  oob.error <- rf$prediction.error
  
  # PREDIKSI DAN EVALUASI DATA TESTING
  
  prediksi <- predict(
    rf,
    data = data.test
  )$predictions
  
  aktual <- data.test$kategori
  
  # Confusion Matrix
  cm <- table(
    Aktual = factor(aktual, levels = c("Rendah", "Tinggi")),
    Prediksi = factor(
      prediksi,
      levels = c("Rendah", "Tinggi")))
  
  hasil.confusion[[nama.model]] <- cm
  
  # Menghitung TP, TN, FP, dan FN
  TN <- cm["Rendah", "Rendah"]
  FP <- cm["Rendah", "Tinggi"]
  FN <- cm["Tinggi", "Rendah"]
  TP <- cm["Tinggi", "Tinggi"]
  
  # Menghitung ukuran evaluasi
  accuracy <- (TP + TN) / sum(cm)
  
  precision <- ifelse(
    TP + FP == 0,
    0,
    TP / (TP + FP))
  
  recall <- ifelse(
    TP + FN == 0,
    0,
    TP / (TP + FN))
  
  f1.score <- ifelse(
    precision + recall == 0,
    0,
    2 * precision * recall /
      (precision + recall))
  
  # Menyimpan hasil evaluasi
  hasil.evaluasi <- rbind(
    hasil.evaluasi,
    data.frame(
      Model = nama.model,
      mtry = m,
      num.trees = nt,
      OOB_Error = oob.error,
      Accuracy = accuracy,
      Precision = precision,
      Recall = recall,
      F1_Score = f1.score))
  
  hasil.prediksi[[nama.model]] <- prediksi
  
  # Menampilkan hasil setiap model
  cat("\nConfusion Matrix:\n")
  print(cm)
  
  cat("\nOOB Error :", oob.error, "\n")
  cat("Accuracy  :", accuracy, "\n")
  cat("Precision :", precision, "\n")
  cat("Recall    :", recall, "\n")
  cat("F1-Score  :", f1.score, "\n")}
## 
## ====================================
## MODEL KE- 1 
## mtry = 2 
## num.trees = 200 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     21      7
##   Tinggi      3     29
## 
## OOB Error : 0.1714286 
## Accuracy  : 0.8333333 
## Precision : 0.8055556 
## Recall    : 0.90625 
## F1-Score  : 0.8529412 
## 
## ====================================
## MODEL KE- 2 
## mtry = 3 
## num.trees = 200 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     23      5
##   Tinggi      3     29
## 
## OOB Error : 0.2 
## Accuracy  : 0.8666667 
## Precision : 0.8529412 
## Recall    : 0.90625 
## F1-Score  : 0.8787879 
## 
## ====================================
## MODEL KE- 3 
## mtry = 5 
## num.trees = 200 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     22      6
##   Tinggi      4     28
## 
## OOB Error : 0.1785714 
## Accuracy  : 0.8333333 
## Precision : 0.8235294 
## Recall    : 0.875 
## F1-Score  : 0.8484848 
## 
## ====================================
## MODEL KE- 4 
## mtry = 2 
## num.trees = 500 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     22      6
##   Tinggi      2     30
## 
## OOB Error : 0.1928571 
## Accuracy  : 0.8666667 
## Precision : 0.8333333 
## Recall    : 0.9375 
## F1-Score  : 0.8823529 
## 
## ====================================
## MODEL KE- 5 
## mtry = 3 
## num.trees = 500 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     21      7
##   Tinggi      2     30
## 
## OOB Error : 0.1642857 
## Accuracy  : 0.85 
## Precision : 0.8108108 
## Recall    : 0.9375 
## F1-Score  : 0.8695652 
## 
## ====================================
## MODEL KE- 6 
## mtry = 5 
## num.trees = 500 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     21      7
##   Tinggi      3     29
## 
## OOB Error : 0.1785714 
## Accuracy  : 0.8333333 
## Precision : 0.8055556 
## Recall    : 0.90625 
## F1-Score  : 0.8529412 
## 
## ====================================
## MODEL KE- 7 
## mtry = 2 
## num.trees = 1000 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     22      6
##   Tinggi      2     30
## 
## OOB Error : 0.2 
## Accuracy  : 0.8666667 
## Precision : 0.8333333 
## Recall    : 0.9375 
## F1-Score  : 0.8823529 
## 
## ====================================
## MODEL KE- 8 
## mtry = 3 
## num.trees = 1000 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     23      5
##   Tinggi      3     29
## 
## OOB Error : 0.1785714 
## Accuracy  : 0.8666667 
## Precision : 0.8529412 
## Recall    : 0.90625 
## F1-Score  : 0.8787879 
## 
## ====================================
## MODEL KE- 9 
## mtry = 5 
## num.trees = 1000 
## ====================================
## 
## Confusion Matrix:
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     23      5
##   Tinggi      3     29
## 
## OOB Error : 0.1857143 
## Accuracy  : 0.8666667 
## Precision : 0.8529412 
## Recall    : 0.90625 
## F1-Score  : 0.8787879

Intepretasi Hasil 4.5

Berdasarkan hasil pemodelan Random Forest Classification dengan menggunakan 9 kombinasi parameter, diperoleh hasil evaluasi yang menunjukkan adanya perbedaan performa pada setiap model. Model pertama dengan parameter mtry = 2 dan num.trees = 200 menghasilkan accuracy sebesar 83,33%, sedangkan model kedua dengan mtry = 3 dan num.trees = 200 menghasilkan accuracy sebesar 86,67%, precision sebesar 85,29%, recall sebesar 90,63%, dan F1-score sebesar 87,88%. Model keempat dengan mtry = 2 dan num.trees = 500 memperoleh accuracy sebesar 86,67%, precision sebesar 83,33%, recall sebesar 93,75%, dan F1-score sebesar 88,24%. Hasil tersebut menunjukkan bahwa model keempat memiliki nilai F1-score dan recall tertinggi dibandingkan kombinasi parameter lainnya, sehingga mampu memberikan keseimbangan terbaik antara ketepatan dan keberhasilan dalam mengenali kategori Tinggi. Selain itu, nilai OOB error terendah sebesar 0,1643 atau 16,43% diperoleh pada model kelima dengan mtry = 3 dan num.trees = 500, yang menunjukkan tingkat kesalahan prediksi internal paling rendah di antara sembilan model. Dengan demikian, berdasarkan nilai F1-score, model keempat dapat dipilih sebagai model terbaik untuk klasifikasi, dengan konfigurasi 500 pohon dan 2 variabel prediktor pada setiap pemisahan simpul.

4.6 Perbandingan dan Pemilihan Model Terbaik

cat("PERBANDINGAN HASIL SEMUA MODEL\n")
## PERBANDINGAN HASIL SEMUA MODEL
print(hasil.evaluasi)
##     Model mtry num.trees OOB_Error  Accuracy Precision  Recall  F1_Score
## 1 Model_1    2       200 0.1714286 0.8333333 0.8055556 0.90625 0.8529412
## 2 Model_2    3       200 0.2000000 0.8666667 0.8529412 0.90625 0.8787879
## 3 Model_3    5       200 0.1785714 0.8333333 0.8235294 0.87500 0.8484848
## 4 Model_4    2       500 0.1928571 0.8666667 0.8333333 0.93750 0.8823529
## 5 Model_5    3       500 0.1642857 0.8500000 0.8108108 0.93750 0.8695652
## 6 Model_6    5       500 0.1785714 0.8333333 0.8055556 0.90625 0.8529412
## 7 Model_7    2      1000 0.2000000 0.8666667 0.8333333 0.93750 0.8823529
## 8 Model_8    3      1000 0.1785714 0.8666667 0.8529412 0.90625 0.8787879
## 9 Model_9    5      1000 0.1857143 0.8666667 0.8529412 0.90625 0.8787879
# Mengurutkan berdasarkan Accuracy terbesar
hasil.ranking <- hasil.evaluasi[
  order(
    -hasil.evaluasi$Accuracy,
    -hasil.evaluasi$F1_Score),]

cat("\nRANKING MODEL:\n")
## 
## RANKING MODEL:
print(hasil.ranking)
##     Model mtry num.trees OOB_Error  Accuracy Precision  Recall  F1_Score
## 4 Model_4    2       500 0.1928571 0.8666667 0.8333333 0.93750 0.8823529
## 7 Model_7    2      1000 0.2000000 0.8666667 0.8333333 0.93750 0.8823529
## 2 Model_2    3       200 0.2000000 0.8666667 0.8529412 0.90625 0.8787879
## 8 Model_8    3      1000 0.1785714 0.8666667 0.8529412 0.90625 0.8787879
## 9 Model_9    5      1000 0.1857143 0.8666667 0.8529412 0.90625 0.8787879
## 5 Model_5    3       500 0.1642857 0.8500000 0.8108108 0.93750 0.8695652
## 1 Model_1    2       200 0.1714286 0.8333333 0.8055556 0.90625 0.8529412
## 6 Model_6    5       500 0.1785714 0.8333333 0.8055556 0.90625 0.8529412
## 3 Model_3    5       200 0.1785714 0.8333333 0.8235294 0.87500 0.8484848
# Menentukan model terbaik
model.terbaik <- hasil.ranking[1, ]

cat("\nMODEL TERBAIK:\n")
## 
## MODEL TERBAIK:
print(model.terbaik)
##     Model mtry num.trees OOB_Error  Accuracy Precision Recall  F1_Score
## 4 Model_4    2       500 0.1928571 0.8666667 0.8333333 0.9375 0.8823529

Intepretasi Hasil 4.6

Berdasarkan hasil perbandingan seluruh sembilan model Random Forest Classification, dilakukan pengurutan model berdasarkan nilai accuracy tertinggi, kemudian dilanjutkan dengan nilai F1-score sebagai pertimbangan berikutnya. Hasil pengurutan menunjukkan bahwa Model 4, Model 7, Model 2, Model 8, dan Model 9 memperoleh nilai accuracy tertinggi yang sama, yaitu sebesar 86,67%. Namun, Model 4 dan Model 7 memiliki nilai F1-score tertinggi, yaitu sebesar 88,24%, dengan nilai precision sebesar 83,33% dan recall sebesar 93,75%. Kedua model tersebut memiliki konfigurasi mtry = 2, tetapi berbeda dalam jumlah pohon, yaitu 500 pohon pada Model 4 dan 1.000 pohon pada Model 7. Berdasarkan hasil tersebut, Model 4 dipilih sebagai model terbaik karena menghasilkan performa evaluasi yang sama dengan Model 7, tetapi menggunakan jumlah pohon yang lebih sedikit sehingga proses komputasinya lebih efisien. Model terbaik yang diperoleh menggunakan parameter mtry = 2 dan num.trees = 500, dengan accuracy sebesar 86,67%, F1-score sebesar 88,24%, dan OOB error sebesar 19,29%.

4.7 Confusion Matrix Semua Model

for (i in 1:length(hasil.confusion)) {
  
  nama.model <- paste0("Model_", i)
  
  cat("\n", nama.model, "\n")
  print(hasil.confusion[[nama.model]])}
## 
##  Model_1 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     21      7
##   Tinggi      3     29
## 
##  Model_2 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     23      5
##   Tinggi      3     29
## 
##  Model_3 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     22      6
##   Tinggi      4     28
## 
##  Model_4 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     22      6
##   Tinggi      2     30
## 
##  Model_5 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     21      7
##   Tinggi      2     30
## 
##  Model_6 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     21      7
##   Tinggi      3     29
## 
##  Model_7 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     22      6
##   Tinggi      2     30
## 
##  Model_8 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     23      5
##   Tinggi      3     29
## 
##  Model_9 
##         Prediksi
## Aktual   Rendah Tinggi
##   Rendah     23      5
##   Tinggi      3     29

Intepretasi Hasil 4.7

Berdasarkan hasil confusion matrix dari sembilan model Random Forest Classification, terlihat bahwa setiap model memiliki kemampuan yang berbeda dalam mengklasifikasikan data ke dalam kategori Rendah dan Tinggi. Model 4 dan Model 7 menghasilkan jumlah klasifikasi benar yang sama, yaitu 22 observasi pada kategori Rendah dan 30 observasi pada kategori Tinggi, dengan total 52 observasi yang diklasifikasikan secara tepat dari 60 data testing. Kedua model tersebut juga menghasilkan kesalahan klasifikasi sebanyak 8 observasi, yang terdiri atas 6 observasi kategori Rendah yang diprediksi sebagai Tinggi (false positive) dan 2 observasi kategori Tinggi yang diprediksi sebagai Rendah (false negative). Sementara itu, Model 2, Model 8, dan Model 9 berhasil mengklasifikasikan 52 observasi secara tepat, tetapi memiliki distribusi kesalahan yang berbeda, yaitu 5 kesalahan pada kategori Rendah dan 3 kesalahan pada kategori Tinggi. Berdasarkan hasil tersebut, Model 4 yang menggunakan mtry = 2 dan num.trees = 500 dipilih sebagai model terbaik karena mampu mengenali kategori Tinggi dengan baik, ditunjukkan oleh jumlah kesalahan false negative yang relatif rendah, serta memiliki nilai accuracy dan F1-score tertinggi bersama Model 7.

4.8 Variable Impotance Semua Model

par(mfrow = c(3, 3))

for (i in 1:length(hasil.model)) {
  
  nama.model <- paste0("Model_", i)
  
  importance <- hasil.model[[nama.model]]$variable.importance
  
  importance <- sort(
    importance,
    decreasing = TRUE)
  
  barplot(
    importance,
    main = nama.model,
    xlab = "Variabel",
    ylab = "Variable Importance",
    las = 2)}

par(mfrow = c(1, 1))

Intepretasi Hasil 4.8

Berdasarkan grafik variable importance dari sembilan model Random Forest Classification, terlihat bahwa variabel X4 memiliki tingkat kepentingan tertinggi pada seluruh model, diikuti oleh variabel X2 sebagai variabel dengan tingkat kepentingan terbesar kedua. Hal ini menunjukkan bahwa X4 dan X2 memberikan kontribusi paling besar terhadap kemampuan model dalam mengklasifikasikan data ke dalam kategori Rendah dan Tinggi. Sementara itu, variabel X5, X7, dan X1 memiliki tingkat kepentingan yang relatif lebih rendah dibandingkan X4 dan X2, sedangkan variabel lainnya, yaitu X3, X6, X8, X9, dan X10, cenderung memberikan kontribusi yang lebih kecil terhadap hasil klasifikasi. Meskipun terdapat sedikit perbedaan besarnya nilai variable importance pada setiap model, pola kepentingan variabel secara umum menunjukkan hasil yang relatif konsisten. Dengan demikian, dapat disimpulkan bahwa X4 merupakan variabel yang paling dominan dalam proses klasifikasi Random Forest, sehingga perubahan pada variabel tersebut memberikan pengaruh relatif lebih besar terhadap hasil prediksi model dibandingkan variabel prediktor lainnya.

4.9 Variabel importance model terbaik

nama.terbaik <- as.character(model.terbaik$Model)

importance.terbaik <-
  hasil.model[[nama.terbaik]]$variable.importance

importance.terbaik <- sort(
  importance.terbaik,
  decreasing = TRUE)

cat("\nVARIABLE IMPORTANCE MODEL TERBAIK:\n")
## 
## VARIABLE IMPORTANCE MODEL TERBAIK:
print(importance.terbaik)
##           x.4           x.2           x.5           x.1           x.7 
##  7.595477e-02  4.863950e-02  1.305931e-02  1.035205e-02  7.942066e-03 
##           x.8           x.9           x.6           x.3          x.10 
##  7.812834e-03  2.762993e-03  1.987345e-05 -8.010572e-04 -1.052739e-03
barplot(
  importance.terbaik,
  main = paste("Variable Importance", nama.terbaik),
  xlab = "Variabel",
  ylab = "Importance",
  las = 2)

Intepretasi Hasil 4.9

Berdasarkan grafik variable importance pada Model 4 sebagai model Random Forest Classification terbaik, terlihat bahwa variabel X4 memiliki tingkat kepentingan paling tinggi dengan nilai sekitar 0,076, diikuti oleh X2 sebesar 0,049. Selanjutnya, variabel X5 dan X1 memiliki nilai kepentingan masing-masing sekitar 0,013 dan 0,010, sedangkan X7 dan X8 memiliki nilai sekitar 0,008. Variabel X9 memberikan kontribusi yang lebih kecil, sementara X6, X3, dan X10 memiliki tingkat kepentingan yang mendekati nol. Hasil tersebut menunjukkan bahwa variabel X4 dan X2 merupakan variabel yang paling dominan dalam proses klasifikasi kategori Rendah dan Tinggi pada model terbaik. Dengan demikian, kedua variabel tersebut memiliki kontribusi relatif paling besar dalam menentukan hasil prediksi dibandingkan variabel prediktor lainnya, sedangkan variabel dengan nilai importance mendekati nol memberikan kontribusi yang relatif kecil terhadap kemampuan klasifikasi model.

BAB V KESIMPULAN

5.1 Kesimpulan

  Random Forest merupakan metode ensemble learning berbasis decision tree yang menggabungkan banyak pohon keputusan untuk menghasilkan prediksi yang lebih akurat dan stabil. Metode ini menggunakan teknik bootstrap sampling untuk membentuk beberapa subset data secara acak serta pemilihan sejumlah variabel prediktor secara acak pada setiap proses pembentukan pohon. Sementara itu, Double Random Forest merupakan pengembangan dari Random Forest yang menerapkan dua tahap pengacakan dalam proses pembentukan model untuk meningkatkan keragaman antar pohon dan kemampuan prediksi. Kedua metode tersebut dapat digunakan untuk permasalahan klasifikasi maupun regresi.
  Implementasi Random Forest dan Double Random Forest untuk klasifikasi dilakukan dengan membangun sejumlah pohon keputusan berdasarkan data latih, kemudian menentukan hasil prediksi melalui suara mayoritas (majority voting) dari seluruh pohon. Sementara itu, pada regresi, hasil prediksi diperoleh melalui rata-rata nilai prediksi dari seluruh pohon yang terbentuk. Implementasi kedua metode diawali dengan membagi data menjadi data latih dan data uji, menentukan parameter model, seperti jumlah pohon (number of trees) dan jumlah variabel yang dipertimbangkan pada setiap pemisahan (mtry), kemudian melakukan proses pelatihan dan prediksi menggunakan masing-masing metode.
  Evaluasi performa model dilakukan dengan menggunakan ukuran evaluasi yang disesuaikan dengan jenis permasalahan. Pada klasifikasi, evaluasi dapat menggunakan accuracy, precision, recall, F1-score, dan confusion matrix, sedangkan pada regresi dapat menggunakan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (R²). Selain itu, Out-of-Bag (OOB) error digunakan untuk mengukur kesalahan prediksi berdasarkan pengamatan yang tidak terpilih dalam proses bootstrap pada setiap pohon, sehingga evaluasi dapat dilakukan tanpa memerlukan data validasi tambahan. Perbandingan Random Forest dan Double Random Forest dilakukan berdasarkan hasil evaluasi tersebut untuk mengetahui metode yang memberikan performa prediksi terbaik.
  Berdasarkan seluruh tahapan analisis yang telah dilakukan, metode Random Forest Classification berhasil diterapkan pada data simulasi Friedman1 sebanyak 200 observasi dengan menggunakan 10 variabel prediktor yang dikategorikan menjadi Rendah dan Tinggi berdasarkan nilai median data training sebesar 14,42483. Pengujian dilakukan menggunakan sembilan kombinasi parameter, yaitu mtry sebesar 2, 3, dan 5 serta jumlah pohon sebanyak 200, 500, dan 1.000. Hasil evaluasi menunjukkan bahwa Model 4 dengan parameter mtry = 2 dan num.trees = 500 merupakan model terbaik dengan nilai accuracy sebesar 86,67%, precision sebesar 83,33%, recall sebesar 93,75%, F1-score sebesar 88,24%, dan OOB error sebesar 19,29%. Hasil variable importance menunjukkan bahwa X4 merupakan variabel paling dominan, diikuti oleh X2, sehingga kedua variabel tersebut memberikan kontribusi relatif terbesar dalam proses klasifikasi. Dengan demikian, Random Forest Classification mampu menghasilkan performa klasifikasi yang cukup baik pada data Friedman1, dengan Model 4 sebagai konfigurasi terbaik berdasarkan keseimbangan nilai accuracy dan F1-score, serta didukung oleh hasil identifikasi variabel yang paling berpengaruh.
   

DAFTAR PUSTAKA

Breiman, L. (2001). Random forests. Machine Learning, 45, 5–32. Fransiska, H. (2026). Modul praktikum machine learning and modern prediction. Universitas Bengkulu. Han, S., Kim, H., & Lee, Y. S. (2020). Double random forest. Machine Learning, 109, 1569–1586. Rais, Soleh, A. M., & Susetyo, B. (2024). Rotation double random forest algorithm to predict the food insecurity status of households. Jurnal RESTI (Rekayasa Sistem dan Teknologi Informasi), 8(1), 33–41.