BAB I PENDAHULUAN

1.1 Latar Belakang

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).

1.2 Rumusan Masalah

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?

1.3 Tujuan

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.

BAB II TINJAUAN PUSTAKA

2.1 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.

2.2 Out-of-Bag (OOB) Error

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).

2.3 Parameter Penting Random Forest

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).

2.4 Evaluasi Model Klasifikasi

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.

2.5 Variable Importance

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).

BAB III METODE PENELITIAN

3.1 Sumber Data

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..

3.2 Variabel Penelitian

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

3.3 Langkah-langkah Analisis

Berikut langkah-langkah analisis data pada penelitian ini:

  1. Input data BreastCancer dari package mlbench.

  2. Eksplorasi data.

  3. Persiapan data.

  4. Pembagian data training dan testing.

  5. Pembentukan model Random Forest.

  6. Evaluasi model menggunakan nilai OOB error.

  7. Prediksi data testing dan evaluasi model.

  8. Pemilihan model terbaik .

  9. Analisis variable importance pada model terbaik.

  10. Interpretasi hasil dan penarikan kesimpulan.

3.4 Diagram Alir Penelitian

Berikut diagram alir analisis data: Alur analisis disajikan pada diagram alir berikut.

Gambar 1. Diagram alir analisis data

BAB IV HASIL DAN PEMBAHASAN

4.1 Library dan Import Data

library(ranger)
library(mlbench)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(knitr)
data(BreastCancer, package = "mlbench")
bc <- BreastCancer

dim(bc)
## [1] 699  11
str(bc)
## '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 ...
summary(bc)
##          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.

4.2 Persiapan Data

# 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
levels(bc$Class)
## [1] "benign"    "malignant"
table(bc$Class)
## 
##    benign malignant 
##       444       239
prop.table(table(bc$Class))
## 
##    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.

4.3 Pembagian Data Training dan Testing

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
dim(bc.test)
## [1] 204  10
table(bc.train$Class)
## 
##    benign malignant 
##       311       168
table(bc.test$Class)
## 
##    benign malignant 
##       133        71

4.4 Pembentukan Random Forest dengan Variasi mtry dan num.trees

Pada 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%.

4.5 Evaluasi Out-of-Bag (OOB) Error

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"
)
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:

rf_contoh <- model_rf[["mtry=3, ntree=500"]]

rf_contoh$prediction.error
## [1] 0.02922756
rf_contoh$confusion.matrix
##            predicted
## true        benign malignant
##   benign       303         8
##   malignant      6       162
head(rf_contoh$predictions)
## [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.

4.6 Prediksi dan Evaluasi Data Testing

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)"
)
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"
)
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.

4.7 Pemilihan Model Terbaik

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"
)
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.

4.8 Variable Importance

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, ")")
)
Variable importance model terbaik ( mtry=2, ntree=200 )
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"
)
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.

BAB V KESIMPULAN

5.1 Kesimpulan

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.

5.2 Saran

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.

DAFTAR PUSTAKA

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.