Perkembangan teknologi informasi menyebabkan jumlah data yang tersedia semakin meningkat, sehingga diperlukan metode yang mampu mengolah data dan menghasilkan prediksi secara tepat. Salah satu pendekatan yang dapat digunakan adalah machine learning, yaitu metode yang memungkinkan komputer mempelajari pola dari data untuk melakukan klasifikasi maupun prediksi. Salah satu algoritma yang banyak digunakan dalam machine learning adalah Random Forest. Menurut Darwanto, Viarindita, dan Widyaningsih (2021), Random Forest dapat digunakan untuk melakukan klasifikasi dan membandingkan ketepatan hasil prediksi berdasarkan karakteristik data yang digunakan. Metode ini termasuk dalam teknik ensemble learning yang menggabungkan beberapa pohon keputusan (decision tree) untuk menghasilkan keputusan akhir.
Random Forest bekerja dengan membentuk sejumlah pohon keputusan melalui pengambilan sampel secara acak (bootstrap sampling) dan pemilihan variabel prediktor secara acak pada setiap proses pemisahan. Hasil prediksi dari seluruh pohon kemudian digabungkan menggunakan mekanisme voting untuk klasifikasi atau rata-rata untuk regresi. Penggabungan beberapa pohon keputusan tersebut bertujuan untuk meningkatkan kestabilan model dan mengurangi risiko overfitting. Meskipun demikian, metode Random Forest masih memiliki keterbatasan, salah satunya adalah kemungkinan terjadinya underfitting ketika pohon keputusan yang terbentuk memiliki ukuran terlalu kecil. Oleh karena itu, dikembangkan metode Double Random Forest sebagai salah satu pengembangan dari Random Forest untuk mengatasi permasalahan tersebut (Zikri, Riana, dan Laxmi,2024).
Metode Double Random Forest merupakan pengembangan dari Random Forest yang menggunakan pengacakan pada proses pembentukan pohon keputusan untuk menghasilkan model dengan kemampuan menangkap pola data yang lebih baik. Menurut Zikri, Riana, dan Laxmi (2024), Double Random Forest merupakan metode ensemble yang dapat digunakan untuk menangkap pola kompleks melalui pembentukan pohon keputusan. Penerapan kedua metode tersebut dalam praktikum ini bertujuan untuk memahami tahapan pembentukan model serta membandingkan kemampuan Random Forest dan Double Random Forest berdasarkan hasil evaluasi model. Dengan demikian, praktikum ini diharapkan dapat memberikan pemahaman mengenai perbedaan kedua metode dan mengetahui metode yang memberikan hasil pemodelan lebih baik pada data yang digunakan.
Berdasarkan latar belakang tersebut, rumusan masalah dalam praktikum ini adalah sebagai berikut:
Tujuan yang ingin dicapai dalam praktikum ini adalah sebagai berikut:
Random Forest merupakan algoritma ensemble learning yang menggabungkan sejumlah Decision Tree untuk menghasilkan prediksi akhir. Metode ini dikembangkan oleh Breiman (2001) dengan memanfaatkan pengambilan sampel secara acak (bootstrap sampling) dan pemilihan variabel prediktor secara acak pada setiap pembentukan pohon. Setiap pohon dibangun menggunakan sampel yang berbeda sehingga menghasilkan beberapa model dengan karakteristik yang beragam. Menurut Arum dkk., (2025), algoritma Random Forest dapat diterapkan untuk menyelesaikan permasalahan klasifikasi dan dibandingkan dengan algoritma pembelajaran mesin lainnya berdasarkan kinerja prediksinya.
Misalkan tersedia data latih 𝐷 = (𝑥𝑖,𝑦𝑖), 𝑖 = 1,2,…,𝑛 dan akan dibentuk 𝐵 pohon. Secara sederhana, proses Random Forest dilakukan sebagai berikut (Fransiska, 2026):
Untuk klasifikasi, hasil akhir diperoleh melalui majority voting: \[\hat{G}_{RF}(x) = \operatorname{mode}\{G_1(x), G_2(x), \ldots, G_B(x)\}\]
Double Random Forest merupakan pengembangan dari metode Random Forest yang diperkenalkan oleh Han, Kim, dan Lee (2020). Metode ini termasuk dalam teknik ensemble learning yang menggunakan kumpulan pohon keputusan untuk menghasilkan prediksi. Menurut Zikri, Riana, dan Laxmi (2024), Double Random Forest mampu menangkap pola kompleks dalam data dengan memanfaatkan pohon keputusan yang dibentuk menggunakan keseluruhan data pelatihan. Metode ini dikembangkan untuk mengatasi kemungkinan underfitting pada Random Forest, yaitu kondisi ketika model belum mampu menangkap pola data secara optimal.
Perbedaan utama Double Random Forest dengan Random Forest terletak pada proses pengambilan sampel (bootstrap sampling). Pada Random Forest, pengambilan sampel bootstrap dilakukan pada awal pembentukan setiap pohon, sedangkan pada Double Random Forest, pengambilan sampel dilakukan pada setiap simpul untuk menentukan aturan pemisahan data. Setelah aturan pemisahan diperoleh, data asli pada simpul tersebut digunakan kembali untuk melanjutkan pembentukan pohon. Dengan demikian, Double Random Forest dapat membentuk pohon yang lebih besar dan beragam sehingga berpotensi meningkatkan kemampuan model dalam menangkap pola data.
Secara sederhana, proses Double Random Forest dilakukan sebagai berikut (Fransiska, 2026):
Pada bootstrap berukuran 𝑛 yang diambil dengan pengembalian dari 𝑛 observasi, sebagian observasi dapat terambil lebih dari sekali dan sebagian lainnya tidak terambil. Secara rata-rata, proporsi observasi unik yang masuk ke satu bootstrap sampel mendekati 1 − 𝑒⁻¹ ≈ 0,632. Artinya, sekitar 36,8% observasi tidak digunakan untuk membentuk tree tertentu dan disebut Out-of-Bag (OOB) observations.
Untuk setiap observasi, prediksi OOB diperoleh hanya dari tree-tree yang tidak menggunakan observasi tersebut ketika dibentuk. Prediksi ini dapat digunakan untuk menghitung OOB prediction error sebagai ukuran evaluasi internal Random Forest. Pada ranger, OOB error dihitung secara otomatis secara default. Untuk klasifikasi, prediction.error menyatakan proporsi salah klasifikasi OOB, sedangkan untuk regresi menyatakan OOB Mean Squared Error (MSE) (Fransiska, 2026).
Jenis data yang digunakan dalam praktikum ini adalah data kategorik. Data kategorik adalah tipe data yang merepresentasikan karakteristik atau atribut dari objek yang diklasifikasikan ke dalam kategori tertentu. Sumber data yang digunakan merupakan data sekunder, yaitu data yang telah tersedia dan diperoleh melalui sumber yang sudah ada. Data yang digunakan adalah dataset BreastCancer dari package mlbench pada program R.
Variabel penelitian adalah segala sesuatu yang menjadi objek pengamatan dalam suatu penelitian. Variabel penelitian yang digunakan berasal dari dataset BreastCancer dengan jumlah 699 observasi dan 11 variabel. Variabel Class digunakan sebagai variabel respons dengan kategori benign dan malignant, sedangkan sembilan variabel prediktor yang digunakan adalah Clump Thickness, Uniformity of Cell Size, Uniformity of Cell Shape, Marginal Adhesion, Single Epithelial Cell Size, Bare Nuclei, Bland Chromatin, Normal Nucleoli dan Mitoses. Variabel Sample code number tidak digunakan dalam pemodelan karena hany berfungsi sebagai identitas sampel.
Berikut langkah-langkah analisis data pada penelitian ini:
Library yang digunakan pada praktikum ini adalah ranger, mlbench, dan caret. package mlbench menyediakan dataset BreastCancer yang digunakan dalam analisis klasifikasi.
## 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
## N.unique :645 5 :130 10 : 67 2 : 59 2 : 58
## N.blank : 0 3 :108 3 : 52 10 : 58 3 : 58
## Min.nchar: 5 4 : 80 2 : 45 3 : 56 10 : 55
## Max.nchar: 8 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 NAs : 16 (Other): 69 (Other): 69 (Other): 17
## Class
## benign :458
## malignant:241
##
##
##
##
##
Berdasarkan output str() dan summary(), dataset BreastCancer terdiri atas 699 observasi dan 11 variabel. Variabel Id berfungsi sebagai identitas, sembilan variabel lainnya merupakan prediktor yang menggambarkan karakteristik sel, sedangkan Class merupakan variabel target dengan dua kategori, yaitu benign dan malignant. Berdasarkan ringkasan data, terdapat 16 missing value pada variabel Bare.nuclei yang perlu ditangani sebelum pemodelan. Variabel Class terdiri atas 458 observasi benign (65,52%) dan 241 observasi malignant (34,48%).
#Persiapan data
bc$Id <- NULL
bc <- na.omit(bc)
bc$Class <- droplevels(as.factor(bc$Class))
# 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, ]
# Melihat jumlah data
dim(bc.train)## [1] 479 10
## [1] 204 10
##
## benign malignant
## 311 168
##
## benign malignant
## 133 71
Berdasarkan hasil pembagian data, diperoleh 479 data training (70%) dan 204 data testing (30%). Data training terdiri atas 311 kelas benign dan 168 kelas malignant, sedangkan data testing terdiri atas 133 kelas benign dan 71 kelas malignant. Hasil tersebut menunjukkan bahwa kedua kelompok data memiliki distribusi kelas yang cenderung serupa dan selanjutnya digunakan untuk pembentukan serta evaluasi model Random Forest Classification.
# Menentukan kombinasi parameter
kombinasi <- expand.grid(
mtry = c(2, 3, 5),
num.trees = c(200, 500, 1000)
)
kombinasi## mtry num.trees
## 1 2 200
## 2 3 200
## 3 5 200
## 4 2 500
## 5 3 500
## 6 5 500
## 7 2 1000
## 8 3 1000
## 9 5 1000
# Menyiapkan penyimpanan model
hasil.model <- list()
# Perulangan untuk 9 kombinasi model
for (i in 1:nrow(kombinasi)) {
set.seed(234)
rf <- ranger(
Class ~ .,
data = bc.train,
num.trees = kombinasi$num.trees[i],
mtry = kombinasi$mtry[i],
min.node.size = 1,
replace = TRUE,
sample.fraction = 1,
importance = "permutation",
seed = 234
)
# Menyimpan model
nama.model <- paste0(
"mtry_", kombinasi$mtry[i],
"_trees_", kombinasi$num.trees[i]
)
hasil.model[[nama.model]] <- rf
# Menampilkan hasil pembentukan model
cat("\n===============================================\n")
cat("MODEL:", nama.model, "\n")
cat("===============================================\n")
print(rf)
}##
## ===============================================
## MODEL: mtry_2_trees_200
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_3_trees_200
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_5_trees_200
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_2_trees_500
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_3_trees_500
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_5_trees_500
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_2_trees_1000
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_1000
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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_1000
## ===============================================
## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = kombinasi$num.trees[i], mtry = kombinasi$mtry[i], 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 %
## [1] 0.02713987
## predicted
## true benign malignant
## benign 303 8
## malignant 5 163
## [1] benign benign malignant malignant benign benign
## Levels: benign malignant
Berdasarkan hasil evaluasi OOB, diperoleh nilai OOB Error sebesar 2,71%, yang menunjukkan tingkat kesalahan prediksi model cenderung rendah. Berdasarkan confusion matrix, sebanyak 303 data benign dan 163 data malignant berhasil diklasifikasikan dengan benar, sedangkan 8 data benign dan 5 data malignant mengalami kesalahan klasifikasi. Dengan demikian, model menghasilkan 466 prediksi benar dari 479 data training, sehingga menunjukkan kemampuan klasifikasi yang baik.
hasil.prediksi <- data.frame(
Aktual = bc.test$Class
)
# Melakukan prediksi menggunakan seluruh model
for (nama.model in names(hasil.model)) {
rf <- hasil.model[[nama.model]]
# Prediksi data testing
prediksi <- predict(rf, data = bc.test)$predictions
# Menyamakan level faktor
prediksi <- factor(
prediksi,
levels = levels(bc.test$Class)
)
# Menyimpan hasil prediksi
hasil.prediksi[[nama.model]] <- prediksi
}
# Menampilkan hasil prediksi
head(hasil.prediksi, 10)## Aktual mtry_2_trees_200 mtry_3_trees_200 mtry_5_trees_200
## 1 benign malignant malignant malignant
## 2 benign benign benign benign
## 3 benign benign benign malignant
## 4 benign benign benign benign
## 5 benign benign benign benign
## 6 malignant malignant malignant malignant
## 7 benign benign benign benign
## 8 benign benign benign benign
## 9 benign benign benign benign
## 10 malignant malignant malignant malignant
## mtry_2_trees_500 mtry_3_trees_500 mtry_5_trees_500 mtry_2_trees_1000
## 1 malignant malignant malignant malignant
## 2 benign benign benign benign
## 3 benign benign malignant benign
## 4 benign benign benign benign
## 5 benign benign benign benign
## 6 malignant malignant malignant malignant
## 7 benign benign benign benign
## 8 benign benign benign benign
## 9 benign benign benign benign
## 10 malignant malignant malignant malignant
## mtry_3_trees_1000 mtry_5_trees_1000
## 1 malignant 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
Berdasarkan hasil prediksi data testing, dapat dilihat bahwa hasil prediksi dari sembilan model Random Forest pada 10 data testing pertama sebagian besar telah sesuai dengan kelas aktual. Meskipun demikian, masih terdapat beberapa pengamatan yang mengalami kesalahan klasifikasi, yaitu ketika hasil prediksi berbeda dari kelas sebenarnya. Perbedaan tersebut menunjukkan bahwa setiap kombinasi parameter mtry dan num.trees dapat menghasilkan hasil prediksi yang berbeda. Selanjutnya, kinerja masing-masing model dievaluasi menggunakan confusion matrix untuk mengetahui tingkat ketepatan klasifikasi pada seluruh data testing.
hasil.confusion <- list()
# Menghitung Confusion Matrix setiap model
for (nama.model in names(hasil.model)) {
# Mengambil hasil prediksi
prediksi <- hasil.prediksi[[nama.model]]
# Menghitung Confusion Matrix
cm <- confusionMatrix(
data = prediksi,
reference = bc.test$Class,
positive = "malignant"
)
# Menyimpan hasil
hasil.confusion[[nama.model]] <- cm
# Menampilkan hasil Confusion Matrix
cat("\n====================================\n")
cat("Model:", nama.model, "\n")
cat("====================================\n")
print(cm)
}##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
##
## ====================================
## Model: 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
##
Model menghasilkan nilai accuracy sebesar 98,04%, sensitivity sebesar 98,59%, dan specificity sebesar 97,74%. Dari 204 data testing, sebanyak 130 data benign dan 70 data malignant berhasil diklasifikasikan dengan benar. Sementara itu, terdapat 3 data benign yang salah diklasifikasikan sebagai malignant dan 1 data malignant yang salah diklasifikasikan sebagai benign. Model ini menunjukkan hasil klasifikasi terbaik dibandingkan kombinasi lainnya.
Model menghasilkan accuracy sebesar 97,55%, sensitivity sebesar 97,18%, dan specificity sebesar 97,74%. Sebanyak 130 data benign dan 69 data malignant berhasil diklasifikasikan dengan benar. Terdapat 3 data benign yang salah diklasifikasikan sebagai malignant dan 2 data malignant yang salah diklasifikasikan sebagai benign. Hasil tersebut menunjukkan bahwa model memiliki kemampuan klasifikasi yang sangat baik.
Model menghasilkan accuracy sebesar 96,08%, sensitivity sebesar 94,37%, dan specificity sebesar 96,99%. Sebanyak 129 data benign dan 67 data malignant berhasil diklasifikasikan dengan benar. Sementara itu, terdapat 4 kesalahan klasifikasi pada masing-masing kelas, yaitu 4 data benign diprediksi sebagai malignant dan 4 data malignant diprediksi sebagai benign. Hasil ini menunjukkan bahwa kemampuan klasifikasi model lebih rendah dibandingkan dua kombinasi sebelumnya.
Model menghasilkan accuracy sebesar 97,55%, sensitivity sebesar 98,59%, dan specificity sebesar 96,99%. Sebanyak 129 data benign dan 70 data malignant berhasil diklasifikasikan dengan benar. Terdapat 4 data benign yang salah diklasifikasikan sebagai malignant dan 1 data malignant yang salah diklasifikasikan sebagai benign. Model ini memiliki kemampuan yang sangat baik dalam mendeteksi kelas malignant.
Model menghasilkan accuracy sebesar 97,06%, sensitivity sebesar 95,77%, dan specificity sebesar 97,74%. Sebanyak 130 data benign dan 68 data malignant berhasil diklasifikasikan dengan benar. Sementara itu, terdapat 3 data benign yang salah diklasifikasikan sebagai malignant dan 3 data malignant yang salah diklasifikasikan sebagai benign. Hasil tersebut menunjukkan bahwa model memiliki kemampuan klasifikasi yang baik, meskipun masih terdapat enam kesalahan prediksi.
Model menghasilkan accuracy sebesar 96,08%, sensitivity sebesar 94,37%, dan specificity sebesar 96,99%. Sebanyak 129 data benign dan 67 data malignant berhasil diklasifikasikan dengan benar. Terdapat 4 data benign yang salah diklasifikasikan sebagai malignant dan 4 data malignant yang salah diklasifikasikan sebagai benign. Hasil ini sama dengan model kombinasi mtry = 5 dan num.trees = 200, sehingga peningkatan jumlah pohon dari 200 menjadi 500 belum memberikan perubahan hasil klasifikasi.
Model menghasilkan accuracy sebesar 97,06%, sensitivity sebesar 97,18%, dan specificity sebesar 96,99%. Sebanyak 129 data benign dan 69 data malignant berhasil diklasifikasikan dengan benar. Sementara itu, terdapat 4 data benign yang salah diklasifikasikan sebagai malignant dan 2 data malignant yang salah diklasifikasikan sebagai benign. Hasil tersebut menunjukkan bahwa model memiliki kemampuan klasifikasi yang baik, tetapi belum melampaui performa kombinasi mtry = 2 dan num.trees = 200.
Model menghasilkan accuracy sebesar 96,57%, sensitivity sebesar 95,77%, dan specificity sebesar 96,99%. Sebanyak 129 data benign dan 68 data malignant berhasil diklasifikasikan dengan benar. Terdapat 4 data benign yang salah diklasifikasikan sebagai malignant dan 3 data malignant yang salah diklasifikasikan sebagai benign. Hasil ini menunjukkan bahwa model memiliki kemampuan klasifikasi yang baik, tetapi performanya lebih rendah dibandingkan kombinasi mtry = 3 dan num.trees = 200.
Model menghasilkan accuracy sebesar 95,59%, sensitivity sebesarv92,96%, dan specificity sebesar 96,99%. Sebanyak 129 data benign dan 66 data malignant berhasil diklasifikasikan dengan benar. Sementara itu, terdapat 4 data benign yang salah diklasifikasikan sebagaivmalignant dan 5 data malignant yang salah diklasifikasikan sebagaivbenign. Model ini menghasilkan accuracy terendah dibandingkan delapan kombinasi lainnya.
Berdasarkan hasil evaluasi dari sembilan kombinasi model Random
Forest, model terbaik adalah model dengan mtry = 2 dan num.trees =
200. Model tersebut menghasilkan nilai accuracy tertinggi
sebesar 98,04%, sensitivity sebesar 98,59%, dan
specificity sebesar 97,74%. Dari 204 data testing,
sebanyak 200 data berhasil diklasifikasikan dengan benar, sedangkan
hanya 4 data yang mengalami kesalahan klasifikasi, terdiri atas 3 data
benign yang diprediksi sebagai malignant dan 1 data
malignant yang diprediksi sebagai benign. Selain itu,
model ini juga memiliki kemampuan yang sangat baik dalam mendeteksi
kelas malignant, sebagaimana ditunjukkan oleh nilai
sensitivity sebesar 98,59%. Dengan demikian, kombinasi
parameter mtry = 2 dan num.trees = 200 dipilih sebagai model terbaik
karena menghasilkan tingkat ketepatan klasifikasi tertinggi dibandingkan
delapan kombinasi model lainnya pada data testing.
importance.semua <- data.frame()
for (nama.model in names(hasil.model)) {
rf <- hasil.model[[nama.model]]
imp <- sort(
rf$variable.importance,
decreasing = TRUE
)
temp <- data.frame(
Variabel = names(imp),
Importance = as.numeric(imp),
Model = nama.model
)
importance.semua <- rbind(
importance.semua,
temp
)
}
importance.semua## Variabel Importance Model
## 1 Bare.nuclei 0.083924522 mtry_2_trees_200
## 2 Cell.size 0.078718154 mtry_2_trees_200
## 3 Cell.shape 0.060967868 mtry_2_trees_200
## 4 Cl.thickness 0.024489152 mtry_2_trees_200
## 5 Bl.cromatin 0.021478062 mtry_2_trees_200
## 6 Normal.nucleoli 0.020446839 mtry_2_trees_200
## 7 Marg.adhesion 0.019251533 mtry_2_trees_200
## 8 Epith.c.size 0.011737675 mtry_2_trees_200
## 9 Mitoses 0.003751688 mtry_2_trees_200
## 10 Bare.nuclei 0.097215967 mtry_3_trees_200
## 11 Cell.size 0.091653406 mtry_3_trees_200
## 12 Cell.shape 0.062810795 mtry_3_trees_200
## 13 Cl.thickness 0.027788431 mtry_3_trees_200
## 14 Marg.adhesion 0.019128466 mtry_3_trees_200
## 15 Bl.cromatin 0.017950453 mtry_3_trees_200
## 16 Normal.nucleoli 0.015967442 mtry_3_trees_200
## 17 Epith.c.size 0.009877622 mtry_3_trees_200
## 18 Mitoses 0.003686372 mtry_3_trees_200
## 19 Bare.nuclei 0.125936890 mtry_5_trees_200
## 20 Cell.size 0.089778781 mtry_5_trees_200
## 21 Cell.shape 0.042713777 mtry_5_trees_200
## 22 Cl.thickness 0.023260225 mtry_5_trees_200
## 23 Normal.nucleoli 0.021657685 mtry_5_trees_200
## 24 Marg.adhesion 0.020899801 mtry_5_trees_200
## 25 Bl.cromatin 0.014237292 mtry_5_trees_200
## 26 Epith.c.size 0.008615232 mtry_5_trees_200
## 27 Mitoses 0.002635523 mtry_5_trees_200
## 28 Bare.nuclei 0.080504597 mtry_2_trees_500
## 29 Cell.size 0.077257729 mtry_2_trees_500
## 30 Cell.shape 0.062974113 mtry_2_trees_500
## 31 Cl.thickness 0.026747140 mtry_2_trees_500
## 32 Bl.cromatin 0.021877891 mtry_2_trees_500
## 33 Normal.nucleoli 0.021841450 mtry_2_trees_500
## 34 Marg.adhesion 0.019112201 mtry_2_trees_500
## 35 Epith.c.size 0.013222617 mtry_2_trees_500
## 36 Mitoses 0.003090966 mtry_2_trees_500
## 37 Bare.nuclei 0.099119249 mtry_3_trees_500
## 38 Cell.size 0.085328389 mtry_3_trees_500
## 39 Cell.shape 0.065123301 mtry_3_trees_500
## 40 Cl.thickness 0.026031551 mtry_3_trees_500
## 41 Marg.adhesion 0.019338940 mtry_3_trees_500
## 42 Bl.cromatin 0.018814782 mtry_3_trees_500
## 43 Normal.nucleoli 0.014788223 mtry_3_trees_500
## 44 Epith.c.size 0.010949414 mtry_3_trees_500
## 45 Mitoses 0.003211898 mtry_3_trees_500
## 46 Bare.nuclei 0.124282812 mtry_5_trees_500
## 47 Cell.size 0.090904474 mtry_5_trees_500
## 48 Cell.shape 0.045966760 mtry_5_trees_500
## 49 Cl.thickness 0.021676702 mtry_5_trees_500
## 50 Normal.nucleoli 0.020300877 mtry_5_trees_500
## 51 Marg.adhesion 0.019536614 mtry_5_trees_500
## 52 Bl.cromatin 0.015268145 mtry_5_trees_500
## 53 Epith.c.size 0.009305183 mtry_5_trees_500
## 54 Mitoses 0.003024808 mtry_5_trees_500
## 55 Bare.nuclei 0.081727341 mtry_2_trees_1000
## 56 Cell.size 0.077885328 mtry_2_trees_1000
## 57 Cell.shape 0.062585865 mtry_2_trees_1000
## 58 Cl.thickness 0.026309142 mtry_2_trees_1000
## 59 Bl.cromatin 0.020503315 mtry_2_trees_1000
## 60 Normal.nucleoli 0.019947983 mtry_2_trees_1000
## 61 Marg.adhesion 0.018885437 mtry_2_trees_1000
## 62 Epith.c.size 0.014006791 mtry_2_trees_1000
## 63 Mitoses 0.003346598 mtry_2_trees_1000
## 64 Bare.nuclei 0.100283344 mtry_3_trees_1000
## 65 Cell.size 0.085535688 mtry_3_trees_1000
## 66 Cell.shape 0.059257703 mtry_3_trees_1000
## 67 Cl.thickness 0.024814485 mtry_3_trees_1000
## 68 Marg.adhesion 0.019528413 mtry_3_trees_1000
## 69 Bl.cromatin 0.019201313 mtry_3_trees_1000
## 70 Normal.nucleoli 0.016485996 mtry_3_trees_1000
## 71 Epith.c.size 0.011860487 mtry_3_trees_1000
## 72 Mitoses 0.003185340 mtry_3_trees_1000
## 73 Bare.nuclei 0.121396617 mtry_5_trees_1000
## 74 Cell.size 0.091093145 mtry_5_trees_1000
## 75 Cell.shape 0.043806238 mtry_5_trees_1000
## 76 Cl.thickness 0.022686356 mtry_5_trees_1000
## 77 Normal.nucleoli 0.020778434 mtry_5_trees_1000
## 78 Marg.adhesion 0.018867468 mtry_5_trees_1000
## 79 Bl.cromatin 0.016189366 mtry_5_trees_1000
## 80 Epith.c.size 0.009737954 mtry_5_trees_1000
## 81 Mitoses 0.003221466 mtry_5_trees_1000
#Visualisasi Variable Importance
par(mfrow = c(3, 3), mar = c(8, 4, 3, 1))
for (nama.model in names(hasil.model)) {
imp <- sort(
hasil.model[[nama.model]]$variable.importance,
decreasing = TRUE
)
barplot(
imp,
las = 2,
cex.names = 0.7,
main = nama.model,
ylab = "Permutation Importance"
)
}Berdasarkan hasil Variable Importance pada sembilan kombinasi model Random Forest, yaitu mtry sebesar 2, 3, dan 5 serta jumlah pohon (num.trees) sebanyak 200, 500, dan 1000, terlihat bahwa variabel Bare.nuclei secara konsisten memiliki nilai Permutation Importance tertinggi pada seluruh model, dengan nilai berkisar antara 0,0805 hingga 0,1259. Variabel berikutnya yang memiliki tingkat kepentingan tinggi adalah Cell.size dengan nilai berkisar antara 0,0773 hingga 0,0917, serta Cell.shape dengan nilai berkisar antara 0,0427 hingga 0,0651. Hal ini menunjukkan bahwa ketiga variabel tersebut memberikan kontribusi paling besar dalam membantu model membedakan kelas benign dan malignant. Sementara itu, variabel Cl.thickness, Bl.cromatin, Normal.nucleoli, Marg.adhesion, dan Epith.c.size memiliki tingkat kepentingan yang lebih rendah, sedangkan Mitoses secara konsisten memiliki nilai Permutation Importance paling kecil, yaitu berkisar antara 0,0026 hingga 0,0038. Meskipun terdapat perbedaan nilai kepentingan pada setiap kombinasi parameter, urutan variabel yang paling berpengaruh cenderung konsisten. Dengan demikian, dapat disimpulkan bahwa Bare.nuclei, Cell.size, dan Cell.shape merupakan variabel yang paling berkontribusi terhadap hasil klasifikasi Random Forest pada data Breast Cancer.
Random Forest merupakan metode ensemble learning yang menggabungkan sejumlah Decision Tree melalui proses bootstrap sampling dan pemilihan variabel prediktor secara acak (mtry) pada setiap simpul. Setiap pohon dibentuk menggunakan sampel yang berbeda, kemudian seluruh hasil prediksi digabungkan untuk memperoleh prediksi akhir. Pada kasus klasifikasi, penggabungan prediksi dilakukan menggunakan majority voting.
Double Random Forest merupakan pengembangan dari Random Forest yang menggunakan seluruh data pelatihan sebagai dasar pembentukan setiap pohon. Perbedaannya terletak pada proses bootstrap sampling yang dilakukan pada setiap simpul untuk menentukan pemisahan data (split), bukan pada awal pembentukan pohon. Setelah aturan pemisahan diperoleh, data asli pada simpul digunakan kembali untuk melanjutkan pembentukan pohon. Proses ini memungkinkan terbentuknya pohon yang lebih besar dan beragam sehingga diharapkan dapat mengurangi risiko underfitting.
Evaluasi kinerja model Random Forest dan Double Random Forest dapat dilakukan menggunakan Out-of-Bag (OOB) Error. OOB merupakan observasi yang tidak terpilih dalam sampel bootstrap pada pembentukan suatu pohon, dengan proporsi rata-rata sekitar 36,8% dari seluruh data. Observasi tersebut digunakan untuk menguji prediksi pohon yang tidak melibatkan observasi bersangkutan dalam proses pelatihan. Pada klasifikasi, OOB Error menunjukkan proporsi kesalahan klasifikasi, sedangkan pada regresi menunjukkan nilai Mean Squared Error (MSE).
Berdasarkan hasil, algoritma Random Forest berhasil melakukan klasifikasi data BreastCancer dengan baik menggunakan sembilan kombinasi parameter mtry dan num.trees. Hasil Variable Importance menunjukkan bahwa variabel Bare.nuclei, Cell.size, dan Cell.shape merupakan variabel yang paling berkontribusi dalam proses klasifikasi, sedangkan Mitoses memiliki tingkat kepentingan paling rendah. Berdasarkan evaluasi OOB, diperoleh nilai kesalahan sebesar 2,71%, yang menunjukkan bahwa model memiliki kemampuan prediksi yang baik pada data training. Sementara itu, berdasarkan evaluasi data testing, model dengan kombinasi mtry = 2 dan num.trees = 200 menghasilkan kinerja terbaik dengan accuracy sebesar 98,04%, sensitivity sebesar 98,59%, dan specificity sebesar 97,74%. Dengan demikian, kombinasi tersebut dipilih sebagai model Random Forest terbaik karena memiliki tingkat ketepatan klasifikasi tertinggi dibandingkan delapan kombinasi parameter lainnya.
Arum, D. M. P., Santoso, K. I., Triyono, A., Supriyadi, E., Nugroho, A. S., & Widodo, E. (2025). Algoritma Random Forest, Decision Tree, dan XGBoost untuk klasifikasi stunting pada balita. Jurnal Transformatika, 23(1), 67–76.
Breiman, L. (2001). Random forests. Machine Learning, 45, 5–32.
Darwanto, A. R. S., Viarindita, T. L., & Widyaningsih, Y. (2021). Analisis regresi logistik binomial dan algoritma Random Forest pada proses pengklasifikasian penyakit ginjal kronis. Jurnal Statistika dan Aplikasinya, 5(1), 1–14.
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Laboratorium Matematika Universitas Bengkulu.
Han, S., Kim, H., & Lee, Y. S. (2020). Double random forest. Machine Learning, 109, 1569–1586.
Zikri, M., Riana, F., & Laxmi, G. F. (2024). Perbandingan metode Long Short-Term Memory dan Double Random Forest dalam prediksi harga penutupan saham. Jurnal Teknik Informatika, 12(1), 44–54.