Metode Random Forest (RF) merupakan metode pembelajaran mesin yang termasuk dalam kelompok ensemble learning dengan menggabungkan sejumlah pohon keputusan untuk menghasilkan prediksi. Metode RF membangun setiap pohon menggunakan sampel bootstrap yang diambil secara acak dari data pelatihan. Metode ini juga memilih sebagian variabel prediktor secara acak pada setiap proses pemisahan simpul untuk menghasilkan pohon yang beragam. Hasil prediksi seluruh pohon digabungkan melalui mekanisme suara terbanyak pada klasifikasi dan nilai rata-rata pada regresi. Penggabungan tersebut membantu mengurangi varians model dan meningkatkan kestabilan hasil prediksi (Pargent dkk., 2023).
Metode Double Random Forest (DRF) merupakan pengembangan metode RF yang bertujuan mengatasi kondisi underfitting akibat ukuran pohon keputusan yang belum cukup besar. Metode DRF menggunakan seluruh data pelatihan untuk membangun setiap pohon keputusan, sedangkan pengambilan sampel bootstrap dilakukan pada setiap simpul untuk menentukan aturan pemisahan. Metode ini juga memilih sebagian variabel prediktor secara acak pada setiap simpul. Mekanisme tersebut memungkinkan pembentukan pohon yang lebih besar dan beragam sehingga dapat mengurangi bias prediksi ketika model RF mengalami underfitting (Purwanto dkk., 2025).
Program R dapat digunakan untuk menerapkan metode Random Forest (RF) dan Double Random Forest (DRF) dalam pemodelan klasifikasi. Kedua metode tersebut membentuk sejumlah pohon keputusan yang menghasilkan prediksi berdasarkan karakteristik variabel prediktor. Metode RF menggunakan teknik bootstrap sampling pada pembentukan setiap pohon, sedangkan DRF menggunakan seluruh data pelatihan pada simpul akar dan menerapkan bootstrap sampling pada setiap simpul untuk menentukan pemisahan pohon. Kedua metode menghasilkan prediksi akhir melalui penggabungan hasil klasifikasi seluruh pohon menggunakan mekanisme suara terbanyak. Penerapan kedua metode memungkinkan perbandingan kemampuan klasifikasi berdasarkan ukuran evaluasi model (Rais dkk., 2024).
Berdasarkan latar belakang di atas dapat disimpulkan bahwa rumusan masalah sebagai berikut:
Berdasarkan rumusan masalah di atas, tujuan penelitian yang dapat disimpulkan sebagai berikut:
Adapun manfaat yang diperoleh dari penelitian ini adalah sebagai berikut:
Bagi Penulis
Menambah pengetahuan dan pemahaman mengenai metode Random Forest dan Double Random Forest sebagai metode ensemble learning untuk klasifikasi.
Meningkatkan kemampuan dalam menerapkan metode Random Forest dan Double Random Forest menggunakan program R serta mengevaluasi dan membandingkan kinerja kedua metode berdasarkan ukuran evaluasi klasifikasi.
Bagi Pembaca
Menambah wawasan mengenai konsep, mekanisme, dan penerapan metode Random Forest dan Double Random Forest dalam permasalahan klasifikasi.
apat menjadi rujukan bagi penelitian selanjutnya.
Adapun batasan masalah pada penelitian ini yaitu, lakukan analisis Random Forest secara lengkap mulai dari persiapan data, pembentukan model, prediksi, evaluasi, visualisasi, dan interpretasi. Gunakan set.seed(234) agar hasil dapat direproduksi. NPM Ganjil: 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.
Adapun sistematika penulisan dari praktikum ini adalah sebagai berikut:
BAB I PENDAHULUAN
Bab ini merupakan bab yang memuat latar belakang penelitian, rumusan masalah, tujuan dan manfaat penelitian, batasan masalah penelitian, dan sistematika penelitian.
BAB II TINJAUAN PUSTAKA
Bab ini merupakan bab yang memuat pengertian dari teori yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB III METODE PENELITIAN
Bab ini merupakan bab yang memuat uraian mengenai jenis dan sumber penelitian, variabel penelitian, dan analisis data.
BAB IV HASIL DAN PEMBAHASAN
Bab ini merupakan bab yang memuat hasil analisis, pembahasan dari hasil yang telah diperoleh, dan interpretasi.
BAB V KESIMPULAN DAN SARAN
Bab ini merupakan bab yang memuat rangkuman dari hasil keseluruhan dan saran yang diberikan oleh penulis terhadap hasil maupun analisis yang telah dilakukan.
DAFTAR PUSTAKA
Metode Random Forest merupakan metode pembelajaran mesin yang termasuk dalam kelompok ensemble learning. Metode ini menggabungkan sejumlah pohon keputusan (decision tree) untuk menghasilkan prediksi yang lebih stabil. Setiap pohon dibangun menggunakan sampel bootstrap yang diambil secara acak dari data pelatihan. Hasil prediksi seluruh pohon kemudian digabungkan menggunakan nilai modus untuk klasifikasi dan nilai rata-rata untuk regresi. Penggabungan tersebut bertujuan mengurangi varians dan meningkatkan kemampuan prediksi model (Pargent dkk., 2023).
Metode Random Forest menerapkan dua mekanisme pengacakan dalam pembentukan pohon keputusan. Mekanisme pertama menggunakan pengambilan sampel bootstrap untuk membentuk kumpulan data pada setiap pohon. Mekanisme kedua memilih sejumlah variabel prediktor secara acak pada setiap pemisahan simpul. Pemilihan variabel secara acak mengurangi kemiripan antarpohon sehingga setiap pohon dapat menghasilkan pola prediksi yang berbeda. Proses tersebut membantu meningkatkan efektivitas penggabungan prediksi dan kemampuan generalisasi model (Scornet & Hooker, 2026).
Proses pembentukan pohon keputusan pada metode Random Forest menggunakan kriteria tertentu untuk menentukan pemisahan simpul. Kriteria indeks Gini mengukur tingkat ketidakmurnian kelas pada setiap simpul berdasarkan proporsi anggota kelas. Nilai indeks Gini yang lebih kecil menunjukkan tingkat kemurnian kelas yang lebih tinggi. Metode Random Forest memilih pemisahan variabel yang menghasilkan penurunan ketidakmurnian terbesar. Model ini juga menyediakan ukuran kepentingan variabel (variable importance) untuk mengetahui kontribusi setiap variabel prediktor terhadap hasil klasifikasi (Chen dkk., 2024).
Misalkan tersedia data latih yang akan digunakan untuk membentuk sebanyak \(B\) pohon keputusan (tree). Secara sederhana, proses pembentukan Random Forest dilakukan melalui tahapan berikut (Fransiska, 2026).
Mengambil sampel bootstrap dari data latih untuk membentuk data bagi pohon ke-\(b\).
Memilih sebanyak \(mtry\) prediktor secara acak dari seluruh \(p\) prediktor pada setiap simpul (node).
Menentukan pemisahan terbaik (best split) berdasarkan prediktor yang terpilih.
Menumbuhkan pohon keputusan hingga memenuhi aturan penghentian, misalnya ukuran minimum simpul (minimum node size).
Mengulangi proses tersebut hingga diperoleh sebanyak \(B\) pohon, kemudian menggabungkan seluruh hasil prediksi pohon.
Untuk kasus klasifikasi, hasil akhir diperoleh melalui mekanisme 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) \]
Metode Random Forest termasuk dalam parallel ensemble karena setiap pohon keputusan dibangun secara relatif independen. Karakteristik tersebut membedakan Random Forest dari metode Boosting yang membangun model secara berurutan (sequential).
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 melalui tahapan berikut (Fransiska, 2026).
Pada proses pengambilan sampel bootstrap (bootstrap sampling), sampel berukuran \(n\) diambil dengan pengembalian (with replacement) dari \(n\) observasi data latih. Proses tersebut memungkinkan beberapa observasi 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 melalui perhitungan 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).
Jenis data pada penelitian ini adalah data numerik. Data numerik adalah jenis data yang terdiri dari angka dan dapat diukur atau dihitung secara kuantitatif. Data ini digunakan untuk merepresentasikan nilai atau ukuran tertentu dalam berbagai konteks, seperti sains, ekonomi, statistik, dan matematika. Data numerik sering digunakan untuk melakukan perhitungan, analisis, dan visualisasi data.
Dalam laporan ini sumber data yang digunakan adalah sumber data dalam wujud data sekunder, yaitu data yang telah dikumpulkan dan disusun oleh pihak lain di luar praktikan itu sendiri. Data pada praktikum ini yaitu dataset Friedman yang tersedia di R, dimana penelitian ini menggunakan data kuantitatif simulasi yang dibangkitkan secara komputasional menggunakan fungsi mlbench.friedman1() dari paket mlbench pada perangkat lunak R.
Variabel adalah simbol, karakteristik, atau atribut yang dapat diukur atau diamati dalam sebuah penelitian atau eksperimen. Pada laporan ini terdapat 1 batasan masalah. Variabel penelitian yang digunakan terdiri atas satu variabel respons kontinu, yaitu \(Y\), dan sepuluh variabel prediktor numerik, yaitu \(X_1\) sampai \(X_{10}\). Variabel \(X_1\) sampai \(X_5\) memiliki hubungan dengan variabel respons, sedangkan \(X_6\) sampai \(X_{10}\) berperan sebagai variabel tambahan yang tidak memiliki pengaruh langsung terhadap respons.
Langkah-langkah yang digunakan pada penelitian untuk batasan masalah adalah sebagai berikut:
Berikut adalah algoritma untuk menyelesaikan batasan masalah.
mtry dan
num.trees.ranger().library(ranger)
library(mlbench)
library(caret)
library(knitr)
set.seed(234)
reg.data <- as.data.frame(mlbench.friedman1(200))
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
Berdasarkan hasil pembentukan dataset menggunakan fungsi
mlbench.friedman1() dengan 200 pengamatan, diperoleh data
sebanyak 200 baris dan 11 kolom. Dataset tersebut terdiri atas
10 variabel prediktor, yaitu x.1 hingga x.10,
serta satu variabel respons, yaitu y. Hasil pemeriksaan
struktur data menunjukkan bahwa seluruh variabel bertipe numerik
(numeric). Ringkasan statistik menunjukkan bahwa variabel
prediktor memiliki nilai minimum dan maksimum pada rentang 0 hingga 1,
sedangkan variabel respon y memiliki nilai minimum sebesar
3,082, maksimum sebesar 26,146, dan rata-rata sebesar 14,270. Hasil
tersebut menunjukkan bahwa dataset berhasil dibentuk dan
memiliki struktur yang sesuai untuk analisis Random Forest
Regression.
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
Pembagian data dilakukan dengan proporsi 70% untuk data pelatihan (training) dan 30% untuk data pengujian (testing). Hasil pembagian menunjukkan bahwa data pelatihan terdiri atas 140 pengamatan dan 11 variabel, sedangkan data pengujian terdiri atas 60 pengamatan dan 11 variabel. Data pelatihan digunakan untuk membangun model Random Forest Regression, sedangkan data pengujian digunakan untuk mengevaluasi kemampuan prediksi model terhadap data yang tidak digunakan selama proses pelatihan.
grid <- expand.grid(
mtry = c(2, 3, 5),
num.trees = c(200, 500, 1000)
)
grid$Model <- paste0("mtry=", grid$mtry, ", trees=", grid$num.trees)
model.list <- vector("list", nrow(grid))
names(model.list) <- grid$Model
for (i in seq_len(nrow(grid))) {
set.seed(234)
model.list[[i]] <- ranger(
y ~ ., data = reg.train,
num.trees = grid$num.trees[i],
mtry = grid$mtry[i],
min.node.size = 5,
replace = TRUE,
sample.fraction = 1,
importance = "permutation",
seed = 234
)
}
# Contoh ringkasan satu model (mtry = 3, num.trees = 500)
model.list[["mtry=3, trees=500"]]
## Ranger result
##
## Call:
## ranger(y ~ ., data = reg.train, num.trees = grid$num.trees[i], mtry = grid$mtry[i], min.node.size = 5, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Regression
## Number of trees: 500
## Sample size: 140
## Number of independent variables: 10
## Mtry: 3
## Target node size: 5
## Variable importance mode: permutation
## Splitrule: variance
## OOB prediction error (MSE): 7.442423
## R squared (OOB): 0.7198089
Pembentukan sembilan model Random Forest Regression
dilakukan dengan mengombinasikan tiga nilai mtry, yaitu 2,
3, dan 5, serta tiga jumlah pohon (num.trees), yaitu 200, 500,
dan 1.000. Hasil ringkasan salah satu model dengan mtry = 3
dan num.trees = 500 menunjukkan bahwa model dibangun
menggunakan 140 pengamatan dan 10 variabel prediktor. Model tersebut
menghasilkan nilai OOB MSE sebesar 7,4424 dan OOB \(R^2\) sebesar 0,7198. Nilai OOB MSE
menunjukkan besarnya rata-rata kuadrat kesalahan prediksi, sedangkan OOB
\(R^2\) sebesar 0,7198 menunjukkan
bahwa model mampu menjelaskan sekitar 71,98% variasi pada variabel
respons berdasarkan prediksi OOB. Hasil tersebut menunjukkan bahwa model
telah mampu menangkap sebagian besar pola data, meskipun masih terdapat
sekitar 28,02% variasi yang belum dapat dijelaskan oleh model.
oob.tbl <- data.frame(
mtry = grid$mtry,
num.trees = grid$num.trees,
OOB_MSE = sapply(model.list, function(m) m$prediction.error),
OOB_R2 = sapply(model.list, function(m) m$r.squared)
)
rownames(oob.tbl) <- NULL
kable(round(oob.tbl, 4), caption = "Tabel 4.1 OOB MSE dan OOB R-square sembilan model")
| mtry | num.trees | OOB_MSE | OOB_R2 |
|---|---|---|---|
| 2 | 200 | 8.2222 | 0.6905 |
| 3 | 200 | 7.7097 | 0.7097 |
| 5 | 200 | 7.0632 | 0.7341 |
| 2 | 500 | 8.1267 | 0.6940 |
| 3 | 500 | 7.4424 | 0.7198 |
| 5 | 500 | 6.8750 | 0.7412 |
| 2 | 1000 | 8.0553 | 0.6967 |
| 3 | 1000 | 7.3547 | 0.7231 |
| 5 | 1000 | 6.8260 | 0.7430 |
oob.best <- oob.tbl[which.min(oob.tbl$OOB_MSE), ]
oob.best
## mtry num.trees OOB_MSE OOB_R2
## 9 5 1000 6.82596 0.7430173
Berdasarkan Tabel 4.1, hasil evaluasi internal menunjukkan bahwa
nilai OOB MSE dan OOB \(R^2\) berbeda
pada setiap kombinasi parameter. Model dengan mtry = 5
secara konsisten menghasilkan OOB MSE lebih rendah dan OOB \(R^2\) lebih tinggi dibandingkan kombinasi
mtry lainnya. Model terbaik berdasarkan OOB MSE terkecil
diperoleh pada kombinasi mtry = 5 dan
num.trees = 1000, dengan nilai OOB MSE sebesar 6,8260 dan
OOB \(R^2\) sebesar 0,7430. Nilai
tersebut menunjukkan bahwa model mampu menjelaskan sekitar 74,30%
variasi variabel respons berdasarkan prediksi OOB. Hasil ini menunjukkan
bahwa kombinasi lima prediktor pada setiap simpul dan 1.000 pohon
memberikan kinerja evaluasi internal terbaik di antara sembilan model
yang dibentuk.
pred.list <- lapply(model.list, function(m) {
predict(m, data = reg.test)$predictions
})
actual.reg <- reg.test$y
# Contoh tabel aktual, prediksi, dan residual (mtry = 3, num.trees = 500)
p.contoh <- pred.list[["mtry=3, trees=500"]]
hasil.rf.reg <- data.frame(
Aktual = actual.reg,
Prediksi = p.contoh,
Residual = actual.reg - p.contoh
)
kable(round(head(hasil.rf.reg, 10), 4),
caption = "Tabel 4.2 Sepuluh baris pertama hasil prediksi (mtry = 3, num.trees = 500)")
| Aktual | Prediksi | Residual |
|---|---|---|
| 10.2323 | 12.4553 | -2.2230 |
| 11.8453 | 10.6177 | 1.2276 |
| 10.3357 | 13.2295 | -2.8938 |
| 16.7273 | 13.3676 | 3.3597 |
| 25.0771 | 19.5281 | 5.5490 |
| 15.4469 | 14.2547 | 1.1922 |
| 15.6429 | 12.6247 | 3.0182 |
| 7.1108 | 12.8245 | -5.7136 |
| 13.3513 | 15.3894 | -2.0382 |
| 12.8720 | 14.6205 | -1.7486 |
eval.fun <- function(actual, pred) {
MSE <- mean((actual - pred)^2)
RMSE <- sqrt(MSE)
MAE <- mean(abs(actual - pred))
R2 <- 1 - sum((actual - pred)^2) / sum((actual - mean(actual))^2)
c(MSE = MSE, RMSE = RMSE, MAE = MAE, R_Square = R2)
}
eval.mat <- t(sapply(pred.list, eval.fun, actual = actual.reg))
eval.tbl <- data.frame(
Model = grid$Model,
mtry = grid$mtry,
num.trees = grid$num.trees,
OOB_MSE = oob.tbl$OOB_MSE,
eval.mat
)
rownames(eval.tbl) <- NULL
kable(cbind(eval.tbl[, 1:3], round(eval.tbl[, 4:8], 4)),
caption = "Tabel 4.3 Perbandingan performa data testing sembilan model")
| Model | mtry | num.trees | OOB_MSE | MSE | RMSE | MAE | R_Square |
|---|---|---|---|---|---|---|---|
| mtry=2, trees=200 | 2 | 200 | 8.2222 | 7.8700 | 2.8054 | 2.3414 | 0.6717 |
| mtry=3, trees=200 | 3 | 200 | 7.7097 | 7.8139 | 2.7953 | 2.2981 | 0.6740 |
| mtry=5, trees=200 | 5 | 200 | 7.0632 | 7.6596 | 2.7676 | 2.2726 | 0.6805 |
| mtry=2, trees=500 | 2 | 500 | 8.1267 | 8.1774 | 2.8596 | 2.3832 | 0.6589 |
| mtry=3, trees=500 | 3 | 500 | 7.4424 | 7.8278 | 2.7978 | 2.3058 | 0.6734 |
| mtry=5, trees=500 | 5 | 500 | 6.8750 | 7.3826 | 2.7171 | 2.2312 | 0.6920 |
| mtry=2, trees=1000 | 2 | 1000 | 8.0553 | 8.1181 | 2.8492 | 2.3794 | 0.6613 |
| mtry=3, trees=1000 | 3 | 1000 | 7.3547 | 7.7780 | 2.7889 | 2.2996 | 0.6755 |
| mtry=5, trees=1000 | 5 | 1000 | 6.8260 | 7.1925 | 2.6819 | 2.2054 | 0.6999 |
best.rmse <- eval.tbl[which.min(eval.tbl$RMSE), ]
best.mae <- eval.tbl[which.min(eval.tbl$MAE), ]
best.r2 <- eval.tbl[which.max(eval.tbl$R_Square), ]
konsisten <- identical(best.rmse$Model, best.mae$Model) &&
identical(best.rmse$Model, best.r2$Model)
# Rata-rata RMSE menurut mtry dan menurut num.trees
rmse.mtry <- tapply(eval.tbl$RMSE, eval.tbl$mtry, mean)
rmse.mtry
## 2 3 5
## 2.838067 2.794024 2.722189
rmse.trees <- tapply(eval.tbl$RMSE, eval.tbl$num.trees, mean)
rmse.trees
## 200 500 1000
## 2.789430 2.791511 2.773339
Berdasarkan Tabel 4.2, hasil prediksi model dengan
mtry = 3 dan num.trees = 500 menunjukkan
adanya perbedaan antara nilai aktual dan prediksi pada setiap
pengamatan. Perbedaan tersebut tercermin pada nilai residual yang
menunjukkan besarnya kesalahan prediksi model. Berdasarkan Tabel 4.3,
model terbaik pada data pengujian diperoleh dari kombinasi
mtry = 5 dan num.trees = 1000, dengan nilai
MSE sebesar 7,1925, RMSE sebesar 2,6819, MAE sebesar 2,2054, dan \(R^2\) sebesar 0,6999. Model tersebut
menghasilkan nilai galat paling rendah dan \(R^2\) paling tinggi dibandingkan delapan
model lainnya. Hasil perbandingan rata-rata RMSE menunjukkan bahwa nilai
terendah diperoleh pada mtry = 5, yaitu 2,7222, sedangkan
berdasarkan jumlah pohon, nilai terendah diperoleh pada 1.000 pohon,
yaitu 2,7733. Hasil tersebut menunjukkan bahwa penggunaan lima prediktor
pada setiap simpul dan 1.000 pohon menghasilkan kinerja prediksi terbaik
pada data pengujian.
par(mfrow = c(3, 3), mar = c(4, 4, 3, 1))
for (i in seq_len(nrow(grid))) {
plot(actual.reg, pred.list[[i]],
pch = 19,
col = "#2878B5",
xlab = "Nilai Aktual",
ylab = "Nilai Prediksi",
main = grid$Model[i],
cex.main = 0.9,
cex = 0.8)
abline(a = 0, b = 1,
col = "#D9534F",
lty = 2,
lwd = 2)
}
Gambar 4.1 Plot Nilai Aktual vs Prediksi Sembilan Model
par(mfrow = c(1, 1))
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.
par(
mfrow = c(3, 3),
mar = c(4.2, 4.2, 3, 1),
oma = c(0, 0, 1, 0),
bg = "white"
)
for (i in seq_len(nrow(grid))) {
res <- actual.reg - pred.list[[i]]
plot(
pred.list[[i]], res,
pch = 21,
bg = adjustcolor("#65B3A5", alpha.f = 0.75),
col = "#287C75",
cex = 1.1,
xlab = "Nilai Prediksi",
ylab = "Residual",
main = grid$Model[i],
cex.main = 0.95,
cex.lab = 0.9,
cex.axis = 0.85,
col.lab = "#333333",
col.axis = "#444444",
bty = "l",
las = 1
)
abline(
h = 0,
col = "#B05A83",
lty = 2,
lwd = 2
)
grid(col = "#EAEAEA", lty = 1)
}
Gambar 4.2 Residual plot sembilan model
par(mfrow = c(1, 1))
res.best <- actual.reg - pred.list[[best.rmse$Model]]
mean.res <- mean(res.best)
cor.res <- cor(pred.list[[best.rmse$Model]], res.best)
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.
par(mfrow = c(1, 2), mar = c(9, 4, 3, 1))
# Grafik RMSE
barplot(
eval.tbl$RMSE,
names.arg = eval.tbl$Model,
las = 2, col = colorRampPalette(c("#176B67", "#B9DED7"))(9),
border = NA, cex.names = 0.65,
main = "RMSE Data Testing",
ylab = "RMSE",
ylim = c(0, max(eval.tbl$RMSE) * 1.1)
)
# Grafik R-Square
barplot(
eval.tbl$R_Square,
names.arg = eval.tbl$Model,
las = 2, col = colorRampPalette(c("#594477", "#D8CBEA"))(9),
border = NA, cex.names = 0.65,
main = "R-Square Data Testing",
ylab = "R-Square",
ylim = c(0, max(eval.tbl$R_Square) * 1.1)
)
Gambar 4.3 Perbandingan RMSE dan R-square Sembilan Model pada Data Testing
par(mfrow = c(1, 1))
Berdasarkan Gambar 4.3, perbandingan nilai RMSE dan \(R^2\) menunjukkan adanya perbedaan kinerja
pada sembilan model Random Forest. Grafik RMSE memperlihatkan
tingkat kesalahan prediksi setiap model, dengan nilai yang lebih rendah
menunjukkan hasil prediksi yang lebih baik. Sebaliknya, grafik \(R^2\) menunjukkan kemampuan model dalam
menjelaskan variasi variabel respons, dengan nilai yang lebih tinggi
menunjukkan kemampuan penjelasan yang lebih baik. Kedua grafik tersebut
digunakan untuk membandingkan kinerja model berdasarkan hasil prediksi
pada data pengujian. Model dengan kombinasi mtry = 5 dan
num.trees = 1000 memberikan kinerja terbaik karena
menghasilkan RMSE terendah sebesar 2,6819 dan \(R^2\) tertinggi sebesar 0,6999.
# Menghitung permutation importance seluruh model
imp.mat <- sapply(model.list, function(m) m$variable.importance)
# Menyusun tabel importance
tabel.importance <- data.frame(
Variabel = rownames(imp.mat),
round(imp.mat, 4),
check.names = FALSE
)
kable(
tabel.importance,
caption = "Tabel 4.4 Perbandingan Permutation Importance pada Sembilan Model Random Forest"
)
| Variabel | mtry=2, trees=200 | mtry=3, trees=200 | mtry=5, trees=200 | mtry=2, trees=500 | mtry=3, trees=500 | mtry=5, trees=500 | mtry=2, trees=1000 | mtry=3, trees=1000 | mtry=5, trees=1000 | |
|---|---|---|---|---|---|---|---|---|---|---|
| x.1 | x.1 | 7.0564 | 7.9614 | 9.4340 | 7.2812 | 8.1718 | 9.2110 | 7.3275 | 8.1834 | 9.3875 |
| x.2 | x.2 | 4.1035 | 3.4578 | 3.2554 | 3.9788 | 3.5563 | 3.4368 | 3.8267 | 3.5780 | 3.8211 |
| x.3 | x.3 | 2.6306 | 1.7999 | 1.6639 | 2.7030 | 2.2339 | 1.7405 | 2.5764 | 2.2834 | 1.8255 |
| x.4 | x.4 | 10.3007 | 10.9366 | 12.3287 | 9.5898 | 11.0137 | 12.7425 | 9.4642 | 10.9812 | 12.9314 |
| x.5 | x.5 | 1.4976 | 0.8012 | 0.8824 | 1.3159 | 1.0121 | 0.8821 | 1.2285 | 1.0931 | 0.9720 |
| x.6 | x.6 | 0.2439 | -0.1421 | 0.2234 | 0.0871 | -0.1326 | 0.1440 | -0.0503 | -0.1254 | 0.1000 |
| x.7 | x.7 | -0.1685 | -0.2916 | -0.1249 | -0.2258 | -0.1669 | -0.1648 | -0.2479 | -0.1486 | -0.1430 |
| x.8 | x.8 | 0.0160 | 0.0552 | 0.1128 | -0.0801 | -0.1014 | -0.0339 | -0.1915 | -0.1094 | -0.0096 |
| x.9 | x.9 | -0.2266 | -0.1151 | -0.1027 | 0.0352 | -0.0368 | -0.0768 | 0.0270 | -0.1269 | -0.0802 |
| x.10 | x.10 | 0.2389 | 0.1206 | -0.1028 | 0.2882 | 0.1533 | 0.0325 | 0.0591 | 0.0788 | 0.0976 |
# Mengambil model dengan RMSE terkecil
importance.best <- model.list[[best.rmse$Model]]$variable.importance
# Mengurutkan variabel berdasarkan importance
importance.best <- sort(importance.best, decreasing = TRUE)
# Membuat grafik
barplot(
rev(importance.best),
horiz = TRUE,
las = 1,
col = colorRampPalette(c("#B9DED7", "#176B67"))(length(importance.best)),
border = NA,
main = paste("Variable Importance -", best.rmse$Model),
xlab = "Permutation Importance",
cex.names = 0.85
)
# Memisahkan variabel signal dan noise
signal <- paste0("x.", 1:5)
noise <- paste0("x.", 6:10)
# Mengambil lima variabel dengan importance tertinggi
top5 <- head(names(importance.best), 5)
# Memeriksa apakah lima variabel teratas merupakan signal
top5.true <- all(top5 %in% signal)
# Menghitung nilai importance
nilai.signal <- importance.best[signal]
nilai.noise <- importance.best[noise]
# Menyusun tabel hasil identifikasi
hasil.identifikasi <- data.frame(
Keterangan = c(
"Lima variabel dengan importance tertinggi",
"Seluruh variabel top 5 merupakan signal",
"Importance terendah variabel signal",
"Importance tertinggi variabel noise"
),
Hasil = c(
paste(top5, collapse = ", "),
ifelse(top5.true, "Ya", "Tidak"),
round(min(nilai.signal), 4),
round(max(nilai.noise), 4)
)
)
kable(
hasil.identifikasi,
caption = "Tabel 4.5 Hasil Identifikasi Variabel Signal dan Noise"
)
| Keterangan | Hasil |
|---|---|
| Lima variabel dengan importance tertinggi | x.4, x.1, x.2, x.3, x.5 |
| Seluruh variabel top 5 merupakan signal | Ya |
| Importance terendah variabel signal | 0.972 |
| Importance tertinggi variabel noise | 0.1 |
Berdasarkan Tabel 4.4 dan Tabel 4.5, hasil permutation importance menunjukkan bahwa variabel x.4 memiliki tingkat kepentingan tertinggi, diikuti oleh x.1, x.2, x.3, dan x.5 pada model Random Forest terbaik. Kelima variabel tersebut merupakan variabel signal yang digunakan dalam pembentukan respons pada data Friedman #1. Hasil identifikasi juga menunjukkan bahwa seluruh lima variabel dengan nilai importance tertinggi berasal dari kelompok signal. Nilai importance terendah pada variabel signal sebesar 0,972, sedangkan nilai tertinggi pada variabel noise hanya sebesar 0,1. Temuan ini menunjukkan bahwa model mampu membedakan variabel yang memberikan informasi terhadap variabel respons dari variabel yang tidak memiliki kontribusi berarti dalam proses prediksi.
terbaik <- eval.tbl[which.min(eval.tbl$RMSE), ]
kable(cbind(terbaik[, 1:3], round(terbaik[, 4:8], 4)),
caption = "Tabel 4.5 Model terbaik berdasarkan RMSE data testing", row.names = FALSE)
| Model | mtry | num.trees | OOB_MSE | MSE | RMSE | MAE | R_Square |
|---|---|---|---|---|---|---|---|
| mtry=5, trees=1000 | 5 | 1000 | 6.826 | 7.1925 | 2.6819 | 2.2054 | 0.6999 |
Berdasarkan Tabel 4.5, model terbaik berdasarkan nilai RMSE terkecil pada data testing diperoleh dari kombinasi parameter mtry = 5 dan num.trees = 1000. Model tersebut menghasilkan nilai OOB_MSE sebesar 6,826, MSE sebesar 7,1925, RMSE sebesar 2,6819, dan MAE sebesar 2,2054. Nilai R-Square sebesar 0,6999 menunjukkan bahwa model mampu menjelaskan 69,99% variasi pada variabel respons, sedangkan 30,01% sisanya dijelaskan oleh faktor lain di luar model. Hasil ini menunjukkan bahwa kombinasi parameter tersebut memberikan kinerja prediksi terbaik dibandingkan model lainnya berdasarkan nilai RMSE pada data testing.
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^2\)). 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^2\) 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 = 1000 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%.
Penulis menyarankan agar ketepatan sintaks program R selalu diperhatikan untuk menghindari kesalahan dalam proses analisis. Penggunaan bahasa perlu disesuaikan dengan kaidah KBBI. Aturan penulisan huruf tebal juga perlu diperhatikan agar laporan tersusun secara sistematis, rapi, dan sesuai dengan kaidah penulisan ilmiah.
Chen, Y., Cheung, K. C., Sun, R. Z., & Yam, S. C. P. (2024). A user guide of CART and random forests with applications in FinTech and InsurTech. Japanese Journal of Statistics and Data Science, 7(2), 999–1038.
Fransiska, H. (2026). Modul praktikum machine learning. Universitas Bengkulu.
Pargent, F., Schoedel, R., & Stachl, C. (2023). Best practices in supervised machine learning: A tutorial for psychologists. Advances in Methods and Practices in Psychological Science, 6(3).
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: Jurnal Ilmu Matematika dan Terapan, 19(1), 227–236.
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.
Scornet, E., & Hooker, G. (2026). Theory of Random Forests. Annual Review of Statistics and Its Application, 13, 99–121.