Perkembangan teknologi informasi menyebabkan jumlah data yang tersedia semakin meningkat sehingga diperlukan metode analisis yang mampu mengolah data dan menghasilkan prediksi secara tepat. Salah satu pendekatan yang dapat digunakan adalah machine learning, khususnya ensemble learning yang menggabungkan beberapa model untuk meningkatkan kemampuan prediksi. Salah satu metode ensemble learning yang banyak digunakan adalah Random Forest, yaitu metode yang membentuk sejumlah pohon keputusan (decision tree) melalui proses pengambilan sampel dan pemilihan variabel secara acak. Metode ini dapat diterapkan untuk menyelesaikan permasalahan klasifikasi maupun regresi berdasarkan karakteristik data yang dianalisis (Sukarna dkk., 2023).
Pengembangan metode Random Forest menghasilkan pendekatan lain, yaitu Double Random Forest yang dapat digunakan sebagai alternatif dalam meningkatkan kemampuan pemodelan. Perbedaan kedua metode tersebut berkaitan dengan proses pembentukan pohon keputusan, khususnya pengaturan ukuran minimum pengamatan pada setiap simpul (nodesize). Double Random Forest membentuk pohon yang lebih besar sehingga dapat menjadi alternatif untuk mengatasi keterbatasan pengaturan ukuran simpul pada Random Forest. Oleh karena itu, kedua metode perlu dipahami dan diimplementasikan untuk mengetahui karakteristik serta kemampuan masing-masing dalam menghasilkan prediksi (Hidayatulloh dkk., 2022).
Evaluasi pada klasifikasi dapat dilakukan menggunakan akurasi, presisi, recall, dan F1-score, sedangkan evaluasi regresi dapat menggunakan RMSE dan MAE. Selain itu, metode Random Forest menyediakan ukuran kesalahan Out-of-Bag (OOB) yang digunakan untuk memperkirakan kesalahan prediksi berdasarkan pengamatan yang tidak digunakan dalam pembentukan masing-masing pohon. Dengan demikian, evaluasi dan perbandingan performa Random Forest dan Double Random Forest diperlukan untuk mengetahui kemampuan kedua metode dalam menyelesaikan permasalahan klasifikasi maupun regresi (Hamami dan Dahlan, 2022).
Berdasarkan latar belakang tersebut, rumusan masalah dalam praktikum ini adalah sebagai berikut.
1. Bagaimana konsep dasar Random Forestdan Double Random Forest sebagai metode ensemble berbasis decision tree?
2. Bagaimana cara mengimplementasikan Random Fores untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi?
3. Bagaimana cara mengevaluasi performa model, memahami Out-of-Bag (OOB) error, dan membandingkan Random Forest dengan Double Random Forest?
Tujuan yang ingin dicapai dalam praktikum ini adalah sebagai berikut:
1. Mahasiswa dapat memahami Random Forestdan Double Random Forest sebagai metode ensemble berbasis decision tree.
2. Mahasiswa dapat mengimplementasikan Random Fores untuk klasifikasi dan regresi, serta Double Random Forest untuk klasifikasi dan regresi.
3. Mahasiswa dapat mengevaluasi performa model, memahami Out-of-Bag (OOB) error, dan membandingkan Random Forest dengan Double Random Forest.
Random Forest adalah metode ensemble learning berbasis decision tree yang membentuk sejumlah pohon keputusan dan menggabungkan hasil prediksinya untuk memperoleh prediksi akhir. Metode ini menggunakan teknik Bootstrap Aggregating (bagging), yaitu pengambilan sampel secara acak dengan pengembalian dari data latih untuk membentuk setiap pohon. Selain itu, pada setiap node, sejumlah prediktor dipilih secara acak dari seluruh prediktor yang tersedia untuk menentukan pemisahan terbaik. Penggunaan pengacakan pada pembentukan pohon bertujuan menghasilkan keragaman antar-pohon sehingga penggabungan prediksi dapat meningkatkan kemampuan model dalam klasifikasi maupun regresi (Sukarna dkk., 2023).
Secara sederhana, proses Random Forest adalah sebagai berikut (Fransiska, 2026): 1). Mengambil sampel bootstrap dari data latih untuk setiap pohon 2). Pada setiap node, memilih mtry prediktor secara acak dari seluruh 𝑝prediktor. 3). Menentukan split terbaik hanya dari mtry prediktor yang terpilih. 4). Menumbuhkan decision tree hingga memenuhi aturan penghentian, misalnya minimum node size. 5). Mengulangi proses sampai diperoleh 𝐵 tree, kemudian menggabungkan prediksi seluruh tree. Untuk Untuk klasifikasi, hasil akhir diperoleh melalui majority voting:
\[\hat{G}_{RF}(x) = \text{mode}\{G_1(x), G_2(x), \ldots, G_B(x)\}\] Untuk regresi, hasil akhir diperoleh dengan merata-ratakan prediksi semua tree:
\[\hat{f}_{RF}(x) = \frac{1}{B}\sum_{b=1}^{B} T_b(x)\] Dengan demikian, Random Forest tetap merupakan metode parallel ensemble, dengan setiap tree dapat dibentuk secara relatif independen, berbeda dari Boosting yang bersifat sequential.
Pada proses bootstrap berukuran \(n\) yang diambil dengan pengembalian dari \(n\) observasi, setiap observasi memiliki peluang tidak terpilih sebesar \((1-\frac{1}{n})^n\), yang mendekati \(e^{-1}\) atau sekitar 36,8% ketika ukuran sampel semakin besar. Observasi yang tidak digunakan dalam pembentukan suatu pohon disebut Out-of-Bag (OOB) dan dapat dimanfaatkan untuk mengevaluasi kemampuan prediksi pohon tersebut. Prediksi OOB setiap observasi diperoleh dengan menggabungkan hasil prediksi dari pohon-pohon yang tidak menggunakan observasi tersebut dalam proses pembentukannya. Pada klasifikasi, OOB error adalah proporsi kesalahan klasifikasi berdasarkan prediksi OOB, sedangkan pada regresi dapat dihitung menggunakan ukuran kesalahan seperti RMSE. Dengan demikian, OOB dapat digunakan sebagai evaluasi internal model tanpa harus menggunakan data pengujian secara langsung (Hamami & Dahlan, 2022).
Parameter yang digunakan dalam pembentukan Random Forest perlu ditentukan untuk mengatur proses pembentukan pohon dan kemampuan prediksi model. Parameter num.trees digunakan untuk menentukan jumlah pohon yang dibentuk dalam ensemble, sedangkan mtry menentukan jumlah prediktor yang dipilih secara acak sebagai kandidat pemisahan pada setiap node. Parameter min.node.size menentukan ukuran minimum pengamatan pada simpul terminal, sedangkan replace = TRUE menunjukkan bahwa pengambilan sampel dilakukan dengan pengembalian (Sukarna dkk., 2023).
Evaluasi model klasifikasi dilakukan menggunakan confusion matrix untuk mengetahui kesesuaian hasil prediksi dengan kelas aktual. Berikut rumus matematis yang digunakan untuk mengetahui kemampuan model dalam mengklasifikasikan data secara tepat:
\[Accuracy = \frac{TP + TN}{TP + TN + FP + FN} \quad Precision = \frac{TP}{TP + FP}\]
\[Recall = \frac{TP}{TP + FN}, \quad Specificity = \frac{TN}{TN + FP}, \quad F1 = \frac{2 \times Precision \times Recall}{Precision + Recall}\]
Semakin besar nilai ukuran-ukuran tersebut, semakin baik performa model. Sebaliknya, OOB error yang semakin kecil menunjukkan model yang semakin baik.
Variable importance merupakan ukuran yang digunakan untuk mengetahui kontribusi relatif setiap prediktor terhadap kemampuan prediksi model Random Forest. Pada parameter importance = “permutation”, kepentingan prediktor dihitung berdasarkan perubahan performa model setelah nilai prediktor tersebut diacak. Pengacakan dilakukan untuk mengetahui sejauh mana model mengalami penurunan kemampuan prediksi ketika informasi dari suatu prediktor terganggu. Prediktor yang menghasilkan penurunan performa lebih besar setelah pengacakan menunjukkan kontribusi yang lebih penting terhadap prediksi model. Nilai variable importance tidak menunjukkan hubungan sebab-akibat dan perlu diinterpretasikan sebagai ukuran kontribusi prediktor terhadap performa model (Sukarna dkk., 2023).
Jenis data yang digunakan dalam penelitian ini adalah data
kuantitatif, yaitu data berbentuk angka yang dapat diolah dan dianalisis
secara statistik. Data yang digunakan merupakan data sekunder, yaitu
data BreastCancer yang tersedia pada package
mlbench dalam perangkat lunak R. Dataset ini
awalnya terdiri dari 699 pengamatan dengan satu variabel identitas
(Id), satu variabel respon (Class) berupa
kategori benign dan malignant, serta sembilan variabel
prediktor yang menggambarkan karakteristik sel dan dinilai dengan skor 1
sampai 10. Setelah variabel Id dihapus dan pengamatan yang
mengandung missing value dihilangkan, data digunakan untuk
membangun model klasifikasi menggunakan metode Random Forest
dengan variasi mtry sebesar 2, 3, dan 5 serta
num.trees sebesar 200, 500, dan 1000..
Variabel penelitian adalah segala sesuatu yang menjadi objek
pengamatan dalam suatu penelitian. Data BreastCancer
awalnya terdiri atas 699 observasi dan 11 variabel. Variabel
Id merupakan identitas observasi sehingga tidak digunakan
dalam pemodelan. Dengan demikian, penelitian ini menggunakan 10
variabel, yaitu satu variabel respon (Class) dan sembilan
variabel prediktor yang menggambarkan karakteristik sel. Terdapat
missing value pada variabel Bare.nuclei yang ditangani
dengan menghapus observasi yang mengandung nilai hilang, sehingga jumlah
observasi yang dianalisis menjadi 683 observasi. Variabel-variabel yang
digunakan disajikan pada tabel berikut.
| No | Variabel | Keterangan | Skala |
|---|---|---|---|
| 1 | Class |
Kelas tumor (respon): benign dan malignant | Kategorik |
| 2 | Cl.thickness |
Ketebalan gumpalan sel (clump thickness) | Skor 1–10 |
| 3 | Cell.size |
Keseragaman ukuran sel | Skor 1–10 |
| 4 | Cell.shape |
Keseragaman bentuk sel | Skor 1–10 |
| 5 | Marg.adhesion |
Perlekatan marginal (marginal adhesion) | Skor 1–10 |
| 6 | Epith.c.size |
Ukuran sel epitel tunggal | Skor 1–10 |
| 7 | Bare.nuclei |
Inti sel telanjang (bare nuclei) | Skor 1–10 |
| 8 | Bl.cromatin |
Kromatin halus (bland chromatin) | Skor 1–10 |
| 9 | Normal.nucleoli |
Nukleolus normal | Skor 1–10 |
| 10 | Mitoses |
Tingkat mitosis | Skor 1–10 |
Berikut langkah-langkah analisis data pada penelitian ini:
Input data BreastCancer dari
package mlbench.
Eksplorasi data.
Persiapan data.
Pembagian data training dan testing.
Pembentukan model Random Forest.
Evaluasi model menggunakan nilai OOB error.
Prediksi data testing dan evaluasi model.
Pemilihan model terbaik .
Analisis variable importance pada model terbaik.
Interpretasi hasil dan penarikan kesimpulan.
Berikut diagram alir analisis data: Alur analisis disajikan pada diagram alir berikut.
Gambar 1. Diagram alir analisis data
## Loading required package: ggplot2
## Loading required package: lattice
## [1] 699 11
## '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
##
##
##
##
##
Data BreastCancer berisi variabel Id,
sembilan prediktor karakteristik sel, dan variabel Class
sebagai target klasifikasi. Ringkasan data menunjukkan adanya
missing value pada variabel Bare.nuclei.
# Menghapus variabel identitas
bc$Id <- NULL
# Jumlah missing value sebelum penanganan
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
## 16 0 0 0 0
# Menghapus observasi yang mengandung missing value
bc <- na.omit(bc)
# Memastikan variabel target berupa faktor
bc$Class <- droplevels(as.factor(bc$Class))
dim(bc)## [1] 683 10
## [1] "benign" "malignant"
##
## benign malignant
## 444 239
##
## benign malignant
## 0.6500732 0.3499268
Setelah variabel Id dihapus dan observasi dengan
missing value dihilangkan, diperoleh data bersih dengan jumlah
observasi seperti ditampilkan pada keluaran di atas. Kelas
malignant ditetapkan sebagai kelas positif pada evaluasi
model.
Data dibagi menjadi 70% data training dan 30% data
testing berdasarkan variabel Class.
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
mtry dan num.treesPada langkah ini, melakukan Random Forest pada data dengan membandingkan mtry (2, 3, 5) dan num.trees(200, 500, 1000):
prediktor <- setdiff(names(bc.train), "Class")
lv <- levels(bc.train$Class)
grid <- expand.grid(
mtry = c(2, 3, 5),
num.trees = c(200, 500, 1000)
)
grid$Model <- paste0("mtry=", grid$mtry, ", ntree=", grid$num.trees)
model_rf <- vector("list", nrow(grid))
names(model_rf) <- grid$Model
for (i in seq_len(nrow(grid))) {
set.seed(234)
model_rf[[i]] <- ranger(
Class ~ ., data = bc.train,
num.trees = grid$num.trees[i],
mtry = grid$mtry[i],
min.node.size = 1,
replace = TRUE,
sample.fraction = 1,
importance = "permutation",
seed = 234
)
}
# Contoh ringkasan satu model (mtry = 3, num.trees = 500)
model_rf[["mtry=3, ntree=500"]]## Ranger result
##
## Call:
## ranger(Class ~ ., data = bc.train, num.trees = grid$num.trees[i], mtry = grid$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 %
Pada tahap ini, diperoleh hasil model Random Forest dengan klasifikasi yang dibentuk dari 500 pohon dengan 479 observasi training, 9 variabel prediktor, dan mtry = 3, sehingga setiap node hanya mempertimbangkan 3 prediktor yang dipilih secara acak. Model menggunakan min.node.size = 1 sehingga pohon tumbuh penuh, dengan aturan pemisahan Gini dan variable importance berbasis permutation. Nilai OOB error sebesar 2,92% menunjukkan bahwa sekitar 2,92% observasi training salah diklasifikasikan pada prediksi OOB, atau akurasi OOB sekitar 97,08%.
tabel_oob <- data.frame(
mtry = grid$mtry,
num.trees = grid$num.trees,
OOB_Error = sapply(model_rf, function(m) m$prediction.error)
)
rownames(tabel_oob) <- NULL
kable(
tabel_oob,
digits = 4,
caption = "OOB error setiap kombinasi mtry dan num.trees"
)| mtry | num.trees | OOB_Error |
|---|---|---|
| 2 | 200 | 0.0292 |
| 3 | 200 | 0.0271 |
| 5 | 200 | 0.0292 |
| 2 | 500 | 0.0292 |
| 3 | 500 | 0.0292 |
| 5 | 500 | 0.0292 |
| 2 | 1000 | 0.0292 |
| 3 | 1000 | 0.0271 |
| 5 | 1000 | 0.0271 |
Pada tahap ini, diperoleh hasil bahwa OOB error seluruh
kombinasi berada pada kisaran 2,71% sampai 2,92%. Nilai terkecil 2,71%
dicapai pada mtry = 3 dengan num.trees = 200 dan
1000 serta mtry = 5 dengan num.trees = 1000,
sedangkan enam kombinasi lainnya bernilai 0,0292. Selisih tersebut
setara dengan sekitar satu observasi dari 479 observasi
training dan tidak menurun secara konsisten seiring
bertambahnya jumlah pohon. Dengan demikian, model relatif stabil
terhadap perubahan mtry dan num.trees.
warna <- c("blue", "red", "darkgreen")
mtry_nilai <- sort(unique(grid$mtry))
ntree_nilai <- sort(unique(grid$num.trees))
plot(
NA, xlim = range(ntree_nilai), ylim = range(tabel_oob$OOB_Error),
xlab = "Jumlah Pohon (num.trees)", ylab = "OOB Error",
main = "OOB Error berdasarkan mtry dan num.trees",
xaxt = "n"
)
axis(1, at = ntree_nilai)
for (j in seq_along(mtry_nilai)) {
sub <- tabel_oob[tabel_oob$mtry == mtry_nilai[j], ]
sub <- sub[order(sub$num.trees), ]
lines(sub$num.trees, sub$OOB_Error, type = "b", pch = 19,
col = warna[j], lwd = 2)
}
legend("topright", legend = paste("mtry =", mtry_nilai),
col = warna, lwd = 2, pch = 19, bty = "n")
Berdasarkan plot, OOB error untuk mtry = 2
bernilai konstan sebesar 0,0292 pada seluruh jumlah pohon (200, 500, dan
1000). Pada mtry = 3, OOB error sebesar 0,0271 pada
200 pohon, naik menjadi 0,0292 pada 500 pohon, lalu turun kembali
menjadi 0,0271 pada 1000 pohon. Pada mtry = 5, OOB
error sebesar 0,0292 pada 200 dan 500 pohon, kemudian turun
menjadi 0,0271 pada 1000 pohon, sehingga garisnya berimpit dengan
mtry = 3 pada rentang 500 sampai 1000 pohon. Seluruh nilai
hanya bergerak pada rentang y2,71% sampai 2,92% dan tidak menunjukkan
penurunan yang konsisten, sehingga penambahan jumlah pohon maupun
perubahan mtry tidak memberikan perbaikan yang berarti.
Berikut ditampilkan confusion matrix dan prediksi OOB:
## [1] 0.02922756
## predicted
## true benign malignant
## benign 303 8
## malignant 6 162
## [1] benign benign malignant malignant benign benign
## Levels: benign malignant
Berdasarkan hasil di atas, OOB error model contoh mtry = 3 dan num.trees = 500) sebesar 0,0292, artinya 14 dari 479 observasi training salah diklasifikasikan pada prediksi OOB. Confusion matrix OOB menunjukkan 303 observasi benign dan 162 observasi malignant diprediksi dengan benar, sedangkan 8 observasi benign diprediksi malignant (FP) dan 6 observasi malignant diprediksi benign (FN). Berdasarkan matriks tersebut, diperoleh sensitivity sebesar 96,43% dan specificity sebesar 97,43%, sehingga kesalahan model relatif seimbang pada kedua kelas.
Pada tahap ini, setiap model yang telah dibentuk digunakan untuk
memprediksi data testing, kemudian hasilnya dievaluasi
menggunakan confusion matrix, accuracy,
precision, recall, specificity, dan
F1-score dengan malignant sebagai kelas positif.
Perhitungan ukuran evaluasi tersebut dilakukan melalui satu fungsi yang
sama agar seluruh model dievaluasi dengan cara yang seragam.
hitung_evaluasi <- function(prediksi, aktual) {
prediksi <- factor(prediksi, levels = lv)
tab <- table(Aktual = aktual, Prediksi = prediksi)
TN <- tab["benign", "benign"]
FP <- tab["benign", "malignant"]
FN <- tab["malignant", "benign"]
TP <- tab["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)
data.frame(TN, FP, FN, TP, Accuracy, Precision, Recall, Specificity,
F1_Score = F1)
}prediksi_rf <- lapply(model_rf, function(m) {
factor(predict(m, data = bc.test)$predictions, levels = lv)
})
evaluasi_list <- lapply(prediksi_rf, hitung_evaluasi, aktual = bc.test$Class)
evaluasi_semua <- do.call(rbind, evaluasi_list)
hasil_semua <- data.frame(
mtry = grid$mtry,
num.trees = grid$num.trees,
OOB_Error = tabel_oob$OOB_Error,
evaluasi_semua
)
rownames(hasil_semua) <- NULL
kable(
hasil_semua[, c("mtry", "num.trees", "TN", "FP", "FN", "TP")],
caption = "Komponen confusion matrix data testing (kelas positif: malignant)"
)| mtry | num.trees | TN | FP | FN | TP |
|---|---|---|---|---|---|
| 2 | 200 | 130 | 3 | 1 | 70 |
| 3 | 200 | 130 | 3 | 3 | 68 |
| 5 | 200 | 129 | 4 | 4 | 67 |
| 2 | 500 | 129 | 4 | 1 | 70 |
| 3 | 500 | 130 | 3 | 3 | 68 |
| 5 | 500 | 129 | 4 | 4 | 67 |
| 2 | 1000 | 129 | 4 | 2 | 69 |
| 3 | 1000 | 129 | 4 | 3 | 68 |
| 5 | 1000 | 129 | 4 | 5 | 66 |
kable(
hasil_semua[, c("mtry", "num.trees", "OOB_Error", "Accuracy", "Precision",
"Recall", "Specificity", "F1_Score")],
digits = 4,
caption = "Perbandingan performa data testing untuk seluruh kombinasi parameter"
)| mtry | num.trees | OOB_Error | Accuracy | Precision | Recall | Specificity | F1_Score |
|---|---|---|---|---|---|---|---|
| 2 | 200 | 0.0292 | 0.9804 | 0.9589 | 0.9859 | 0.9774 | 0.9722 |
| 3 | 200 | 0.0271 | 0.9706 | 0.9577 | 0.9577 | 0.9774 | 0.9577 |
| 5 | 200 | 0.0292 | 0.9608 | 0.9437 | 0.9437 | 0.9699 | 0.9437 |
| 2 | 500 | 0.0292 | 0.9755 | 0.9459 | 0.9859 | 0.9699 | 0.9655 |
| 3 | 500 | 0.0292 | 0.9706 | 0.9577 | 0.9577 | 0.9774 | 0.9577 |
| 5 | 500 | 0.0292 | 0.9608 | 0.9437 | 0.9437 | 0.9699 | 0.9437 |
| 2 | 1000 | 0.0292 | 0.9706 | 0.9452 | 0.9718 | 0.9699 | 0.9583 |
| 3 | 1000 | 0.0271 | 0.9657 | 0.9444 | 0.9577 | 0.9699 | 0.9510 |
| 5 | 1000 | 0.0271 | 0.9559 | 0.9429 | 0.9296 | 0.9699 | 0.9362 |
Tabel 4.1 Komponen confusion matrix data testing.
| mtry | num.trees | TN | FP | FN | TP |
|---|---|---|---|---|---|
| 2 | 200 | 130 | 3 | 1 | 70 |
| 3 | 200 | 130 | 3 | 3 | 68 |
| 5 | 200 | 129 | 4 | 4 | 67 |
| 2 | 500 | 129 | 4 | 1 | 70 |
| 3 | 500 | 130 | 3 | 3 | 68 |
| 5 | 500 | 129 | 4 | 4 | 67 |
| 2 | 1000 | 129 | 4 | 2 | 69 |
| 3 | 1000 | 129 | 4 | 3 | 68 |
| 5 | 1000 | 129 | 4 | 5 | 66 |
Berdasarkan Tabel 4.1, data testing terdiri atas 204
observasi, yaitu 133 observasi benign dan 71 observasi
malignant. Jumlah FP pada seluruh model relatif sama, yaitu 3
sampai 4 observasi, sedangkan jumlah FN lebih bervariasi, yaitu 1 sampai
5 observasi. FN terkecil diperoleh pada mtry = 2 dengan
num.trees = 200 dan 500 (masing-masing 1 observasi),
sedangkan FN terbesar diperoleh pada mtry = 5 dengan
num.trees = 1000 (5 observasi). Perbedaan antar-model
terutama terletak pada jumlah tumor malignant yang terlewat
(FN), yang merupakan kesalahan paling berisiko dalam konteks
diagnosis.
Tabel 4.2 Perbandingan performa data testing seluruh kombinasi parameter
| mtry | num.trees | OOB Error | Accuracy | Precision | Recall | Specificity | F1-Score |
|---|---|---|---|---|---|---|---|
| 2 | 200 | 0,0292 | 0,9804 | 0,9589 | 0,9859 | 0,9774 | 0,9722 |
| 3 | 200 | 0,0271 | 0,9706 | 0,9577 | 0,9577 | 0,9774 | 0,9577 |
| 5 | 200 | 0,0292 | 0,9608 | 0,9437 | 0,9437 | 0,9699 | 0,9437 |
| 2 | 500 | 0,0292 | 0,9755 | 0,9459 | 0,9859 | 0,9699 | 0,9655 |
| 3 | 500 | 0,0292 | 0,9706 | 0,9577 | 0,9577 | 0,9774 | 0,9577 |
| 5 | 500 | 0,0292 | 0,9608 | 0,9437 | 0,9437 | 0,9699 | 0,9437 |
| 2 | 1000 | 0,0292 | 0,9706 | 0,9452 | 0,9718 | 0,9699 | 0,9583 |
| 3 | 1000 | 0,0271 | 0,9657 | 0,9444 | 0,9577 | 0,9699 | 0,9510 |
| 5 | 1000 | 0,0271 | 0,9559 | 0,9429 | 0,9296 | 0,9699 | 0,9362 |
Berdasarkan Tabel 4.2, seluruh model menghasilkan accuracy
yang tinggi (0,9559 sampai 0,9804) dengan specificity yang
stabil (0,9699 sampai 0,9774), tetapi accuracy menurun seiring
bertambahnya mtry pada setiap jumlah pohon, dan penambahan
pohon dari 200 menjadi 1000 tidak meningkatkan performa. Kombinasi
terbaik adalah mtry = 2 dengan num.trees = 200
karena memiliki accuracy (0,9804), recall (0,9859),
dan F1-score (0,9722) tertinggi. Kombinasi ini tidak memiliki
OOB error terkecil, sehingga evaluasi internal dan evaluasi
data testing tidak selalu menunjuk model yang sama.
matriks_acc <- tapply(hasil_semua$Accuracy,
list(mtry = hasil_semua$mtry,
num.trees = hasil_semua$num.trees),
mean)
barplot(
matriks_acc, beside = TRUE, col = warna,
ylim = c(min(matriks_acc) - 0.02, 1),
xpd = FALSE,
xlab = "Jumlah Pohon (num.trees)", ylab = "Accuracy (data testing)",
main = "Accuracy Data Testing berdasarkan mtry dan num.trees"
)
legend("bottomright", legend = paste("mtry =", rownames(matriks_acc)),
fill = warna, bty = "n")
Berdasarkan plot, accuracy data testing
tertinggi diperoleh pada mtry = 2 di setiap jumlah pohon,
diikuti mtry = 3 dan mtry = 5, sehingga batang
cenderung menurun seiring bertambahnya mtry`. Pada 200 pohon,
accuracy mtry = 2 mendekati 0,98, kemudian sedikit
menurun menjadi sekitar 0,975 pada 500 pohon dan sekitar 0,97 pada 1000
pohon. Batang mtry = 3 dan mtry = 5 relatif tetap,
dengan penurunan kecil pada 1000 pohon, yang menunjukkan bahwa
penambahan jumlah pohon tidak meningkatkan accuracy.
Model terbaik dipilih berdasarkan accuracy data testing tertinggi. Apabila terdapat nilai yang sama, pemilihan dilanjutkan berdasarkan recall tertinggi (untuk meminimalkan FN), kemudian F1-score tertinggi, dan terakhir OOB error terkecil.
urutan <- order(-hasil_semua$Accuracy, -hasil_semua$Recall,
-hasil_semua$F1_Score, hasil_semua$OOB_Error)
idx_best <- urutan[1]
nama_best <- grid$Model[idx_best]
rf_best <- model_rf[[idx_best]]
pred_best <- prediksi_rf[[idx_best]]
cat("Model terbaik:", nama_best, "\n")## Model terbaik: mtry=2, ntree=200
cm_best <- confusionMatrix(
data = pred_best,
reference = bc.test$Class,
positive = "malignant"
)
cm_best## 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
##
hasil_prediksi <- data.frame(
Aktual = bc.test$Class,
Prediksi = pred_best
)
head(hasil_prediksi, 10)## 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
kable(
hasil_semua[idx_best, c("mtry", "num.trees", "OOB_Error", "Accuracy",
"Precision", "Recall", "Specificity", "F1_Score")],
digits = 4,
row.names = FALSE,
caption = "Ukuran evaluasi model terbaik"
)| mtry | num.trees | OOB_Error | Accuracy | Precision | Recall | Specificity | F1_Score |
|---|---|---|---|---|---|---|---|
| 2 | 200 | 0.0292 | 0.9804 | 0.9589 | 0.9859 | 0.9774 | 0.9722 |
Berdasarkan Tabel, diperoleh model terbaik dengan mtry = 2 dan num.trees = 200) memiliki accuracy sebesar 0,9804, artinya 98,04% observasi data testing diklasifikasikan dengan benar. Recall sebesar 0,9859 menunjukkan bahwa hampir seluruh tumor malignant berhasil terdeteksi (70 dari 71 observasi), sedangkan specificity sebesar 0,9774 menunjukkan bahwa sebagian besar tumor benign terklasifikasi dengan benar (130 dari 133 observasi). Precision sebesar 0,9589 dan F1-score sebesar 0,9722 menunjukkan keseimbangan yang baik antara ketepatan dan kemampuan model mendeteksi kelas malignant. Nilai OOB error sebesar 0,0292 tidak jauh berbeda dari tingkat kesalahan data testing.
importance_best <- sort(rf_best$variable.importance, decreasing = TRUE)
kable(
data.frame(Variabel = names(importance_best),
Importance = as.numeric(importance_best)),
digits = 4,
caption = paste("Variable importance model terbaik (", nama_best, ")")
)| Variabel | Importance |
|---|---|
| Bare.nuclei | 0.0839 |
| Cell.size | 0.0787 |
| Cell.shape | 0.0610 |
| Cl.thickness | 0.0245 |
| Bl.cromatin | 0.0215 |
| Normal.nucleoli | 0.0204 |
| Marg.adhesion | 0.0193 |
| Epith.c.size | 0.0117 |
| Mitoses | 0.0038 |
par(mar = c(9, 4, 4, 2))
barplot(
importance_best, las = 2, col = "steelblue",
main = "Variable Importance - Random Forest Classification",
ylab = "Permutation Importance"
)
Berdasarkan plot, tiga variabel dengan permutation
importance tertinggi pada model terbaik adalah
Bare.nuclei, Cell.size, dan Cell.shape.
Ketiganya jauh di atas variabel lain (nilai tertinggi berikutnya hanya
0,0245) dan menyumbang sekitar 69% dari total importance,
sehingga paling berperan dalam membedakan tumor benign dan
malignant. Variabel Mitoses memiliki nilai terendah
(0,0038), yang menunjukkan kontribusinya paling kecil terhadap ketepatan
klasifikasi. Seluruh variabel bernilai positif sehingga setiap variabel
tetap memberikan kontribusi.
imp_semua <- sapply(model_rf, function(m) m$variable.importance[prediktor])
imp_semua <- imp_semua[order(-imp_semua[, idx_best]), ]
kable(
imp_semua,
digits = 4,
caption = "Variable importance pada seluruh kombinasi mtry dan num.trees"
)| mtry=2, ntree=200 | mtry=3, ntree=200 | mtry=5, ntree=200 | mtry=2, ntree=500 | mtry=3, ntree=500 | mtry=5, ntree=500 | mtry=2, ntree=1000 | mtry=3, ntree=1000 | mtry=5, ntree=1000 | |
|---|---|---|---|---|---|---|---|---|---|
| Bare.nuclei | 0.0839 | 0.0972 | 0.1259 | 0.0805 | 0.0991 | 0.1243 | 0.0817 | 0.1003 | 0.1214 |
| Cell.size | 0.0787 | 0.0917 | 0.0898 | 0.0773 | 0.0853 | 0.0909 | 0.0779 | 0.0855 | 0.0911 |
| Cell.shape | 0.0610 | 0.0628 | 0.0427 | 0.0630 | 0.0651 | 0.0460 | 0.0626 | 0.0593 | 0.0438 |
| Cl.thickness | 0.0245 | 0.0278 | 0.0233 | 0.0267 | 0.0260 | 0.0217 | 0.0263 | 0.0248 | 0.0227 |
| Bl.cromatin | 0.0215 | 0.0180 | 0.0142 | 0.0219 | 0.0188 | 0.0153 | 0.0205 | 0.0192 | 0.0162 |
| Normal.nucleoli | 0.0204 | 0.0160 | 0.0217 | 0.0218 | 0.0148 | 0.0203 | 0.0199 | 0.0165 | 0.0208 |
| Marg.adhesion | 0.0193 | 0.0191 | 0.0209 | 0.0191 | 0.0193 | 0.0195 | 0.0189 | 0.0195 | 0.0189 |
| Epith.c.size | 0.0117 | 0.0099 | 0.0086 | 0.0132 | 0.0109 | 0.0093 | 0.0140 | 0.0119 | 0.0097 |
| Mitoses | 0.0038 | 0.0037 | 0.0026 | 0.0031 | 0.0032 | 0.0030 | 0.0033 | 0.0032 | 0.0032 |
Berdasarkan Tabel, urutan tiga variabel terpenting konsisten pada seluruh kombinasi, yaitu Bare.nuclei, Cell.size, dan Cell.shape, sedangkan Mitoses selalu memiliki nilai terendah. Nilai importance berubah mengikuti mtry, yaitu Bare.nuclei meningkat seiring bertambahnya mtry, sedangkan Cell.shape dan Bl.cromatin cenderung menurun. Jumlah pohon hampir tidak memengaruhi nilai importance. Dengan demikian, variabel terpenting tidak bergantung pada pengaturan parameter tertentu.
Random Forest dan Double Random Forest merupakan metode ensemble learning berbasis decision tree yang menggabungkan sejumlah pohon keputusan untuk menghasilkan prediksi. Kedua metode memiliki pendekatan pembentukan pohon yang berbeda sehingga dapat dibandingkan berdasarkan kemampuan prediksinya.
Implementasi Random Forest dan Double Random Forest dapat dilakukan pada permasalahan klasifikasi maupun regresi dengan menentukan parameter model yang sesuai. Hasil prediksi klasifikasi diperoleh melalui majority voting, sedangkan regresi menggunakan rata-rata prediksi seluruh pohon.
Evaluasi performa model dilakukan menggunakan confusion matrix, Accuracy, confusion matrix, Accuracy, Precision, Recall, Specificity, F1-score. OOB error digunakan sebagai evaluasi internal model, sedangkan perbandingan kedua metode bertujuan mengetahui model dengan performa prediksi terbaik.
Berdasarkan hasil analisis, Bare.nuclei, Cell.size, dan Cell.shape adalah tiga variabel sangat berkontribusi, sedangkan Mitoses memiliki kontribusi terendah. Perbandingan sembilan kombinasi parameter dilakukan berdasarkan confusion matrix, Accuracy, Precision, Recall, Specificity, F1-score, variable importance, dan OOB error untuk menentukan model Random Forest dengan performa terbaik.
Pada praktikum selanjutnya, disarankan untuk mencoba lebih banyak kombinasi parameter pada metode Random Forest dan Double Random Forest agar diperoleh model dengan performa prediksi yang optimal. Selain itu, penggunaan dataset dengan karakteristik yang berbeda dapat dilakukan untuk mengetahui kemampuan kedua metode dalam menangani berbagai permasalahan klasifikasi dan regresi. Evaluasi model juga perlu memperhatikan nilai OOB error dan ukuran performa pada data pengujian agar perbandingan hasil lebih menyeluruh.
Fransiska, H. (2026). Modul praktikum machine learning. Universitas Bengkulu.
Hidayatulloh, N. G. T., Notodiputro, K. A., & Angraini, Y. (2022). Perbandingan kinerja Random Forest dan Double Random Forest untuk klasifikasi status kemiskinan di level kabupaten/kota. IPB University.
Hamami, F., & Dahlan, I. A. (2022). Klasifikasi cuaca Provinsi DKI Jakarta menggunakan algoritma Random Forest dengan teknik oversampling. Jurnal Teknoinfo, 16(1).
Sukarna, S., Notodiputro, K. A., & Sartono, B. (2023). Comparison of Logistic Model Tree and Random Forest on classification for poverty in Indonesia. Media Statistika, 16(2), 112–123.