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. 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. 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
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!
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.
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
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).
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.
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.
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.
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
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.
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
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.
# 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]]
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
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
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.
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
)
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.
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))
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.
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
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.
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
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.
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))
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.
# 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
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.
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%.
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
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