Random Forest (RF) merupakan metode ensemble learning berbasis decision tree yang menggabungkan banyak pohon keputusan yang dibangun dari sampel bootstrap (Anisha dkk., 2023; Syarip dkk., 2025). RF memungkinkan terbentuknya model CART yang lebih baik, tetapi sering mengalami underfitting, terutama pada ukuran node yang kecil. Double Random Forest (DRF) dikembangkan untuk mengatasi underfitting tersebut dengan melakukan bootstrap pada setiap node, bukan hanya sekali di node akar seperti pada RF, sehingga menghasilkan pohon yang lebih beragam dan prediksi yang lebih akurat (Purwanto dkk., 2025).
RF dapat digunakan untuk tugas klasifikasi dan regresi (Ramelan & Hakim, 2025; Syarip dkk., 2025), sedangkan DRF telah diterapkan pada klasifikasi multikelas (Aldania dkk., 2023) dan dibandingkan dengan RF pada data putus sekolah madrasah (Purwanto dkk., 2025). Performa RF dievaluasi menggunakan Out-of-Bag (OOB) error, yaitu proporsi kesalahan prediksi pada data OOB yang tidak terpilih dalam sampel bootstrap, dan semakin kecil OOB error maka prediksi semakin akurat (Anisha dkk., 2023; Syarip dkk., 2025). Namun, kajian tentang DRF masih terbatas, karena Zaenal dkk. (2024) mencatat DRF hanya ditemukan dalam 10 publikasi, sedangkan RF dalam 20.900 publikasi.
Berdasarkan uraian tersebut, diperlukan kajian yang menjelaskan RF dan DRF sebagai metode ensemble learning berbasis decision tree. Kajian ini perlu menunjukkan cara mengimplementasikan RF dan DRF pada kasus klasifikasi dan regresi. Kajian ini juga perlu mengevaluasi performa model menggunakan OOB error untuk membandingkan RF dengan DRF. Oleh karena itu, penelitian ini membahas konsep, implementasi, dan evaluasi RF dan DRF berdasarkan OOB error.
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 (Fransiska, 2026).
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 (Fransiska, 2026).
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. Misalkan tersedia data latih \(𝐷 = (x_𝑖,𝑦_𝑖), 𝑖 = 1,2,...,𝑛\) dan akan dibentuk 𝐵 pohon. Secara sederhana, proses Random Forest dilakukan sebagai berikut (Fransiska, 2026):
Double Random Forest (DRF) adalah metode yang diperkenalkan oleh Han, Kim, dan Lee pada tahun 2020. DRF dikembangkan untuk situasi ketika Random Forest masih mengalami underfitting karena tree yang dihasilkan belum cukup besar. Pada Random Forest standar, setiap tree dibentuk menggunakan satu bootstrap sample pada awal tree. Karena satu bootstrap sample hanya mengandung sekitar 63,2% observasi unik, jumlah observasi unik yang tersedia untuk membentuk tree lebih sedikit daripada seluruh data training. Setiap tree DRF dibangun menggunakan seluruh data training, sedangkan bootstrap digunakan sementara pada setiap node untuk mencari aturan split. Secara sederhana, proses Double Random Forest dilakukan sebagai berikut (Fransiska, 2026):
Jenis data yang digunakan pada penelitian ini adalah data kategorik dan numerik. Data kategorik adalah data yang menunjukkan kategori atau kelompok tertentu dan digunakan untuk membedakan karakteristik suatu objek sedangkan data numerik adalah data berbentuk angka yang menunjukkan nilai atau jumlah dan dapat digunakan dalam perhitungan matematis. Sumber data yang diperoleh dalam penelitian ini adalah data sekunder. Data sekunder adalah sekumpulan informasi yang telah ada sebelumnya dan digunakan sebagai pelengkap kebutuhan data penelitian, di mana pada praktikum ini data sekundernya adalah data yang berasal dari program RStudio.
Variabel penelitian adalah segala sesuatu yang akan menjadi objek pengamatan penelitian. Pada laporan ini terdapat 10 variabel yang digunakan pada data. Variabel tersebut, yaitu Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl,cromatin, Normal.nucleoli, Mitoses, dan Class.
## Loading required package: ggplot2
## Loading required package: lattice
## 'data.frame': 699 obs. of 11 variables:
## $ Id : chr "1000025" "1002945" "1015425" "1016277" ...
## $ Cl.thickness : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
## $ Class : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## Length:699 1 :145 1 :384 1 :353 1 :407
## Class :character 5 :130 10 : 67 2 : 59 2 : 58
## Mode :character 3 :108 3 : 52 10 : 58 3 : 58
## 4 : 80 2 : 45 3 : 56 10 : 55
## 10 : 69 4 : 40 4 : 44 4 : 33
## 2 : 50 5 : 30 5 : 34 8 : 25
## (Other):117 (Other): 81 (Other): 95 (Other): 63
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 2 :386 1 :402 2 :166 1 :443 1 :579
## 3 : 72 10 :132 3 :165 10 : 61 2 : 35
## 4 : 48 2 : 30 1 :152 3 : 44 3 : 33
## 1 : 47 5 : 30 7 : 73 2 : 36 10 : 14
## 6 : 41 3 : 28 4 : 40 8 : 24 4 : 12
## 5 : 39 (Other): 61 5 : 34 6 : 22 7 : 9
## (Other): 66 NA's : 16 (Other): 69 (Other): 69 (Other): 17
## Class
## benign :458
## malignant:241
##
##
##
##
##
Dataset BreastCancer dari package mlbench diperoleh sebanyak 699 pengamatan dengan 11 variabel. Variabel tersebut terdiri atas satu variabel identitas (Id), sembilan variabel prediktor, yaitu Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl.cromatin, Normal.nucleoli, dan Mitoses, serta satu variabel target yaitu Class. Variabel Class memiliki dua kategori, yaitu benign dan malignant. Berdasarkan hasil ringkasan data, terdapat 458 pengamatan berkategori benign dan 241 pengamatan berkategori malignant. Selain itu, ditemukan 16 nilai hilang pada variabel Bare.nuclei. Dengan demikian, data tersebut dapat digunakan untuk membangun model klasifikasi setelah dilakukan tahap persiapan data.
## [1] "benign" "malignant"
##
## benign malignant
## 444 239
##
## benign malignant
## 0.6500732 0.3499268
#Membagi data training dan testing
set.seed(234)
idx.cls <- createDataPartition(bc$Class, p = 0.70, list = FALSE)
bc.train <- bc[idx.cls, ]
bc.test <- bc[-idx.cls, ]
dim(bc.train)## [1] 479 10
## [1] 204 10
##
## benign malignant
## 311 168
##
## benign malignant
## 133 71
Pada tahap persiapan data, variabel Id dihapus karena hanya berfungsi sebagai identitas pengamatan dan tidak digunakan sebagai variabel prediktor. Selanjutnya, dilakukan penghapusan pengamatan yang memiliki nilai hilang menggunakan fungsi na.omit(), sehingga jumlah data berkurang dari 699 menjadi 683 pengamatan. Variabel Class kemudian diubah menjadi faktor dan level kategorinya disesuaikan. Berdasarkan hasil pengolahan, diperoleh 444 pengamatan berkategori benign (65,01%) dan 239 pengamatan berkategori malignant (34,99%). Setelah itu, data dibagi menjadi data training dan testing menggunakan fungsi createDataPartition() dengan proporsi 70:30 serta set.seed(234). Hasil pembagian menunjukkan bahwa data training terdiri atas 479 pengamatan dengan 311 benign dan 168 malignant, sedangkan data testing terdiri atas 204 pengamatan dengan 133 benign dan 71 malignant. Pembagian ini mempertahankan proporsi kategori pada kedua kelompok data, sehingga data training digunakan untuk membangun model Random Forest, sementara data testing digunakan untuk mengevaluasi kemampuan model dalam mengklasifikasikan pengamatan baru.
set.seed(234)
mtry.cls <- c(2, 3, 5)
trees.cls <- c(200, 500, 1000)
hasil.model <- list()
for (m in mtry.cls) {
for (n in trees.cls) {
set.seed(234)
rf.cls <- ranger(Class ~ ., data = bc.train,
num.trees = n,
mtry = m,
min.node.size = 1,
replace = TRUE,
sample.fraction = 1,
importance = "permutation",
seed = 234)
nama <- paste0("mtry_", m, "_trees_", n)
hasil.model[[nama]] <- rf.cls
cat("\nModel:", nama, "\n")
print(rf.cls)}}##
## Model: mtry_2_trees_200
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 200
## Sample size: 479
## Number of independent variables: 9
## Mtry: 2
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.92 %
##
## Model: mtry_2_trees_500
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 500
## Sample size: 479
## Number of independent variables: 9
## Mtry: 2
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.92 %
##
## Model: mtry_2_trees_1000
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 1000
## Sample size: 479
## Number of independent variables: 9
## Mtry: 2
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.92 %
##
## Model: mtry_3_trees_200
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 200
## Sample size: 479
## Number of independent variables: 9
## Mtry: 3
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.71 %
##
## Model: mtry_3_trees_500
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 500
## Sample size: 479
## Number of independent variables: 9
## Mtry: 3
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.92 %
##
## Model: mtry_3_trees_1000
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 1000
## Sample size: 479
## Number of independent variables: 9
## Mtry: 3
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.71 %
##
## Model: mtry_5_trees_200
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 200
## Sample size: 479
## Number of independent variables: 9
## Mtry: 5
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.92 %
##
## Model: mtry_5_trees_500
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 500
## Sample size: 479
## Number of independent variables: 9
## Mtry: 5
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.92 %
##
## Model: mtry_5_trees_1000
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = n, mtry = m, min.node.size = 1, replace = TRUE, sample.fraction = 1, importance = "permutation", seed = 234)
##
## Type: Classification
## Number of trees: 1000
## Sample size: 479
## Number of independent variables: 9
## Mtry: 5
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 2.71 %
Pada tahap pembentukan model, dilakukan pengujian terhadap sembilan kombinasi parameter, yaitu mtry = 2, 3, 5 dan num.trees = 200, 500, 1000. Nilai mtry menunjukkan jumlah variabel prediktor yang dipertimbangkan pada setiap pemisahan simpul, sedangkan num.trees menunjukkan jumlah pohon keputusan yang dibentuk dalam model Random Forest. Berdasarkan hasil pengolahan, seluruh model berhasil dibentuk dengan menggunakan 479 data training dan sembilan variabel prediktor. Hasil awal menunjukkan bahwa nilai OOB prediction error berada pada rentang 2,71% hingga 2,92%. Model dengan mtry = 3 dan num.trees = 200 serta model dengan mtry = 3 dan num.trees = 1000 menghasilkan OOB error sebesar 2,71%, yang merupakan nilai kesalahan terkecil pada tahap pembentukan model. Sementara itu, kombinasi parameter lainnya menghasilkan OOB error sebesar 2,92% atau 2,71%.
hasil.oob <- data.frame()
for (nama in names(hasil.model)) {
rf.cls <- hasil.model[[nama]]
hasil.oob <- rbind(hasil.oob,
data.frame(
Model = nama,
OOB_Error = rf.cls$prediction.error,
OOB_Accuracy = 1 - rf.cls$prediction.error
))}
hasil.oob## Model OOB_Error OOB_Accuracy
## 1 mtry_2_trees_200 0.02922756 0.9707724
## 2 mtry_2_trees_500 0.02922756 0.9707724
## 3 mtry_2_trees_1000 0.02922756 0.9707724
## 4 mtry_3_trees_200 0.02713987 0.9728601
## 5 mtry_3_trees_500 0.02922756 0.9707724
## 6 mtry_3_trees_1000 0.02713987 0.9728601
## 7 mtry_5_trees_200 0.02922756 0.9707724
## 8 mtry_5_trees_500 0.02922756 0.9707724
## 9 mtry_5_trees_1000 0.02713987 0.9728601
Pada tahap ini, dilakukan evaluasi internal model menggunakan nilai Out-of-Bag (OOB) Error dan OOB Accuracy. Berdasarkan hasil pengolahan, diperoleh nilai OOB Error berkisar antara 0,0271 hingga 0,0292 atau sekitar 2,71% hingga 2,92%. Nilai OOB Error terendah sebesar 2,71% diperoleh pada model mtry_3_trees_200, mtry_3_trees_1000, dan mtry_5_trees_1000. Ketiga model tersebut memiliki OOB Accuracy sebesar 97,29%. Sementara itu, model lainnya memiliki OOB Error sebesar 2,92% dengan OOB Accuracy sebesar 97,08%. Hasil tersebut menunjukkan bahwa seluruh model memiliki tingkat kesalahan prediksi internal yang relatif rendah. Meskipun demikian, nilai OOB yang rendah belum tentu menunjukkan bahwa model tersebut memiliki performa terbaik pada data testing, sehingga tetap diperlukan evaluasi lanjutan menggunakan Confusion Matrix dan ukuran evaluasi klasifikasi.
hasil.evaluasi <- data.frame()
hasil.cm <- list()
hasil.importance <- list()
for (nama in names(hasil.model)) {
rf.cls <- hasil.model[[nama]]
pred.rf.cls <- predict(rf.cls, data = bc.test)$predictions
pred.rf.cls <- factor(pred.rf.cls,
levels = levels(bc.test$Class))
hasil.rf.cls <- data.frame(
Aktual = bc.test$Class,
Prediksi = pred.rf.cls
)
hasil.cm[[nama]] <- hasil.rf.cls
cat("\nModel:", nama, "\n")
print(head(hasil.rf.cls, 10))}##
## Model: mtry_2_trees_200
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_2_trees_500
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_2_trees_1000
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_3_trees_200
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_3_trees_500
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_3_trees_1000
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign benign
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_5_trees_200
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign malignant
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_5_trees_500
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign malignant
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
##
## Model: mtry_5_trees_1000
## Aktual Prediksi
## 1 benign malignant
## 2 benign benign
## 3 benign malignant
## 4 benign benign
## 5 benign benign
## 6 malignant malignant
## 7 benign benign
## 8 benign benign
## 9 benign benign
## 10 malignant malignant
Pada tahap prediksi, masing-masing model Random Forest digunakan untuk mengklasifikasikan 204 pengamatan pada data testing ke dalam kategori benign atau malignant. Hasil prediksi kemudian dibandingkan dengan kategori aktual untuk mengetahui kesesuaian hasil klasifikasi. Berdasarkan sepuluh hasil pengamatan pertama yang ditampilkan, sebagian besar prediksi telah sesuai dengan kategori aktual, meskipun masih ditemukan beberapa kesalahan klasifikasi. Sebagai contoh, pada model mtry_2_trees_200, pengamatan pertama yang sebenarnya termasuk kategori benign diprediksi sebagai malignant. Hasil prediksi tersebut selanjutnya digunakan sebagai dasar dalam pembentukan Confusion Matrix dan perhitungan ukuran evaluasi untuk masing-masing kombinasi parameter.
for (nama in names(hasil.model)) {
hasil.rf.cls <- hasil.cm[[nama]]
pred.rf.cls <- hasil.rf.cls$Prediksi
cm.rf <- confusionMatrix(
data = pred.rf.cls,
reference = hasil.rf.cls$Aktual,
positive = "malignant"
)
cat("\nConfusion Matrix:", nama, "\n")
print(cm.rf)
tab.rf <- table(
Aktual = hasil.rf.cls$Aktual,
Prediksi = pred.rf.cls
)
TN <- tab.rf["benign", "benign"]
FP <- tab.rf["benign", "malignant"]
FN <- tab.rf["malignant", "benign"]
TP <- tab.rf["malignant", "malignant"]
Accuracy <- (TP + TN) / (TP + TN + FP + FN)
Precision <- TP / (TP + FP)
Recall <- TP / (TP + FN)
Specificity <- TN / (TN + FP)
F1 <- 2 * (Precision * Recall) / (Precision + Recall)
evaluasi.rf <- data.frame(
Model = nama,
Accuracy = Accuracy,
Precision = Precision,
Recall = Recall,
Specificity = Specificity,
F1_Score = F1
)
hasil.evaluasi <- rbind(hasil.evaluasi, evaluasi.rf)}##
## Confusion Matrix: mtry_2_trees_200
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 130 1
## malignant 3 70
##
## Accuracy : 0.9804
## 95% CI : (0.9506, 0.9946)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9571
##
## Mcnemar's Test P-Value : 0.6171
##
## Sensitivity : 0.9859
## Specificity : 0.9774
## Pos Pred Value : 0.9589
## Neg Pred Value : 0.9924
## Prevalence : 0.3480
## Detection Rate : 0.3431
## Detection Prevalence : 0.3578
## Balanced Accuracy : 0.9817
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_2_trees_500
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 1
## malignant 4 70
##
## Accuracy : 0.9755
## 95% CI : (0.9437, 0.992)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9465
##
## Mcnemar's Test P-Value : 0.3711
##
## Sensitivity : 0.9859
## Specificity : 0.9699
## Pos Pred Value : 0.9459
## Neg Pred Value : 0.9923
## Prevalence : 0.3480
## Detection Rate : 0.3431
## Detection Prevalence : 0.3627
## Balanced Accuracy : 0.9779
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_2_trees_1000
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 2
## malignant 4 69
##
## Accuracy : 0.9706
## 95% CI : (0.9371, 0.9891)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9356
##
## Mcnemar's Test P-Value : 0.6831
##
## Sensitivity : 0.9718
## Specificity : 0.9699
## Pos Pred Value : 0.9452
## Neg Pred Value : 0.9847
## Prevalence : 0.3480
## Detection Rate : 0.3382
## Detection Prevalence : 0.3578
## Balanced Accuracy : 0.9709
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_3_trees_200
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 130 3
## malignant 3 68
##
## Accuracy : 0.9706
## 95% CI : (0.9371, 0.9891)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9352
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9577
## Specificity : 0.9774
## Pos Pred Value : 0.9577
## Neg Pred Value : 0.9774
## Prevalence : 0.3480
## Detection Rate : 0.3333
## Detection Prevalence : 0.3480
## Balanced Accuracy : 0.9676
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_3_trees_500
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 130 3
## malignant 3 68
##
## Accuracy : 0.9706
## 95% CI : (0.9371, 0.9891)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9352
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9577
## Specificity : 0.9774
## Pos Pred Value : 0.9577
## Neg Pred Value : 0.9774
## Prevalence : 0.3480
## Detection Rate : 0.3333
## Detection Prevalence : 0.3480
## Balanced Accuracy : 0.9676
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_3_trees_1000
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 3
## malignant 4 68
##
## Accuracy : 0.9657
## 95% CI : (0.9306, 0.9861)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9246
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9577
## Specificity : 0.9699
## Pos Pred Value : 0.9444
## Neg Pred Value : 0.9773
## Prevalence : 0.3480
## Detection Rate : 0.3333
## Detection Prevalence : 0.3529
## Balanced Accuracy : 0.9638
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_5_trees_200
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 4
## malignant 4 67
##
## Accuracy : 0.9608
## 95% CI : (0.9242, 0.9829)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9136
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9437
## Specificity : 0.9699
## Pos Pred Value : 0.9437
## Neg Pred Value : 0.9699
## Prevalence : 0.3480
## Detection Rate : 0.3284
## Detection Prevalence : 0.3480
## Balanced Accuracy : 0.9568
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_5_trees_500
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 4
## malignant 4 67
##
## Accuracy : 0.9608
## 95% CI : (0.9242, 0.9829)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9136
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9437
## Specificity : 0.9699
## Pos Pred Value : 0.9437
## Neg Pred Value : 0.9699
## Prevalence : 0.3480
## Detection Rate : 0.3284
## Detection Prevalence : 0.3480
## Balanced Accuracy : 0.9568
##
## 'Positive' Class : malignant
##
##
## Confusion Matrix: mtry_5_trees_1000
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 5
## malignant 4 66
##
## Accuracy : 0.9559
## 95% CI : (0.9179, 0.9796)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9025
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9296
## Specificity : 0.9699
## Pos Pred Value : 0.9429
## Neg Pred Value : 0.9627
## Prevalence : 0.3480
## Detection Rate : 0.3235
## Detection Prevalence : 0.3431
## Balanced Accuracy : 0.9498
##
## 'Positive' Class : malignant
##
Berdasarkan hasil evaluasi, model mtry = 2 dan num.trees = 200 menghasilkan performa terbaik dengan Accuracy sebesar 98,04%, Precision sebesar 95,89%, Recall sebesar 98,59%, Specificity sebesar 97,74%, dan F1-score sebesar 97,22%. Hasil Confusion Matrix pada model tersebut menunjukkan bahwa terdapat 130 pengamatan benign yang diklasifikasikan dengan benar dan 70 pengamatan malignant yang diklasifikasikan dengan benar. Selain itu, terdapat 3 pengamatan benign yang salah diklasifikasikan sebagai malignant dan 1 pengamatan malignant yang salah diklasifikasikan sebagai benign. Nilai Recall sebesar 98,59% menunjukkan bahwa model mampu mengenali sebagian besar pengamatan yang benar-benar termasuk kategori malignant. Sementara itu, Specificity sebesar 97,74% menunjukkan bahwa model juga mampu mengidentifikasi kategori benign dengan baik. Dengan demikian, model tersebut memiliki kemampuan klasifikasi yang sangat baik berdasarkan data testing.
for (nama in names(hasil.model)) {
rf.cls <- hasil.model[[nama]]
importance.rf <- sort(
rf.cls$variable.importance,
decreasing = TRUE
)
hasil.importance[[nama]] <- importance.rf
cat("\nVariable Importance:", nama, "\n")
print(importance.rf)
barplot(
importance.rf,
las = 2,
main = paste("Variable Importance -", nama),
ylab = "Permutation Importance")}##
## Variable Importance: mtry_2_trees_200
## Bare.nuclei Cell.size Cell.shape Cl.thickness Bl.cromatin
## 0.083924522 0.078718154 0.060967868 0.024489152 0.021478062
## Normal.nucleoli Marg.adhesion Epith.c.size Mitoses
## 0.020446839 0.019251533 0.011737675 0.003751688
##
## Variable Importance: mtry_2_trees_500
## Bare.nuclei Cell.size Cell.shape Cl.thickness Bl.cromatin
## 0.080504597 0.077257729 0.062974113 0.026747140 0.021877891
## Normal.nucleoli Marg.adhesion Epith.c.size Mitoses
## 0.021841450 0.019112201 0.013222617 0.003090966
##
## Variable Importance: mtry_2_trees_1000
## Bare.nuclei Cell.size Cell.shape Cl.thickness Bl.cromatin
## 0.081727341 0.077885328 0.062585865 0.026309142 0.020503315
## Normal.nucleoli Marg.adhesion Epith.c.size Mitoses
## 0.019947983 0.018885437 0.014006791 0.003346598
##
## Variable Importance: mtry_3_trees_200
## Bare.nuclei Cell.size Cell.shape Cl.thickness Marg.adhesion
## 0.097215967 0.091653406 0.062810795 0.027788431 0.019128466
## Bl.cromatin Normal.nucleoli Epith.c.size Mitoses
## 0.017950453 0.015967442 0.009877622 0.003686372
##
## Variable Importance: mtry_3_trees_500
## Bare.nuclei Cell.size Cell.shape Cl.thickness Marg.adhesion
## 0.099119249 0.085328389 0.065123301 0.026031551 0.019338940
## Bl.cromatin Normal.nucleoli Epith.c.size Mitoses
## 0.018814782 0.014788223 0.010949414 0.003211898
##
## Variable Importance: mtry_3_trees_1000
## Bare.nuclei Cell.size Cell.shape Cl.thickness Marg.adhesion
## 0.10028334 0.08553569 0.05925770 0.02481448 0.01952841
## Bl.cromatin Normal.nucleoli Epith.c.size Mitoses
## 0.01920131 0.01648600 0.01186049 0.00318534
##
## Variable Importance: mtry_5_trees_200
## Bare.nuclei Cell.size Cell.shape Cl.thickness Normal.nucleoli
## 0.125936890 0.089778781 0.042713777 0.023260225 0.021657685
## Marg.adhesion Bl.cromatin Epith.c.size Mitoses
## 0.020899801 0.014237292 0.008615232 0.002635523
##
## Variable Importance: mtry_5_trees_500
## Bare.nuclei Cell.size Cell.shape Cl.thickness Normal.nucleoli
## 0.124282812 0.090904474 0.045966760 0.021676702 0.020300877
## Marg.adhesion Bl.cromatin Epith.c.size Mitoses
## 0.019536614 0.015268145 0.009305183 0.003024808
##
## Variable Importance: mtry_5_trees_1000
## Bare.nuclei Cell.size Cell.shape Cl.thickness Normal.nucleoli
## 0.121396617 0.091093145 0.043806238 0.022686356 0.020778434
## Marg.adhesion Bl.cromatin Epith.c.size Mitoses
## 0.018867468 0.016189366 0.009737954 0.003221466
Berdasarkan hasil, variabel Bare.nuclei memiliki nilai Variable Importance tertinggi sebesar 0,0839, diikuti oleh Cell.size sebesar 0,0787 dan Cell.shape sebesar 0,0610. Hal ini menunjukkan bahwa ketiga variabel tersebut memiliki kontribusi relatif paling besar dalam proses klasifikasi pada model yang ditampilkan. Sementara itu, variabel Mitoses memiliki nilai kepentingan paling rendah sebesar 0,0038. Dengan demikian, Bare.nuclei, Cell.size, dan Cell.shape merupakan variabel yang paling berpengaruh terhadap hasil klasifikasi pada model mtry_2_trees_200.
par(mfrow = c(2, 2))
barplot(
hasil.evaluasi$Accuracy,
names.arg = hasil.evaluasi$Model,
las = 2,
main = "Perbandingan Accuracy",
ylab = "Accuracy")
barplot(
hasil.evaluasi$Precision,
names.arg = hasil.evaluasi$Model,
las = 2,
main = "Perbandingan Precision",
ylab = "Precision")
barplot(
hasil.evaluasi$Recall,
names.arg = hasil.evaluasi$Model,
las = 2,
main = "Perbandingan Recall",
ylab = "Recall")
barplot(
hasil.evaluasi$F1_Score,
names.arg = hasil.evaluasi$Model,
las = 2,
main = "Perbandingan F1-Score",
ylab = "F1-Score")Pada tahap visualisasi, dibuat diagram batang untuk membandingkan performa sembilan model Random Forest berdasarkan nilai Accuracy, Precision, Recall, dan F1-score. Visualisasi ini bertujuan untuk mempermudah pengamatan terhadap perbedaan kinerja setiap kombinasi parameter mtry dan num.trees. Berdasarkan hasil perhitungan evaluasi, model mtry = 2 dan num.trees = 200 menunjukkan nilai Accuracy, Precision, Recall, dan F1-score tertinggi dibandingkan model lainnya. Sementara itu, model dengan mtry = 5 dan num.trees = 1000 menghasilkan nilai terendah pada keempat ukuran evaluasi tersebut. Hasil visualisasi memperlihatkan bahwa penambahan jumlah pohon keputusan tidak selalu meningkatkan performa model. Oleh karena itu, pemilihan model perlu mempertimbangkan keseluruhan ukuran evaluasi, bukan hanya jumlah pohon yang digunakan.
## Model Accuracy Precision Recall Specificity F1_Score
## 1 mtry_2_trees_200 0.9803922 0.9589041 0.9859155 0.9774436 0.9722222
## 2 mtry_2_trees_500 0.9754902 0.9459459 0.9859155 0.9699248 0.9655172
## 3 mtry_2_trees_1000 0.9705882 0.9452055 0.9718310 0.9699248 0.9583333
## 4 mtry_3_trees_200 0.9705882 0.9577465 0.9577465 0.9774436 0.9577465
## 5 mtry_3_trees_500 0.9705882 0.9577465 0.9577465 0.9774436 0.9577465
## 6 mtry_3_trees_1000 0.9656863 0.9444444 0.9577465 0.9699248 0.9510490
## 7 mtry_5_trees_200 0.9607843 0.9436620 0.9436620 0.9699248 0.9436620
## 8 mtry_5_trees_500 0.9607843 0.9436620 0.9436620 0.9699248 0.9436620
## 9 mtry_5_trees_1000 0.9558824 0.9428571 0.9295775 0.9699248 0.9361702
## Model Accuracy Precision Recall Specificity F1_Score
## 1 mtry_2_trees_200 0.9803922 0.9589041 0.9859155 0.9774436 0.9722222
Pada tahap terakhir, dilakukan perbandingan seluruh model berdasarkan nilai Accuracy dan F1-score untuk menentukan model dengan performa klasifikasi terbaik. Berdasarkan hasil pengurutan nilai Accuracy, model mtry = 2 dan num.trees = 200 menempati urutan pertama dengan Accuracy sebesar 98,04%. Model tersebut juga menghasilkan Precision sebesar 95,89%, Recall sebesar 98,59%, Specificity sebesar 97,74%, dan F1-score sebesar 97,22%. Selain itu, berdasarkan pemilihan model menggunakan nilai F1-score tertinggi, diperoleh model yang sama, yaitu mtry = 2 dan num.trees = 200. Hal ini menunjukkan bahwa model tersebut memiliki keseimbangan yang baik antara Precision dan Recall dalam mengklasifikasikan kategori malignant. Dengan demikian, kombinasi parameter mtry = 2 dan num.trees = 200 dipilih sebagai model Random Forest terbaik karena menghasilkan performa paling tinggi berdasarkan seluruh ukuran evaluasi data testing yang digunakan.
Random Forest merupakan metode ensemble learning berbasis decision tree yang membangun banyak pohon melalui proses bootstrap sampling dan pemilihan prediktor secara acak pada setiap node untuk mengurangi korelasi antar-pohon serta meningkatkan akurasi prediksi. Sementara itu, Double Random Forest merupakan pengembangan dari Random Forest yang menggunakan seluruh data training untuk membangun setiap pohon, sedangkan proses bootstrap dilakukan pada setiap node untuk menentukan aturan split terbaik. Kedua metode menggabungkan prediksi dari seluruh pohon, yaitu melalui majority voting pada klasifikasi, sehingga dapat meningkatkan kemampuan model dalam melakukan prediksi.
Implementasi metode Random Forest dan Double Random Forest untuk kasus klasifikasi dilakukan dengan menggunakan variabel respons berbentuk kategori, sedangkan pada kasus regresi menggunakan variabel respons berbentuk numerik. Kedua metode diterapkan dengan membangun sejumlah decision tree melalui proses pengacakan sampel dan prediktor, kemudian menggabungkan hasil prediksi seluruh pohon menggunakan majority voting untuk klasifikasi dan rata-rata prediksi untuk regresi. Hasil pemodelan selanjutnya dievaluasi menggunakan metrik yang sesuai, seperti Accuracy, Precision, Recall, dan F1-score untuk klasifikasi, serta RMSE dan \(R^2\) untuk regresi.
Evaluasi performa model Random Forest dan Double Random Forest dilakukan dengan menggunakan nilai Out-of-Bag (OOB) error serta metrik evaluasi yang sesuai dengan jenis pemodelan. OOB error digunakan untuk mengukur tingkat kesalahan prediksi berdasarkan pengamatan yang tidak digunakan dalam pembentukan pohon tertentu, sehingga semakin kecil nilai OOB error, semakin baik kemampuan prediksi model. Perbandingan kedua metode dilakukan berdasarkan hasil evaluasi, seperti Accuracy, Precision, Recall, dan F1-score untuk klasifikasi serta RMSE dan \(R^2\) untuk regresi, sehingga dapat diketahui metode yang memberikan performa lebih baik.
Berdasarkan hasil analisis Random Forest Classification pada data BreastCancer, dilakukan pengujian terhadap sembilan kombinasi parameter mtry dan num.trees. Hasil evaluasi menunjukkan bahwa model terbaik diperoleh pada kombinasi mtry = 2 dan num.trees = 200, dengan Accuracy sebesar 98,04%, Precision sebesar 95,89%, Recall sebesar 98,59%, Specificity sebesar 97,74%, dan F1-score sebesar 97,22%. Model tersebut juga mampu menghasilkan klasifikasi yang tepat terhadap 200 dari 204 pengamatan data testing. Berdasarkan evaluasi internal, nilai OOB Error model tersebut sebesar 2,92%, sedangkan variabel yang memiliki kontribusi terbesar dalam proses klasifikasi adalah Bare.nuclei, diikuti Cell.size dan Cell.shape. Dengan demikian, Random Forest mampu memberikan hasil klasifikasi yang sangat baik pada data BreastCancer, dengan kombinasi mtry = 2 dan num.trees = 200 sebagai model terbaik berdasarkan hasil pengujian.
Aldania, A. N. A., Soleh, A. M., & Notodiputro, K. A. (2023). A comparative study of CatBoost and double random forest for multi-class classification. Jurnal RESTI (Rekayasa Sistem dan Teknologi Informasi), 7(1), 129–137. https://doi.org/10.29207/resti.v7i1.4766
Anisha, F., Vionanda, D., Amalita, N., & Zilrahmi. (2023). Application of random forest for the classification diabetes mellitus disease in RSUP Dr. M. Jamil Padang. UNP Journal of Statistics and Data Science, 1(2), 45–52. https://doi.org/10.24036/ujsds/vol1-iss2/30
Fransiska, H. (2026). Modul Praktikum Machine Learning dan Modern Prediction. Bengkulu: Universitas Bengkulu.
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. https://doi.org/10.30598/barekengvol19iss1pp227-236
Ramelan, F. A., & Hakim, L. (2025). Perbandingan prediksi terhadap peningkatan jumlah pelanggan Iconnet dengan algoritma regresi linear dan random forest pada wilayah Jabodetabek dan Banten. Jurnal JTIK (Jurnal Teknologi Informasi dan Komunikasi), 9(3), 790–801. https://doi.org/10.35870/jtik.v9i3.3490
Syarip, D. I., Notodiputro, K. A., & Sartono, B. (2025). Comparison of random forest and support vector machine classification methods for predicting the accuracy level of madrasah data. Media Statistika, 18(1), 37–48. https://doi.org/10.14710/medstat.18.1.37-48
Zaenal, M. S., Fitrianto, A., & Wijayanto, H. (2024). Comparison of extremely randomized survival trees and random survival forests: A simulation study. Scientific Journal of Informatics, 11(3). https://journal.unnes.ac.id/journals/sji/article/view/8464