Perkembangan teknologi informasi menyebabkan data yang dihasilkan semakin besar dan beragam sehingga diperlukan metode machine learning untuk mengolah data dan memprediksi suatu kelas berdasarkan pola yang terbentuk. Salah satu metode klasifikasi yang banyak digunakan adalah Random Forest, yaitu metode ensemble learning berbasis pohon keputusan yang membangun banyak pohon dan menggabungkan prediksinya untuk meningkatkan akurasi serta mengurangi overfitting (Fransiska, 2026). Metode ini merupakan pengembangan dari bagging dengan tambahan pemilihan variabel prediktor secara acak pada setiap pemisahan pohon (Jatmiko dkk., 2019). Pengembangan lebih lanjut dari Random Forest adalah Double Random Forest (DRF), yaitu metode yang membentuk setiap pohon menggunakan seluruh data training sehingga cenderung menghasilkan pohon yang lebih besar (Fransiska, 2026).
Penerapan Random Forest telah digunakan dalam berbagai permasalahan klasifikasi karena mampu menghasilkan prediksi yang baik melalui penggabungan banyak pohon keputusan. Mutoffar dkk. (2022), misalnya, menerapkan metode Random Forest untuk mengklasifikasikan kualitas air sumur dan memperoleh nilai presisi sebesar 0,823 serta sensitivitas sebesar 0,83. Hasil tersebut menunjukkan bahwa Random Forest dapat dimanfaatkan untuk mendukung pengambilan keputusan berdasarkan pola data yang tersedia.
Berbeda dengan Random Forest, Double Random Forest dikembangkan untuk mengatasi masalah underfitting yang dapat terjadi ketika model kurang mampu menangkap pola data. Khairunnisa dkk. (2024) menunjukkan bahwa Double Random Forest memiliki interpretabilitas yang lebih baik daripada Random Forest pada data yang mengalami underfitting, berdasarkan kualitas aturan asosiasi yang dihasilkan. Oleh karena itu, perbandingan kedua metode diperlukan untuk mengetahui kinerja model dalam mengklasifikasikan data serta menentukan metode yang lebih sesuai dengan karakteristik data penelitia
Berdasarkan latar belakang di atas, adapun rumusan masalah sebagai berikut:
Berdasarkan rumusan masalah, tujuan yang dapat disimpulkan adalah sebagai berikut:
Manfaat yang diperoleh melalui penelitian ini, yaitu:
Bagi penulis:
Bagi pembaca:
Adapun batasan masalah pada penelitian ini dengan menggunakan
dataset BreastCancer dari package
mlbench untuk mengklasifikasikan variabel
Class (benign dan malignant) menggunakan
Random Forest. Kolom Id dihapus dan observasi yang
memiliki nilai hilang dihapus menggunakan na.omit(),
kemudian data dibagi menjadi training (70%) dan
testing (30%). Selanjutnya, dibangun sembilan model dengan
mtry sebesar 2, 3, dan 5 serta num.trees
sebesar 200, 500, dan 1000. Model dievaluasi menggunakan OOB
error, confusion matrix, Accuracy,
Precision, Recall, Specificity, dan
F1-score dengan kelas malignant sebagai kelas positif,
kemudian dianalisis permutation variable importance-nya dan
ditentukan model terbaik. Implementasi pada R dibatasi pada Random
Forest Classification, sedangkan Double Random Forest
dibahas pada tingkat konsep.
Adapun sistematika penulisan dari praktikum ini adalah:
BAB I PENDAHULUAN
Bab ini memuat latar belakang, rumusan masalah, tujuan dan manfaat, batasan masalah dan sistematika penulisan.
BAB II TINJAUAN PUSTAKA
Bab ini merupakan bab yang memuat pengertian dan teori yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB III METODE PENELITIAN
Bab ini merupakan bab yang memuat jenis dan sumber data, variabel penelitian, dan langkah-langkah analisis yang diperlukan untuk rancangan penelitian pada bab-bab berikutnya.
BAB IV HASIL DAN PEMBAHASAN
Bab ini merupakan bab yang memuat hasil dan pembahasan yang telah dilakukan pada program kemudian diinterpretasikan.
BAB V KESIMPULAN DAN SARAN
Bab ini merupakan bab yang memuat kesimpulan dan saran.
DAFTAR PUSTAKA
Random Forest adalah algoritma ensemble learning berbasis pohon yang membangun banyak decision tree dan menggabungkan prediksinya untuk meningkatkan akurasi serta mengurangi overfitting (Fransiska, 2026). Metode ini merupakan pengembangan dari bagging (Bootstrap Aggregating). Menurut Jatmiko dkk. (2019), Random Forest menambahkan satu lapisan pengacakan pada proses resampling sehingga bukan hanya sampel data yang diambil secara acak untuk membentuk pohon klasifikasi, tetapi juga variabel independen yang digunakan. Lestari dan Sirodj (2021) menyebutkan bahwa Random Forest menerapkan bootstrap aggregating dan random feature selection, yang merupakan perkembangan dari Classification and Regression Trees (CART).
Tujuan pengacakan prediktor adalah mengurangi korelasi antarpohon. Apabila seluruh pohon terlalu mirip, manfaat agregasi menjadi terbatas, sehingga pohon yang kuat tetapi tidak saling berkorelasi tinggi dapat mengurangi variance model (Fransiska, 2026). Perbedaan Bagging dan Random Forest dirangkum pada Tabel 1 berikut (Fransiska, 2026).
Tabel 1. Perbedaan Bagging dan Random Forest
| Aspek | Bagging | Random Forest |
|---|---|---|
| Data tiap pohon | Umumnya sampel bootstrap | Umumnya sampel bootstrap |
| Prediktor pada pemisahan | Semua prediktor dapat dipertimbangkan | Hanya mtry prediktor yang dipilih secara
acak |
| Korelasi antarpohon | Dapat relatif tinggi | Ditekan melalui random feature selection |
| Agregasi klasifikasi | Majority voting | Majority voting |
| Agregasi regresi | Rata-rata prediksi | Rata-rata prediksi |
| Fokus utama | Mengurangi variance melalui agregasi | Mengurangi variance sekaligus mendekorelasi pohon |
Misalkan tersedia data latih \(D=(x_i,y_i)\), \(i=1,2,\ldots,n\) dan akan dibentuk \(B\) pohon. Secara sederhana, proses Random Forest dilakukan sebagai berikut (Fransiska, 2026):
mtry prediktor
secara acak dari seluruh \(p\)
prediktor.mtry prediktor
yang terpilih.Pada kasus klasifikasi, setiap pohon menghasilkan satu suara prediksi dan hasil akhir ditentukan berdasarkan suara terbanyak (majority vote) (Lestari & Sirodj, 2021). Hasil akhir dirumuskan sebagai berikut (Fransiska, 2026):
\[ \hat{G}_{RF}(x)=\operatorname{mode}\{G_1(x),G_2(x),\ldots,G_B(x)\} \]
Keterangan:
Setiap pohon dapat dibentuk secara relatif independen sehingga Random Forest termasuk parallel ensemble, berbeda dengan Boosting yang bersifat sekuensial (Fransiska, 2026).
Double Random Forest (DRF) diperkenalkan oleh Han, Kim, dan Lee pada tahun 2020. Metode ini dikembangkan untuk situasi ketika Random Forest masih mengalami underfitting karena pohon yang dihasilkan belum cukup besar. Pada Random Forest standar, setiap pohon dibentuk dari satu sampel bootstrap yang hanya memuat sekitar 63,2% observasi unik, sedangkan pada DRF setiap pohon dibangun menggunakan seluruh data training dan bootstrap digunakan sementara pada setiap node untuk mencari aturan pemisahan. Proses DRF dilakukan sebagai berikut (Fransiska, 2026):
mtry prediktor secara acak dan mencari
pemisahan terbaik menggunakan sampel bootstrap pada
node.Karena setiap pohon menggunakan seluruh data training, DRF cenderung menghasilkan pohon yang lebih besar, sedangkan penggunaan bootstrap pada setiap node dan random feature subset tetap menambah keragaman aturan pemisahan. Konsekuensinya, DRF umumnya membutuhkan waktu komputasi lebih besar daripada Random Forest. Perbedaan keduanya dirangkum pada Tabel 2 berikut (Fransiska, 2026).
Tabel 2. Perbedaan Random Forest dan Double Random Forest
| Aspek | Random Forest | Double Random Forest |
|---|---|---|
| Penggunaan data | Setiap pohon dibentuk dari hasil bootstrap pada data latih | Setiap pohon dibentuk dari seluruh data latih |
| Jumlah observasi unik | Sekitar \(1-e^{-1}\approx 0{,}63\) kali data latih | Bootstrap digunakan sementara pada setiap node untuk mencari pemisahan |
| Proses pemisahan | Random feature subset | Bootstrap sampling pada setiap node dan random feature subset |
| Ukuran pohon | Relatif lebih kecil | Cenderung lebih besar dan beragam |
| Waktu komputasi | Lebih cepat | Lebih lama |
| Hasil prediksi akhir | Majority voting | Majority voting |
mtry dan num.treesBeberapa parameter penting dalam Random Forest menggunakan
package ranger dirangkum pada Tabel 3 berikut
(Fransiska, 2026).
Tabel 3. Parameter Penting Random Forest
| Parameter | Peran |
|---|---|
num.trees |
Menentukan jumlah pohon yang dibentuk dalam ensemble. |
mtry |
Menentukan banyaknya prediktor kandidat yang dipilih secara acak pada setiap node. |
min.node.size |
Mengatur ukuran minimum node dan secara tidak langsung kompleksitas pohon. |
replace dan
sample.fraction |
Mengatur mekanisme dan proporsi sampling. |
splitrule |
Menentukan aturan pemisahan, misalnya Gini untuk klasifikasi. |
importance |
Menentukan apakah dan bagaimana variable importance dihitung. |
Menurut Ilmi dkk. (2025), mtry menentukan keragaman di
antara pohon keputusan, sedangkan ukuran node minimum berfungsi
sebagai kriteria penghentian yang mengontrol kedalaman pohon. Lestari
dan Sirodj (2021) menentukan jumlah pohon dan mtry yang
optimal berdasarkan nilai error OOB terkecil, dan hasil
penelitian tersebut menunjukkan bahwa perubahan error OOB tidak
selalu menurun secara konsisten ketika jumlah pohon bertambah. Oleh
karena itu, pemilihan parameter sebaiknya didasarkan pada hasil evaluasi
model, bukan hanya pada besarnya nilai parameter.
Pada bootstrap berukuran \(n\) yang diambil dengan pengembalian dari \(n\) observasi, sebagian observasi dapat terambil lebih dari sekali dan sebagian lainnya tidak terambil. Secara rata-rata, proporsi observasi unik dalam satu sampel bootstrap mendekati \(1-e^{-1}\approx 0{,}632\), sehingga sekitar 36,8% observasi tidak digunakan untuk membentuk pohon tertentu dan disebut observasi Out-of-Bag (OOB) (Fransiska, 2026)
Prediksi OOB untuk setiap observasi diperoleh hanya dari pohon-pohon
yang tidak menggunakan observasi tersebut ketika dibentuk. Pada
ranger, error OOB dihitung secara otomatis dan
untuk klasifikasi prediction.error menyatakan proporsi
salah klasifikasi OOB (Fransiska, 2026). Error OOB dihitung
dari proporsi kesalahan klasifikasi hasil prediksi OOB pada seluruh
amatan data asli (Lestari & Sirodj, 2021), yaitu:
\[ \text{OOB error}=\frac{1}{n}\sum_{i=1}^{n}I\left(y_i\neq\hat{y}_i^{OOB}\right) \]
Keterangan:
Nilai error OOB yang lebih kecil menunjukkan estimasi kesalahan internal model yang lebih kecil. Ilmi dkk. (2025) juga menggunakan sampel OOB untuk memperkirakan kesalahan model pada data latih.
Variable importance digunakan untuk melihat seberapa kuat
suatu variabel prediktor memengaruhi hasil prediksi. Semakin tinggi
nilai variable importance, semakin besar kontribusi variabel
tersebut terhadap hasil prediksi (Ilmi dkk., 2025). Pada praktikum ini
digunakan permutation importance, yaitu ukuran yang dihitung
dengan mengamati penurunan kinerja model setelah nilai suatu variabel
diacak, dengan argumen importance = "permutation" pada
ranger (Fransiska, 2026). Nilai ini menggambarkan
kontribusi prediktif variabel dalam model dan tidak menunjukkan hubungan
sebab-akibat.
Penelitian ini merupakan penelitian terapan dengan pendekatan
kuantitatif. Data yang digunakan adalah data sekunder berupa
dataset BreastCancer dari package
mlbench pada program R. Data tersebut memuat hasil
pengamatan sel jaringan payudara yang digunakan untuk mengklasifikasikan
tumor sebagai benign (jinak) atau malignant (ganas)
menggunakan metode Random Forest Classification.
Variabel yang digunakan dalam penelitian ini terdiri atas variabel
respons dan variabel prediktor. Variabel respons adalah
Class, yaitu kelas tumor dengan kategori benign
dan malignant. Variabel prediktor meliputi
Cl.thickness, Cell.size,
Cell.shape, Marg.adhesion,
Epith.c.size, Bare.nuclei,
Bl.cromatin, Normal.nucleoli, dan
Mitoses. Kolom Id tidak digunakan karena hanya
berfungsi sebagai identitas observasi.
Berikut merupakan algoritma pengolahan data:
Mulai.
Mengimpor dan membersihkan data.
Melakukan statistik deskriptif.
Membagi data training dan testing.
Membentuk sembilan model Random Forest dan menghitung OOB error.
Menyusun confusion matrix dan menghitung Accuracy, Precision, Recall, Specificity, dan F1-score.
Menganalisis variable importance.
Membandingkan hasil evaluasi model dan menentukan model terbaik.
Menarik kesimpulan.
Selesai.
Berikut merupakan diagram alir penelitian:
Gambar 3.1 Diagram Alir Penelitian
# 1. Library
library(ranger)
library(mlbench)
library(caret)
library(knitr)
library(ggplot2)
library(dplyr)
library(tidyr)# 2. Data
# Mengambil Dataset
data("BreastCancer", package = "mlbench")
bc.raw <- BreastCancer
# Melihat Struktur Data
str(bc.raw)## '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 ...
## [1] 699 11
Interpretasi: Dataset BreastCancer
terdiri atas 699 observasi dan 11 variabel, yaitu kolom Id,
sembilan variabel prediktor, dan variabel Class. Seluruh
variabel bertipe factor, sehingga prediktor perlu diubah
menjadi numerik sebelum dimodelkan.
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## 0 0 0 0 0
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 0 16 0 0 0
## Class
## 0
# Menghapus Kolom Id (Identitas Observasi)
bc <- bc.raw
bc$Id <- NULL
# Menghapus Pengamatan dengan Missing Value
bc <- na.omit(bc)
# Mengubah Prediktor Menjadi Numerik
kolom.prediktor <- setdiff(names(bc), "Class")
bc[kolom.prediktor] <- lapply(bc[kolom.prediktor], function(x) {
as.numeric(as.character(x))
})
# Menetapkan Urutan Kelas (benign sebagai Level Pertama)
bc$Class <- factor(as.character(bc$Class), levels = c("benign", "malignant"))
# Memeriksa Kembali Missing Value
colSums(is.na(bc))## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 0 0 0 0 0
## [1] 683 10
Interpretasi: Terdapat 16 data kosong pada variabel
Bare.nuclei. Data kosong ditangani menggunakan
na.omit() sehingga tersisa 683 observasi dan 10 variabel (9
prediktor dan 1 respons) tanpa data kosong. Kolom Id
dihapus karena hanya berfungsi sebagai identitas dan tidak memberikan
informasi untuk klasifikasi.
## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.00
## Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.00
## Mean : 4.442 Mean : 3.151 Mean : 3.215 Mean : 2.83
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.00
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.00
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.00
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 1.00
## Median : 2.000 Median : 1.000 Median : 3.000 Median : 1.00
## Mean : 3.234 Mean : 3.545 Mean : 3.445 Mean : 2.87
## 3rd Qu.: 4.000 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 4.00
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.00
## Mitoses Class
## Min. : 1.000 benign :444
## 1st Qu.: 1.000 malignant:239
## Median : 1.000
## Mean : 1.603
## 3rd Qu.: 1.000
## Max. :10.000
##
## benign malignant
## 444 239
##
## benign malignant
## 0.6501 0.3499
Interpretasi: Seluruh prediktor memiliki nilai
minimum 1 dan maksimum 10. Rata-rata tertinggi terdapat pada
Cl.thickness (4,442) dan Bare.nuclei (3,545),
sedangkan rata-rata terendah terdapat pada Mitoses (1,603)
dengan median 1. Distribusi kelas menunjukkan 444 observasi
benign (65,0%) dan 239 observasi malignant (35,0%).
Dengan demikian, data tidak seimbang sempurna sehingga evaluasi model
tidak cukup hanya menggunakan Accuracy.
# 5. Pemisahan Variabel Respons dan Prediktor
# Variabel Respons
Y <- bc$Class
# Variabel Prediktor
X <- bc[, names(bc) != "Class"]
# Memeriksa Tipe Data Variabel Respons
class(Y)## [1] "factor"
## [1] "benign" "malignant"
Interpretasi: Variabel respons yang digunakan adalah
Class dengan tipe factor dan dua level, yaitu
benign dan malignant. Seluruh variabel lainnya menjadi
prediktor. Karena benign berada pada level pertama, kelas
malignant berperan sebagai kelas positif pada evaluasi.
# 6. Pembagian Data Training dan Testing
set.seed(234)
train <- createDataPartition(
Y,
p = 0.7,
list = FALSE
)
bc.train <- bc[train, ]
bc.test <- bc[-train, ]
# Memeriksa Dimensi Data Training dan Testing
dim(bc.train)## [1] 479 10
## [1] 204 10
##
## benign malignant
## 311 168
##
## benign malignant
## 133 71
Interpretasi: Data dibagi menjadi 70% data training sebanyak 479 observasi dan 30% data testing sebanyak 204 observasi. Data training terdiri atas 311 observasi benign dan 168 observasi malignant, sedangkan data testing terdiri atas 133 observasi benign dan 71 observasi malignant. Proporsi kedua kelas relatif terjaga pada kedua bagian data, dan data testing yang sama digunakan untuk membandingkan seluruh model.
# 7. Pembentukan Model Random Forest
kombinasi <- expand.grid(
mtry = c(2, 3, 5),
num.trees = c(200, 500, 1000),
KEEP.OUT.ATTRS = FALSE,
stringsAsFactors = FALSE
)
nama.model <- paste0("mtry", kombinasi$mtry, "_trees", kombinasi$num.trees)
model.rf <- vector("list", nrow(kombinasi))
names(model.rf) <- nama.model
for (i in seq_len(nrow(kombinasi))) {
model.rf[[i]] <- 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
)
}
# Menyusun OOB Error Seluruh Model
hasil.oob <- data.frame(
Model = nama.model,
mtry = kombinasi$mtry,
Num_Trees = kombinasi$num.trees,
OOB_Error = sapply(model.rf, function(m) m$prediction.error),
row.names = NULL
)
kable(hasil.oob, digits = 4,
caption = "Perbandingan OOB Error pada Sembilan Model")| Model | mtry | Num_Trees | OOB_Error |
|---|---|---|---|
| mtry2_trees200 | 2 | 200 | 0.0292 |
| mtry3_trees200 | 3 | 200 | 0.0271 |
| mtry5_trees200 | 5 | 200 | 0.0292 |
| mtry2_trees500 | 2 | 500 | 0.0292 |
| mtry3_trees500 | 3 | 500 | 0.0292 |
| mtry5_trees500 | 5 | 500 | 0.0292 |
| mtry2_trees1000 | 2 | 1000 | 0.0292 |
| mtry3_trees1000 | 3 | 1000 | 0.0271 |
| mtry5_trees1000 | 5 | 1000 | 0.0271 |
Interpretasi: Nilai OOB error kesembilan
model berkisar antara 0,0271 hingga 0,0292 (sekitar 2,71%–2,92%). OOB
error terendah sebesar 0,0271 diperoleh pada
mtry3_trees200, mtry3_trees1000, dan
mtry5_trees1000, sedangkan enam konfigurasi lainnya
bernilai 0,0292. Selisih antarmodel sangat kecil (sekitar satu observasi
dari 479 data training) dan penambahan jumlah pohon tidak
selalu menurunkan OOB error. Oleh karena itu, penentuan model
terbaik tidak cukup hanya berdasarkan OOB error tetapi juga
perlu mempertimbangkan metrik pada data testing.
# 8. Analisis Variable Importance (Permutation)
importance.all <- bind_rows(lapply(names(model.rf), function(nm) {
imp <- model.rf[[nm]]$variable.importance
data.frame(
Model = nm,
Variabel = names(imp),
Permutation_Importance = as.numeric(imp),
row.names = NULL
)
}))
# Variabel Terpenting pada Model mtry2_trees200
importance.all %>%
filter(Model == "mtry2_trees200") %>%
arrange(desc(Permutation_Importance))## Model Variabel Permutation_Importance
## 1 mtry2_trees200 Bare.nuclei 0.083924522
## 2 mtry2_trees200 Cell.size 0.078718154
## 3 mtry2_trees200 Cell.shape 0.060967868
## 4 mtry2_trees200 Cl.thickness 0.024489152
## 5 mtry2_trees200 Bl.cromatin 0.021478062
## 6 mtry2_trees200 Normal.nucleoli 0.020446839
## 7 mtry2_trees200 Marg.adhesion 0.019251533
## 8 mtry2_trees200 Epith.c.size 0.011737675
## 9 mtry2_trees200 Mitoses 0.003751688
# Visualisasi Variable Importance Seluruh Model
ggplot(importance.all,
aes(x = reorder(Variabel, Permutation_Importance),
y = Permutation_Importance)) +
geom_col() +
coord_flip() +
facet_wrap(~ Model) +
labs(
title = "Variable Importance pada Sembilan Model Random Forest",
x = "Variabel",
y = "Permutation Importance"
) +
theme_minimal()
Interpretasi: Pada seluruh model,
Bare.nuclei dan Cell.size selalu berada pada
dua peringkat teratas, diikuti Cell.shape pada model dengan
mtry 2 dan 3. Pada model mtry2_trees200, lima
variabel terpenting adalah Bare.nuclei (0,0839),
Cell.size (0,0787), Cell.shape (0,0610),
Cl.thickness (0,0245), dan Bl.cromatin
(0,0215), sedangkan Mitoses memiliki nilai terendah
(0,0038). Pada model dengan mtry = 5, nilai
Bare.nuclei lebih besar (sekitar 0,12) sedangkan nilai
Cell.shape menurun (sekitar 0,04–0,05) meskipun tetap
berada pada peringkat ketiga. Nilai yang lebih tinggi berarti pengacakan
variabel tersebut menurunkan kinerja model lebih besar. Meskipun
demikian, ukuran ini hanya menggambarkan kontribusi prediktif dalam
model dan tidak menunjukkan hubungan sebab-akibat.
# 9. Prediksi dan Confusion Matrix
hitung.evaluasi <- function(aktual, prediksi) {
prediksi <- factor(as.character(prediksi), levels = c("benign", "malignant"))
tab <- table(Aktual = aktual, Prediksi = prediksi)
TN <- tab["benign", "benign"]
FP <- tab["benign", "malignant"]
FN <- tab["malignant", "benign"]
TP <- tab["malignant", "malignant"]
precision <- TP / (TP + FP)
recall <- TP / (TP + FN)
data.frame(
TN = as.integer(TN), FP = as.integer(FP),
FN = as.integer(FN), TP = as.integer(TP),
Accuracy = (TP + TN) / sum(tab),
Precision = precision,
Recall = recall,
Specificity = TN / (TN + FP),
F1_Score = 2 * precision * recall / (precision + recall)
)
}
hasil.metrik <- bind_rows(lapply(seq_along(model.rf), function(i) {
pred <- predict(model.rf[[i]], data = bc.test)$predictions
data.frame(
Model = nama.model[i],
mtry = kombinasi$mtry[i],
Num_Trees = kombinasi$num.trees[i],
hitung.evaluasi(bc.test$Class, pred)
)
}))
# Confusion Matrix Seluruh Model
kable(hasil.metrik[, c("Model", "TN", "FP", "FN", "TP")],
caption = "Confusion Matrix Seluruh Model (kelas positif: malignant)")| Model | TN | FP | FN | TP |
|---|---|---|---|---|
| mtry2_trees200 | 130 | 3 | 1 | 70 |
| mtry3_trees200 | 130 | 3 | 3 | 68 |
| mtry5_trees200 | 129 | 4 | 4 | 67 |
| mtry2_trees500 | 129 | 4 | 1 | 70 |
| mtry3_trees500 | 130 | 3 | 3 | 68 |
| mtry5_trees500 | 129 | 4 | 4 | 67 |
| mtry2_trees1000 | 129 | 4 | 2 | 69 |
| mtry3_trees1000 | 129 | 4 | 3 | 68 |
| mtry5_trees1000 | 129 | 4 | 5 | 66 |
Interpretasi: Pada mtry2_trees200,
sebanyak 130 observasi benign diklasifikasikan benar (TN) dan 3
observasi salah diklasifikasikan sebagai malignant (FP),
sedangkan 70 observasi malignant diklasifikasikan benar (TP)
dan hanya 1 observasi salah diklasifikasikan sebagai benign
(FN). Jumlah FN terkecil (1 observasi) dicapai oleh
mtry2_trees200 dan mtry2_trees500, sedangkan
FN terbesar (5 observasi) terjadi pada mtry5_trees1000.
Pada kasus kanker, FN merupakan kesalahan yang paling perlu dihindari
karena kasus ganas yang tidak terdeteksi berpotensi terlambat
ditangani.
# 10. Metrik Evaluasi Data Testing
kable(hasil.metrik[, c("Model", "Accuracy", "Precision", "Recall",
"Specificity", "F1_Score")],
digits = 4,
caption = "Perbandingan Metrik Evaluasi pada Data Testing")| Model | Accuracy | Precision | Recall | Specificity | F1_Score |
|---|---|---|---|---|---|
| mtry2_trees200 | 0.9804 | 0.9589 | 0.9859 | 0.9774 | 0.9722 |
| mtry3_trees200 | 0.9706 | 0.9577 | 0.9577 | 0.9774 | 0.9577 |
| mtry5_trees200 | 0.9608 | 0.9437 | 0.9437 | 0.9699 | 0.9437 |
| mtry2_trees500 | 0.9755 | 0.9459 | 0.9859 | 0.9699 | 0.9655 |
| mtry3_trees500 | 0.9706 | 0.9577 | 0.9577 | 0.9774 | 0.9577 |
| mtry5_trees500 | 0.9608 | 0.9437 | 0.9437 | 0.9699 | 0.9437 |
| mtry2_trees1000 | 0.9706 | 0.9452 | 0.9718 | 0.9699 | 0.9583 |
| mtry3_trees1000 | 0.9657 | 0.9444 | 0.9577 | 0.9699 | 0.9510 |
| mtry5_trees1000 | 0.9559 | 0.9429 | 0.9296 | 0.9699 | 0.9362 |
Interpretasi: Model mtry2_trees200
memperoleh Accuracy 0,9804 (98,04%), Precision 0,9589
(95,89%), Recall 0,9859 (98,59%), Specificity 0,9774
(97,74%), dan F1-score 0,9722 (97,22%), yang merupakan nilai
tertinggi pada kelima metrik tersebut (Recall sama tinggi
dengan mtry2_trees500, dan Specificity sama tinggi
dengan mtry3_trees200 serta mtry3_trees500).
Seluruh model memiliki Accuracy di atas 95% (0,9559–0,9804).
Specificity relatif seragam (0,9699–0,9774), sedangkan
Recall lebih bervariasi (0,9296–0,9859), sehingga perbedaan
kinerja antarmodel terutama terletak pada kemampuan mendeteksi kasus
malignant.
# 11. Visualisasi Perbandingan Metrik
kolom.metrik <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")
hasil.metrik$Konfigurasi <- paste0("mtry=", hasil.metrik$mtry,
", trees=", hasil.metrik$Num_Trees)
hasil.long <- pivot_longer(
hasil.metrik,
cols = all_of(kolom.metrik),
names_to = "Metrik",
values_to = "Nilai"
)
ggplot(hasil.long, aes(x = Konfigurasi, y = Nilai)) +
geom_point(size = 2) +
facet_wrap(~ Metrik, scales = "free_y") +
labs(
title = "Perbandingan Metrik Random Forest pada Data Testing",
x = "Konfigurasi Model",
y = "Nilai Metrik"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Interpretasi: Grafik memperlihatkan bahwa
mtry2_trees200 berada pada posisi tertinggi untuk
Accuracy, Precision, dan F1-score, serta sama
tinggi untuk Recall. Konfigurasi dengan mtry = 5
cenderung menghasilkan nilai terendah, misalnya
mtry5_trees1000 dengan Recall 0,9296 (92,96%) dan
F1-score 0,9362 (93,62%). Selain itu, penambahan jumlah pohon
dari 200 menjadi 1000 tidak meningkatkan kinerja; pada mtry
= 2, Recall justru turun dari 0,9859 menjadi 0,9718. Hal ini
menunjukkan bahwa jumlah pohon yang lebih banyak tidak selalu
memperbaiki hasil klasifikasi.
# 12. Peringkat Model (peringkat kecil = lebih baik)
peringkat <- hasil.metrik %>%
left_join(hasil.oob %>% select(Model, OOB_Error), by = "Model") %>%
mutate(
Rank_Accuracy = rank(-Accuracy, ties.method = "min"),
Rank_Precision = rank(-Precision, ties.method = "min"),
Rank_Recall = rank(-Recall, ties.method = "min"),
Rank_Specificity = rank(-Specificity, ties.method = "min"),
Rank_F1 = rank(-F1_Score, ties.method = "min"),
Rank_OOB = rank(OOB_Error, ties.method = "min"),
Rata_Rata_Peringkat = (Rank_Accuracy + Rank_Precision + Rank_Recall +
Rank_Specificity + Rank_F1 + Rank_OOB) / 6
) %>%
arrange(Rata_Rata_Peringkat, desc(Recall), OOB_Error)
kable(peringkat %>%
select(Model, OOB_Error, starts_with("Rank_"), Rata_Rata_Peringkat),
digits = 4,
caption = "Peringkat Model Berdasarkan Metrik Testing dan OOB Error")| Model | OOB_Error | Rank_Accuracy | Rank_Precision | Rank_Recall | Rank_Specificity | Rank_F1 | Rank_OOB | Rata_Rata_Peringkat |
|---|---|---|---|---|---|---|---|---|
| mtry2_trees200 | 0.0292 | 1 | 1 | 1 | 1 | 1 | 4 | 1.5000 |
| mtry3_trees200 | 0.0271 | 3 | 2 | 4 | 1 | 4 | 1 | 2.5000 |
| mtry2_trees500 | 0.0292 | 2 | 4 | 1 | 4 | 2 | 4 | 2.8333 |
| mtry3_trees500 | 0.0292 | 3 | 2 | 4 | 1 | 4 | 4 | 3.0000 |
| mtry2_trees1000 | 0.0292 | 3 | 5 | 3 | 4 | 3 | 4 | 3.6667 |
| mtry3_trees1000 | 0.0271 | 6 | 6 | 4 | 4 | 6 | 1 | 4.5000 |
| mtry5_trees200 | 0.0292 | 7 | 7 | 7 | 4 | 7 | 4 | 6.0000 |
| mtry5_trees500 | 0.0292 | 7 | 7 | 7 | 4 | 7 | 4 | 6.0000 |
| mtry5_trees1000 | 0.0271 | 9 | 9 | 9 | 4 | 9 | 1 | 6.8333 |
## [1] "mtry2_trees200"
Interpretasi: Berdasarkan rata-rata peringkat enam
ukuran (lima metrik testing dan OOB error),
mtry2_trees200 menempati peringkat pertama dengan rata-rata
1,5. Model ini peringkat 1 pada Accuracy, Precision,
Recall, Specificity, dan F1-score, tetapi
hanya peringkat 4 pada OOB error (0,0292). Peringkat berikutnya
adalah mtry3_trees200 (2,5) dan mtry2_trees500
(2,833). Dengan demikian, mtry2_trees200 dipilih sebagai
model terbaik karena memiliki kinerja klasifikasi tertinggi pada data
testing, terutama Recall terhadap kelas
malignant sebesar 98,59%. Selisih OOB error terhadap
model lain sangat kecil, sehingga tidak mengubah pilihan ini. Namun,
hasil ini masih terbatas pada dataset dan satu kali pembagian
data yang digunakan, sehingga diperlukan pengujian pada data independen
apabila model akan diterapkan dalam konteks medis.
Random Forest merupakan metode ensemble yang menggabungkan banyak decision tree melalui pemilihan sampel dan fitur secara acak. Double Random Forest merupakan pengembangan metode Random Forest dengan dua tahap pemodelan. Kedua metode bertujuan menghasilkan prediksi yang akurat untuk klasifikasi dan regresi.
Penerapan Random Forest dan Double Random Forest dilakukan melalui persiapan data, pelatihan model, dan prediksi. Pada klasifikasi, model memprediksi kategori, sedangkan pada regresi model memprediksi nilai numerik. Hasil prediksi diperoleh berdasarkan mekanisme masing-masing algoritma.
Evaluasi klasifikasi menggunakan accuracy dan F1-score, sedangkan regresi menggunakan RMSE dan R^2. Out-of-Bag (OOB) eror digunakan untuk mengestimasi kesalahan prediksi model. Perbandingan kedua metode dilakukan berdasarkan hasil evaluasi untuk menentukan model dengan performa terbaik.
Model Random Forest pada dataset BreastCancer
menggunakan 683 observasi dengan OOB error sebesar 0,0271–0,0292 dari
sembilan kombinasi parameter. Model terbaik dengan mtry = 2
dan num.trees = 200 memperoleh Accuracy 98,04% dan F1-score
97,22%, dengan satu kasus malignant tidak terdeteksi. Variabel
terpenting dalam model adalah Bare.nuclei,
Cell.size, dan Cell.shape.
Penelitian selanjutnya disarankan untuk memperbaiki penulisan kode dan sintaks program agar terhindar dari kesalahan (error). Setiap tahapan analisis perlu diperiksa untuk memastikan proses berjalan sesuai prosedur. Selain itu, ketelitian dalam menjalankan dan mengevaluasi program perlu ditingkatkan agar hasil analisis lebih akurat.
.