Machine learning merupakan pendekatan yang memungkinkan komputer mempelajari pola dari data untuk membangun model prediktif (Farhan, Puspasari, & Gasim, 2025). Model tunggal sering kali sensitif terhadap perubahan data sehingga hasil prediksinya kurang stabil. Kondisi tersebut mendorong pengembangan ensemble learning, yaitu penggabungan banyak model untuk menghasilkan prediksi yang lebih akurat dan konsisten. Decision tree menjadi model dasar yang banyak digunakan, tetapi pohon tunggal cenderung memiliki varians yang tinggi (Sharma & Iqbal, 2023).
Random Forest menggabungkan banyak pohon keputusan yang dibangun dari sampel bootstrap dan pemilihan subset prediktor secara acak pada setiap pemisahan simpul. Pengacakan tersebut menurunkan korelasi antarpohon sehingga prediksi gabungan menjadi lebih stabil (Fransiska, 2026). Double Random Forest juga berbasis pohon keputusan, tetapi menerapkan bootstrap pada setiap simpul selama pembentukan pohon, bukan hanya pada simpul akar. Kedua metode dapat digunakan pada klasifikasi, yang memprediksi kelas kategorik, maupun regresi, yang memprediksi nilai numerik (Ratnasari, Susetyo, & Notodiputro, 2023).
Evaluasi performa diperlukan untuk menilai kualitas prediksi karena model yang kompleks berisiko baik pada data pelatihan, tetapi kurang baik pada data baru. Ukuran evaluasi harus sesuai dengan jenis permasalahan, yaitu ukuran ketepatan klasifikasi untuk data kategorik dan ukuran galat untuk data numerik (Rashidi dkk., 2023). Out-of-Bag (OOB) error memperkirakan kesalahan prediksi dengan memanfaatkan observasi yang tidak terpilih dalam sampel bootstrap (Fransiska, 2026). Evaluasi yang objektif memungkinkan kemampuan prediksi kedua metode dipahami secara tepat dan dibandingkan secara adil.
Berdasarkan latar belakang di atas, adapun rumusan masalah yang dapat disimpulkan sebagai berikut:
Adapun tujuan penelitian ini yaitu:
Adapun manfaat penelitian ini yaitu sebagai berikut:
Adapun batasan masalah pada penelitian ini yaitu lakukan Random
Forest Classification pada data BreastCancer.
Bandingkan mtry = 2, 3, dan 5 dengan num.trees
= 200, 500, dan 1000. Bandingkan performa data testing
berdasarkan confusion matrix, accuracy,
precision, recall, specificity,
F1-score, dan variable importance. Tampilkan pula OOB
error sebagai evaluasi internal model.
Machine learning merupakan cabang kecerdasan buatan yang berfokus pada pengembangan algoritma dan model yang memungkinkan komputer untuk belajar dari data, mengenali pola, serta membuat prediksi atau keputusan tanpa pemrograman langsung (Farhan, Puspasari, & Gasim, 2025). Secara umum, algoritma machine learning dikategorikan ke dalam supervised learning, unsupervised learning, dan reinforcement learning, dengan supervised learning sebagai pendekatan utama untuk tugas klasifikasi dan regresi karena menggunakan data berlabel. Dalam konteks supervised learning, tujuan utamanya adalah memodelkan fungsi yang mendasari hubungan statistik antara variabel fitur dan variabel target, seperti yang diformulasikan pada Persamaan (2.1) (Rashidi dkk., 2023).
\[ Y = f(X) + \varepsilon \tag{2.1} \]
Pada Persamaan (2.1), \(Y\) menyatakan variabel target, \(X = (x_1, \ldots, x_p)\) merupakan vektor fitur berdimensi \(p\), \(f\) adalah fungsi matematis yang memetakan \(X\) ke \(Y\), dan \(\varepsilon\) adalah galat acak yang independen terhadap \(X\). Fungsi \(f\) yang sebenarnya umumnya tidak diketahui dan hanya dapat diestimasi atau didekati dari data sampel. Proses estimasi \(f\) dilakukan dengan meminimalkan suatu fungsi kerugian, seperti quadratic loss untuk regresi dan cross-entropy loss untuk klasifikasi (Rashidi dkk., 2023).
Pendekatan supervised machine learning menekankan pada kemampuan model untuk memprediksi observasi baru yang belum pernah dilihat, sehingga evaluasi performa harus dilakukan pada data di luar data pelatihan. Model prediktif dibedakan berdasarkan tingkat fleksibilitas dan interpretabilitasnya, di mana model yang lebih fleksibel mampu menangkap hubungan nonlinier dan interaksi antarfitur, tetapi umumnya lebih sulit diinterpretasikan (Pargent, Schoedel, & Stachl, 2023). Keseimbangan antara bias dan varians menjadi pertimbangan utama dalam memilih tingkat fleksibilitas model agar diperoleh performa prediksi yang optimal (Rashidi dkk., 2023).
Ensemble learning merupakan pendekatan dalam machine learning yang menggabungkan prediksi dari beberapa model dasar (base learner) untuk menghasilkan satu prediksi akhir yang lebih baik dibandingkan model tunggal (Chang & Chang, 2026). Prinsip utamanya adalah memanfaatkan keragaman (diversity) di antara model dasar, karena model yang berbeda cenderung membuat kesalahan pada bagian data yang berbeda pula, sehingga agregasi prediksinya dapat menekan galat secara keseluruhan (Sitio, Darmawati, & Samudra, 2026). Pendekatan ini banyak digunakan karena mampu meningkatkan akurasi dan stabilitas prediksi, terutama pada data yang kompleks dan nonlinier (Farhan, Puspasari, & Gasim, 2025).
Berdasarkan cara pembentukan model dasarnya, ensemble learning secara umum dibagi menjadi dua strategi utama, yaitu bagging dan boosting (Sitio, Darmawati, & Samudra, 2026). Bagging membangun model dasar secara paralel dan independen pada sejumlah sampel bootstrap, kemudian menggabungkan hasilnya melalui majority voting atau perata-rataan (Chang & Chang, 2026). Sebaliknya, boosting membangun model secara sekuensial, di mana setiap model baru dilatih untuk memperbaiki galat dari model sebelumnya melalui pembelajaran berbasis gradien (Sitio, Darmawati, & Samudra, 2026). Perbedaan strategi ini berpengaruh terhadap karakteristik bias dan varians dari model ensemble yang dihasilkan.
Decision tree merupakan algoritma supervised machine learning yang cocok untuk masalah klasifikasi dan regresi karena mampu merepresentasikan keputusan secara hierarkis melalui pemisahan kondisi pada setiap simpul. Struktur pohon terdiri atas simpul keputusan (decision node) tempat data dipilah dan simpul daun (leaf) tempat suatu hasil ditetapkan. Terdapat dua kategori decision tree, yaitu classification decision tree dengan variabel keputusan bersifat diskret dan regression decision tree dengan variabel keputusan bersifat kontinu (Sharma & Iqbal, 2023).
Pembentukan pohon dilakukan melalui pemisahan rekursif (recursive binary splitting) yang memilih fitur dan titik potong terbaik pada setiap simpul berdasarkan kriteria kemurnian tertentu. Algoritma Classification and Regression Tree (CART) menggunakan Gini index untuk membentuk pemisahan biner, di mana nilai Gini suatu sub-simpul dihitung dari jumlah kuadrat probabilitas keberhasilan dan kegagalan. Nilai Gini index yang sempurna adalah 0, sedangkan nilai terburuk untuk dua kelas adalah 0,5 (Sharma & Iqbal, 2023).
Proses pertumbuhan pohon dihentikan berdasarkan kriteria penghentian, seperti kedalaman maksimum pohon dan jumlah minimum rekaman pada suatu simpul (Sharma & Iqbal, 2023). Pemilihan splitting criteria pada decision tree dapat memengaruhi nilai akurasi model yang dihasilkan, sehingga pemilihan kriteria perlu diperhatikan dalam pemodelan (Nugroho, 2022). Decision tree memiliki kelebihan berupa kemudahan interpretasi melalui visualisasi, tetapi juga memiliki keterbatasan karena strukturnya dapat sangat tidak stabil terhadap perubahan data (Pargent, Schoedel, & Stachl, 2023).
Random Forest merupakan algoritma ensemble learning berbasis pohon yang membangun banyak decision tree dan menggabungkan prediksinya untuk meningkatkan akurasi serta mengurangi overfitting. Metode ini merupakan pengembangan dari bagging yang menggunakan kumpulan pohon keputusan sebagai model dasar dan dirancang untuk mengurangi variansi model serta meningkatkan kemampuan generalisasi. Perbedaan utama Random Forest dengan bagging terletak pada penambahan pengacakan pemilihan prediktor di setiap node, sehingga pohon-pohon dalam forest tidak hanya dibangun dari sampel yang berbeda tetapi juga tidak selalu mempertimbangkan prediktor yang sama ketika mencari pemisahan terbaik (Farhan, Puspasari, & Gasim, 2025).
Tujuan pengacakan prediktor adalah mengurangi korelasi antarpohon, karena apabila semua pohon terlalu mirip maka manfaat agregasi menjadi terbatas. Dengan membuat pohon yang kuat tetapi tidak terlalu berkorelasi, Random Forest dapat mengurangi varians tanpa harus memangkas setiap pohon secara agresif. Konsep dasar Random Forest meliputi bootstrap sampling, pembangunan banyak pohon yang tumbuh sangat dalam (fully grown) agar memiliki variansi tinggi namun bias rendah, pemilihan fitur acak pada setiap node, serta agregasi prediksi melalui majority vote untuk klasifikasi dan rata-rata prediksi untuk regresi (Fransiska, 2026).
Secara formal, Random Forest terdiri atas rata-rata dari \(M\) pohon prediksi yang dapat dituliskan seperti pada Persamaan (2.2) (Scornet & Hooker, 2026).
\[ \hat{f}(x) = \frac{1}{M}\sum_{m=1}^{M} T\left(x;\omega_{m}, D_{n}\right) \tag{2.2} \]
Pada Persamaan (2.2), \(T\) menyatakan prediksi pada titik \(x\) dari suatu pohon keputusan yang dilatih pada data \(D_n\) dengan parameter pengacakan \(\omega_m\) yang saling independen (Scornet & Hooker, 2026). Untuk kasus klasifikasi, prediksi akhir diperoleh melalui majority voting dari seluruh pohon, sedangkan untuk kasus regresi prediksi akhir diperoleh dengan merata-ratakan prediksi semua pohon. Random Forest termasuk metode parallel ensemble karena setiap pohon dapat dibentuk secara relatif independen, berbeda dari boosting yang bersifat sekuensial (Fransiska, 2026).
Random Forest memiliki beberapa keunggulan, antara lain kemampuannya menangani data berdimensi tinggi, ketahanan terhadap data yang mengandung derau, serta kemampuannya mengatasi overfitting melalui teknik ensemble learning. Metode ini juga menyediakan mekanisme bawaan untuk mengevaluasi kepentingan fitur dengan menganalisis kontribusi setiap variabel terhadap penurunan galat prediksi pada seluruh ensemble (Farhan, Puspasari, & Gasim, 2025). Namun, Random Forest kehilangan interpretabilitas yang dimiliki pohon tunggal sehingga memerlukan alat tambahan dari bidang interpretable machine learning untuk memahami prediksinya (Pargent, Schoedel, & Stachl, 2023).
Double Random Forest (DRF) merupakan metode ensemble yang dikembangkan pada tahun 2020 untuk mengatasi keterbatasan Random Forest ketika data mengalami underfitting akibat pohon yang dihasilkan belum cukup besar. Pada Random Forest standar, setiap pohon dibentuk menggunakan satu sampel bootstrap pada awal pembentukan pohon, sehingga hanya sekitar 63,2% observasi unik yang tersedia untuk membentuk pohon. DRF mengatasi hal ini dengan membangun setiap pohon menggunakan seluruh data training, sedangkan bootstrap digunakan sementara pada setiap node untuk mencari aturan pemisahan (Ratnasari, Susetyo, & Notodiputro, 2023).
Secara sederhana, proses DRF dimulai dengan setiap pohon menggunakan seluruh data training, bukan satu sampel bootstrap untuk keseluruhan pohon. Pada node yang sedang diproses, diambil sampel bootstrap dari observasi yang mencapai node tersebut, kemudian dipilih mtry prediktor secara acak dan dicari pemisahan terbaik menggunakan sampel bootstrap pada node. Setelah pemisahan terbaik ditemukan, sampel bootstrap tidak diteruskan, melainkan pemisahan tersebut diterapkan kembali pada data asli yang mencapai node untuk kemudian observasi asli dikirim ke child nodes. Proses ini diulangi pada node berikutnya sampai aturan penghentian tercapai, lalu diulangi untuk seluruh pohon dan digabungkan prediksinya (Fransiska, 2026).
Mekanisme resampling pada DRF juga dapat dinyatakan secara formal, yaitu apabila jumlah data pada suatu simpul melampaui ambang 10% dari total data training, DRF melakukan resampling sebelum memilih fitur pemisah, sebagaimana dirumuskan pada Persamaan (2.3) (Ananda, Ula, & Fadlisyah, 2026).
\[ \text{DRF-node } t:\ \text{jika } \lvert D_{t} \rvert > 0{,}1n \rightarrow \text{resample } D_{t}^{*} \tag{2.3} \]
Pada Persamaan (2.3), \(|D_t|\) menyatakan jumlah data pada simpul \(t\), \(n\) adalah total data pelatihan, dan \(D_t^{*}\) merupakan sampel hasil resampling (Ananda, Ula, & Fadlisyah, 2026). Karena setiap pohon menggunakan seluruh data training untuk tumbuh, DRF cenderung dapat menghasilkan pohon yang lebih besar, dan pada saat yang sama penggunaan bootstrap pada setiap node serta random feature subset tetap menambahkan keragaman pada aturan pemisahan. Konsekuensinya, DRF umumnya membutuhkan waktu komputasi lebih besar dibandingkan Random Forest karena proses bootstrap dilakukan berulang pada banyak node (Fransiska, 2026).
DRF juga dapat meningkatkan interpretabilitas model dibandingkan Random Forest, terutama pada kasus data yang mengalami underfitting. Hasil ekstraksi aturan menunjukkan bahwa aturan yang diekstraksi dari DRF muncul lebih sering dibandingkan aturan dari Random Forest, sehingga aturan tersebut lebih andal dalam menjelaskan hubungan antara prediktor dan variabel respons (Khairunnisa, Notodiputro, & Sartono, 2024). Dengan demikian, DRF tidak hanya berpotensi meningkatkan performa prediksi, tetapi juga kualitas interpretasi model pada kondisi data tertentu.
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 yang masuk ke satu sampel bootstrap mendekati \(1 - e^{-1} \approx 0{,}632\), yang berarti sekitar 36,8% observasi tidak digunakan untuk membentuk pohon tertentu dan disebut sebagai observasi Out-of-Bag (OOB). Untuk setiap observasi, prediksi OOB diperoleh hanya dari pohon-pohon yang tidak menggunakan observasi tersebut ketika dibentuk, dan prediksi ini dapat digunakan untuk menghitung OOB prediction error sebagai ukuran evaluasi internal Random Forest (Fransiska, 2026).
Out-of-Bag Error (OOBE) merupakan ukuran evaluasi internal Random Forest yang dihitung dari selisih antara nilai aktual dan nilai prediksi pada sampel OOB. Untuk kasus regresi, OOBE dihitung sebagai rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi pada seluruh sampel OOB, seperti pada Persamaan (2.4) (Farhan, Puspasari, & Gasim, 2025).
\[ OOBE = \frac{1}{n}\sum_{i=1}^{n}\left(y_{i} - \hat{y}_{i}^{OOB}\right)^{2} \tag{2.4} \]
Pada Persamaan (2.4), \(y_i\) adalah nilai aktual observasi ke-\(i\), \(\hat{y}_i^{OOB}\) adalah prediksi OOB observasi ke-\(i\), dan \(n\) adalah jumlah observasi. Untuk kasus klasifikasi, OOBE dinyatakan sebagai proporsi sampel OOB yang salah diklasifikasikan, sebagaimana pada Persamaan (2.5) (Farhan, Puspasari, & Gasim, 2025).
\[ OOBE = \frac{1}{n}\sum_{i=1}^{n} I\left(y_{i} \neq \hat{y}_{i}^{OOB}\right) \tag{2.5} \]
Pada Persamaan (2.5), \(I(\cdot)\)
bernilai 1 ketika prediksi salah dan 0 ketika prediksi benar (Farhan,
Puspasari, & Gasim, 2025). Pada implementasi perangkat lunak seperti
ranger, OOB error dihitung secara otomatis secara
default, di mana untuk klasifikasi
prediction.error menyatakan proporsi salah klasifikasi OOB
sedangkan untuk regresi menyatakan OOB Mean Squared Error (MSE)
(Fransiska, 2026). Pemanfaatan OOB memungkinkan evaluasi performa model
tanpa memerlukan pemisahan dataset menjadi data
training dan data testing terpisah, sehingga OOBE
berfungsi sebagai mekanisme validasi internal yang praktis (Scornet
& Hooker, 2026). Dengan demikian, OOBE memberikan estimasi galat
generalisasi yang tidak bias sekaligus mengurangi kebutuhan akan
himpunan validasi tambahan (Farhan, Puspasari, & Gasim, 2025).
Evaluasi performa model merupakan tahap penting untuk mengukur sejauh mana model mampu mengklasifikasikan atau memprediksi data dengan benar. Pada kasus klasifikasi, evaluasi umumnya bertumpu pada confusion matrix yang menampilkan jumlah prediksi benar dan salah pada data uji, yang terdiri atas True Positive (TP), False Positive (FP), False Negative (FN), dan True Negative (TN). Keempat komponen tersebut menjadi dasar perhitungan berbagai metrik evaluasi, seperti accuracy, precision, recall, dan F1-score (Farhan, Puspasari, & Gasim, 2025).
Accuracy mengukur proporsi prediksi yang benar secara keseluruhan, sedangkan precision mengukur proporsi prediksi positif yang benar-benar positif. Recall atau sensitivitas mengukur kemampuan model dalam mendeteksi kasus positif yang sebenarnya, dan specificity atau true negative rate mengukur proporsi kasus negatif yang benar-benar terdeteksi sebagai negatif. F1-score merupakan rata-rata harmonik antara precision dan recall yang menyeimbangkan keduanya. Kelima metrik tersebut dirumuskan secara berurutan pada Persamaan (2.6) hingga (2.10) (Rashidi dkk., 2023).
\[ Accuracy = \frac{TP + TN}{TP + TN + FP + FN} \tag{2.6} \]
\[ Precision = \frac{TP}{TP + FP} \tag{2.7} \]
\[ Recall = \frac{TP}{TP + FN} \tag{2.8} \]
\[ Specificity = \frac{TN}{TN + FP} \tag{2.9} \]
\[ F1\text{-}Score = \frac{2 \times Precision \times Recall}{Precision + Recall} \tag{2.10} \]
Pada Persamaan (2.6) hingga (2.10), TP, TN, FP, dan FN masing-masing menyatakan jumlah true positive, true negative, false positive, dan false negative (Farhan, Puspasari, & Gasim, 2025). Selain metrik berbasis confusion matrix, Area Under the Curve (AUC) dari kurva Receiver Operating Characteristic (ROC) digunakan untuk mengevaluasi kemampuan model dalam membedakan kelas secara probabilistik, dengan nilai mendekati 1 menunjukkan kinerja yang semakin baik (Rashidi dkk., 2023). Metrik accuracy memiliki keterbatasan pada dataset yang tidak seimbang karena sangat bergantung pada performa kelas mayoritas, sehingga metrik lain seperti sensitivitas, specificity, dan AUC lebih informatif pada kondisi tersebut (Ananda, Ula, & Fadlisyah, 2026).
Pada kasus regresi, evaluasi performa model menggunakan metrik yang mengukur deviasi prediksi terhadap nilai aktual, seperti Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi \(R^2\). MSE dihitung sebagai rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi, sedangkan RMSE merupakan akar kuadrat dari MSE sehingga memiliki satuan yang sama dengan variabel target. MAE mengukur rata-rata selisih absolut antara nilai prediksi dan nilai aktual, sementara \(R^2\) mengukur proporsi varians variabel target yang dapat dijelaskan oleh fitur dalam model. Keempat metrik tersebut dirumuskan secara berurutan pada Persamaan (2.11) hingga (2.14) (Rashidi dkk., 2023).
\[ MSE = \frac{1}{n}\sum_{i=1}^{n}\left(y_{i} - \hat{y}_{i}\right)^{2} \tag{2.11} \]
\[ RMSE = \sqrt{MSE} \tag{2.12} \]
\[ MAE = \frac{1}{n}\sum_{i=1}^{n}\left|y_{i} - \hat{y}_{i}\right| \tag{2.13} \]
\[ R^{2} = 1 - \frac{\sum_{i=1}^{n}\left(y_{i} - \hat{y}_{i}\right)^{2}}{\sum_{i=1}^{n}\left(y_{i} - \bar{y}\right)^{2}} \tag{2.14} \]
Pada Persamaan (2.11) hingga (2.14), \(y_i\) adalah nilai aktual observasi ke-\(i\), \(\hat{y}_i\) adalah nilai prediksi observasi ke-\(i\), \(\bar{y}\) adalah rata-rata nilai aktual, dan \(n\) adalah jumlah observasi. Nilai \(R^2\) berkisar antara 0 dan 1, dengan nilai 0 menunjukkan bahwa model tidak menjelaskan varians apa pun dan nilai 1 menunjukkan bahwa model menjelaskan seluruh varians (Rashidi dkk., 2023). Selain metrik tersebut, validasi silang k-fold dapat digunakan untuk memperoleh estimasi performa model pada data yang tidak digunakan dalam pelatihan, sehingga risiko overfitting dapat diminimalkan (Pargent, Schoedel, & Stachl, 2023).
Jenis data yang digunakan dalam penelitian ini adalah data kategorik, yaitu data yang menunjukkan pengelompokan objek berdasarkan kategori tertentu. Data yang digunakan berasal dari hasil pemeriksaan klinis sel kanker payudara yang disajikan dalam bentuk kategori.
Sumber data yang digunakan dalam penelitian ini adalah data sekunder.
Data sekunder merupakan data yang telah dikumpulkan oleh pihak lain dan
dapat dimanfaatkan kembali untuk keperluan penelitian. Dataset
BreastCancer diperoleh dari package
mlbench pada perangkat lunak R. Dataset tersebut
terdiri atas 699 observasi.
Variabel merupakan karakteristik atau atribut yang dapat diukur
maupun diamati dalam suatu penelitian. Penelitian ini menggunakan
sepuluh variabel, yaitu Cl.thickness,
Cell.size, Cell.shape,
Marg.adhesion, Epith.c.size,
Bare.nuclei, Bl.cromatin,
Normal.nucleoli, Mitoses, dan
Class. Variabel Class berperan sebagai
variabel respons yang bertipe kategorik dengan dua kelas, yaitu
benign (jinak) dan malignant (ganas). Sembilan
variabel lainnya berperan sebagai variabel prediktor yang bertipe
kategorik dengan skala 1 sampai 10.
Berikut merupakan algoritma penelitian pada batasan masalah:
Pada batasan masalah diminta untuk melakukan Random Forest
Classification pada data BreastCancer dengan
membandingkan mtry sebesar 2, 3, dan 5 pada
num.trees sebesar 200, 500, dan 1000. Performa data
testing dibandingkan berdasarkan confusion matrix,
accuracy, precision, recall,
specificity, F1-score, dan variable
importance, sedangkan OOB error ditampilkan sebagai
evaluasi internal model. Bab ini memuat sintaks, output, dan
pembahasan pada setiap tahapan analisis.
Paket ranger digunakan untuk membentuk model Random
Forest beserta OOB error dan variable importance.
Paket mlbench menyediakan data BreastCancer
yang digunakan sebagai bahan analisis. Paket caret
digunakan untuk pembagian data secara berstrata dan perhitungan
confusion matrix.
## '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 terdiri atas 699 observasi dan 11
variabel, yaitu satu variabel pengenal (Id), sembilan
variabel prediktor, dan satu variabel respon (Class).
Statistik deskriptif merupakan ringkasan yang menggambarkan
karakteristik data tanpa melakukan pengujian atau penarikan kesimpulan.
Pada variabel kategorik, ringkasan berupa frekuensi pada setiap
kategori, sedangkan pada variabel bertipe karakter berupa banyaknya
observasi, jumlah nilai unik, dan panjang karakter. Struktur setiap
variabel disajikan pada Tabel 4.1.
Tabel 4.1 Struktur variabel pada data
BreastCancer
| No | Variabel | Peran | Tipe Data | Jumlah Kategori |
|---|---|---|---|---|
| 1 | Id |
Pengenal | Character | 645 nilai unik |
| 2 | Cl.thickness |
Prediktor | Ordered factor | 10 |
| 3 | Cell.size |
Prediktor | Ordered factor | 10 |
| 4 | Cell.shape |
Prediktor | Ordered factor | 10 |
| 5 | Marg.adhesion |
Prediktor | Ordered factor | 10 |
| 6 | Epith.c.size |
Prediktor | Ordered factor | 10 |
| 7 | Bare.nuclei |
Prediktor | Factor | 10 |
| 8 | Bl.cromatin |
Prediktor | Factor | 10 |
| 9 | Normal.nucleoli |
Prediktor | Factor | 10 |
| 10 | Mitoses |
Prediktor | Factor | 9 |
| 11 | Class |
Respon | Factor | 2 |
Seluruh prediktor berskala kategorik dengan jumlah kategori antara 9
dan 10 tingkat. Variabel respon Class terdiri atas 458
observasi benign dan 241 observasi malignant, sehingga
kelas benign lebih dominan. Variabel Bare.nuclei
memiliki 16 data hilang, sedangkan variabel lainnya lengkap. Variabel
Id memiliki 645 nilai unik dari 699 observasi, yang
menunjukkan adanya nomor pengenal ganda.
# Menghapus Id karena hanya merupakan identifier
bc$Id <- NULL
# Menghapus observasi yang mengandung missing value
bc <- na.omit(bc)
# Memastikan respon berupa factor
bc$Class <- droplevels(as.factor(bc$Class))
# Melihat kategori respon
levels(bc$Class)## [1] "benign" "malignant"
##
## benign malignant
## 444 239
##
## benign malignant
## 0.6500732 0.3499268
Persiapan data diperlukan agar data yang dimasukkan ke model bersih,
sesuai tipe, dan tidak mengandung informasi yang tidak relevan.
Kebutuhan tersebut meliputi penghapusan variabel pengenal, penanganan
data hilang, dan pemastian variabel respon bertipe factor.
Variabel Id dihapus karena hanya berfungsi sebagai penanda
observasi dan tidak membawa informasi untuk membedakan kelas.
Data hilang hanya terdapat pada variabel Bare.nuclei
sebanyak 16 observasi, sehingga penanganan dilakukan dengan menghapus
observasi tersebut menggunakan na.omit(). Penghapusan ini
menyisakan 683 observasi dari 699 observasi awal, yaitu 14 observasi
benign dan 2 observasi malignant yang dihapus.
Variabel Class dipastikan bertipe factor dengan
dua tingkat melalui as.factor() dan
droplevels(). Distribusi kelas setelah persiapan data
disajikan pada Tabel 4.2.
Tabel 4.2 Distribusi kelas variabel respon
| Kelas | Frekuensi | Proporsi (%) |
|---|---|---|
| Benign | 444 | 65,01 |
| Malignant | 239 | 34,99 |
| Total | 683 | 100,00 |
Kelas benign mencakup 65,01% data dan kelas malignant mencakup 34,99% data. Perbandingan ini menunjukkan ketidakseimbangan kelas yang tergolong ringan. Proporsi tersebut menjadi acuan agar pembagian data berikutnya mempertahankan komposisi kelas yang sama.
set.seed(46)
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
Data dibagi menjadi data training sebesar 70% dan data
testing sebesar 30% menggunakan fungsi
createDataPartition() dengan set.seed(46) agar
hasil dapat direproduksi. Fungsi tersebut melakukan pembagian berstrata
berdasarkan variabel Class, sehingga proporsi kelas pada
kedua himpunan data tetap terjaga. Hasil pembagian disajikan pada Tabel
4.3.
Tabel 4.3 Hasil pembagian data training dan testing
| Himpunan Data | Benign | Malignant | Total | Proporsi Malignant (%) |
|---|---|---|---|---|
| Training | 311 | 168 | 479 | 35,07 |
| Testing | 133 | 71 | 204 | 34,80 |
Data training berjumlah 479 observasi dan data testing berjumlah 204 observasi, masing-masing dengan 10 variabel. Proporsi kelas malignant pada kedua himpunan data, yaitu 35,07% dan 34,80%, mendekati proporsi pada data keseluruhan sebesar 34,99%. Kesesuaian tersebut menunjukkan bahwa data testing mewakili komposisi kelas pada data asal.
# Skenario: mtry = 2, 3, 5 dan num.trees = 200, 500, 1000
grid <- expand.grid(
mtry = c(2L, 3L, 5L),
num.trees = c(200L, 500L, 1000L)
)
grid$Model <- paste0("mtry", grid$mtry, "_tree", grid$num.trees)
grid## mtry num.trees Model
## 1 2 200 mtry2_tree200
## 2 3 200 mtry3_tree200
## 3 5 200 mtry5_tree200
## 4 2 500 mtry2_tree500
## 5 3 500 mtry3_tree500
## 6 5 500 mtry5_tree500
## 7 2 1000 mtry2_tree1000
## 8 3 1000 mtry3_tree1000
## 9 5 1000 mtry5_tree1000
rf.list <- list()
for (i in seq_len(nrow(grid))) {
set.seed(46)
rf.list[[grid$Model[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 = 46
)
}
# Keluaran seluruh model
for (i in seq_len(nrow(grid))) {
cat("\n===== mtry =", grid$mtry[i], "| num.trees =", grid$num.trees[i], "=====\n")
print(rf.list[[grid$Model[i]]])
}##
## ===== mtry = 2 | num.trees = 200 =====
## 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 = 46)
##
## Type: Classification
## Number of trees: 200
## Sample size: 479
## Number of independent variables: 9
## Mtry: 2
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.34 %
##
## ===== mtry = 3 | num.trees = 200 =====
## 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 = 46)
##
## Type: Classification
## Number of trees: 200
## Sample size: 479
## Number of independent variables: 9
## Mtry: 3
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.34 %
##
## ===== mtry = 5 | num.trees = 200 =====
## 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 = 46)
##
## Type: Classification
## Number of trees: 200
## Sample size: 479
## Number of independent variables: 9
## Mtry: 5
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.34 %
##
## ===== mtry = 2 | num.trees = 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 = 46)
##
## Type: Classification
## Number of trees: 500
## Sample size: 479
## Number of independent variables: 9
## Mtry: 2
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.55 %
##
## ===== mtry = 3 | num.trees = 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 = 46)
##
## 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: 3.13 %
##
## ===== mtry = 5 | num.trees = 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 = 46)
##
## Type: Classification
## Number of trees: 500
## Sample size: 479
## Number of independent variables: 9
## Mtry: 5
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.34 %
##
## ===== mtry = 2 | num.trees = 1000 =====
## 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 = 46)
##
## Type: Classification
## Number of trees: 1000
## Sample size: 479
## Number of independent variables: 9
## Mtry: 2
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.76 %
##
## ===== mtry = 3 | num.trees = 1000 =====
## 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 = 46)
##
## Type: Classification
## Number of trees: 1000
## Sample size: 479
## Number of independent variables: 9
## Mtry: 3
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.34 %
##
## ===== mtry = 5 | num.trees = 1000 =====
## 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 = 46)
##
## Type: Classification
## Number of trees: 1000
## Sample size: 479
## Number of independent variables: 9
## Mtry: 5
## Target node size: 1
## Variable importance mode: permutation
## Splitrule: gini
## OOB prediction error: 3.34 %
Model Random Forest dibentuk pada data training
dengan variabel Class sebagai respon dan sembilan variabel
lainnya sebagai prediktor. Sembilan skenario model diperoleh dari
kombinasi mtry sebesar 2, 3, dan 5 dengan
num.trees sebesar 200, 500, dan 1000. Parameter lainnya
dibuat tetap pada seluruh skenario, yaitu min.node.size =
1, replace = TRUE, dan sample.fraction = 1,
sehingga setiap pohon dibangun dari sampel bootstrap berukuran
sama dengan data training. Pengaturan ini membuat perbedaan
performa antarmodel hanya bersumber dari mtry dan
num.trees.
Parameter mtry menyatakan jumlah prediktor yang
dipertimbangkan secara acak pada setiap pemisahan simpul, sedangkan
num.trees menyatakan banyaknya pohon yang digabungkan.
Nilai mtry sebesar tiga setara dengan akar kuadrat dari
jumlah prediktor (\(\sqrt{9} = 3\))
yang lazim digunakan pada kasus klasifikasi. Kriteria pemisahan yang
dipakai adalah indeks Gini, dan pentingnya variabel dihitung dengan
metode permutasi. Penggunaan set.seed(46) dan
seed = 46 pada setiap model menjaga agar hasil dapat
direproduksi.
Keluaran kesembilan model menunjukkan tipe klasifikasi dengan 479
observasi, 9 variabel bebas, dan ukuran simpul akhir 1. Nilai OOB
prediction error berkisar antara 3,13% pada mtry =
3 dan num.trees = 500 sampai 3,76% pada mtry =
2 dan num.trees = 1000. Rincian OOB error
disajikan pada subbab berikutnya.
oob.rf <- data.frame(
mtry = grid$mtry,
num.trees = grid$num.trees,
OOB_Error = unlist(lapply(rf.list, function(m) m$prediction.error)),
row.names = NULL
)
oob.rf## mtry num.trees OOB_Error
## 1 2 200 0.03340292
## 2 3 200 0.03340292
## 3 5 200 0.03340292
## 4 2 500 0.03549061
## 5 3 500 0.03131524
## 6 5 500 0.03340292
## 7 2 1000 0.03757829
## 8 3 1000 0.03340292
## 9 5 1000 0.03340292
# Confusion matrix OOB setiap model
for (nama in names(rf.list)) {
cat("\n=====", nama, "=====\n")
print(rf.list[[nama]]$confusion.matrix)
}##
## ===== mtry2_tree200 =====
## predicted
## true benign malignant
## benign 301 10
## malignant 6 162
##
## ===== mtry3_tree200 =====
## predicted
## true benign malignant
## benign 302 9
## malignant 7 161
##
## ===== mtry5_tree200 =====
## predicted
## true benign malignant
## benign 303 8
## malignant 8 160
##
## ===== mtry2_tree500 =====
## predicted
## true benign malignant
## benign 300 11
## malignant 6 162
##
## ===== mtry3_tree500 =====
## predicted
## true benign malignant
## benign 302 9
## malignant 6 162
##
## ===== mtry5_tree500 =====
## predicted
## true benign malignant
## benign 302 9
## malignant 7 161
##
## ===== mtry2_tree1000 =====
## predicted
## true benign malignant
## benign 300 11
## malignant 7 161
##
## ===== mtry3_tree1000 =====
## predicted
## true benign malignant
## benign 302 9
## malignant 7 161
##
## ===== mtry5_tree1000 =====
## predicted
## true benign malignant
## benign 302 9
## malignant 7 161
## [1] "mtry3_tree500"
## predicted
## true benign malignant
## benign 302 9
## malignant 6 162
Out-of-Bag (OOB) error merupakan evaluasi internal model yang dihitung dari observasi yang tidak terpilih dalam sampel bootstrap pada setiap pohon. Prediksi untuk suatu observasi dibentuk hanya dari pohon yang tidak menggunakan observasi tersebut saat pelatihan, sehingga hasilnya tidak memerlukan data terpisah. OOB error seluruh skenario disajikan pada Tabel 4.4.
Tabel 4.4 OOB error setiap skenario model
mtry |
num.trees |
Jumlah Salah Prediksi | OOB Error | OOB Error (%) |
|---|---|---|---|---|
| 2 | 200 | 16 | 0,0334 | 3,34 |
| 3 | 200 | 16 | 0,0334 | 3,34 |
| 5 | 200 | 16 | 0,0334 | 3,34 |
| 2 | 500 | 17 | 0,0355 | 3,55 |
| 3 | 500 | 15 | 0,0313 | 3,13 |
| 5 | 500 | 16 | 0,0334 | 3,34 |
| 2 | 1000 | 18 | 0,0376 | 3,76 |
| 3 | 1000 | 16 | 0,0334 | 3,34 |
| 5 | 1000 | 16 | 0,0334 | 3,34 |
Nilai OOB error berkisar antara 0,0313 dan 0,0376, dengan
selisih sebanyak 3 observasi dari 479 observasi pada data
training. Nilai terendah dicapai pada mtry = 3 dan
num.trees = 500, sedangkan nilai tertinggi dicapai pada
mtry = 2 dan num.trees = 1000. Enam dari
sembilan model memiliki OOB error yang sama, yaitu 0,0334.
Pada mtry = 2, OOB error naik dari 0,0334 pada
200 pohon menjadi 0,0355 pada 500 pohon dan 0,0376 pada 1000 pohon,
sedangkan pada mtry = 5 nilainya tetap 0,0334 pada seluruh
jumlah pohon. Pada mtry = 3, OOB error turun
menjadi 0,0313 pada 500 pohon, lalu kembali menjadi 0,0334 pada 1000
pohon. Perubahan tersebut hanya setara dengan satu sampai tiga
observasi, sehingga penambahan jumlah pohon tidak menunjukkan penurunan
OOB error yang konsisten. Pola ini sesuai dengan kecenderungan
Random Forest yang galatnya relatif stabil setelah jumlah pohon
mencukupi.
Confusion matrix OOB menunjukkan bahwa model dengan
mtry = 2 pada 500 dan 1000 pohon menghasilkan false
positive terbanyak, yaitu 11 observasi benign yang
diprediksi malignant. Pada model dengan OOB error
terendah, kesalahan terdiri atas 9 observasi benign yang
diprediksi malignant dan 6 observasi malignant yang
diprediksi benign. Tingkat kesalahan OOB pada kelas
benign sebesar 2,89% (9 dari 311) dan pada kelas
malignant sebesar 3,57% (6 dari 168), sehingga kesalahan
relatif seimbang antarkelas.
pred.list <- list()
for (nama in names(rf.list)) {
pred.rf <- predict(
rf.list[[nama]],
data = bc.test
)$predictions
pred.list[[nama]] <- factor(
pred.rf,
levels = levels(bc.test$Class)
)
}
hasil.rf <- data.frame(
Aktual = bc.test$Class,
pred.list
)
head(hasil.rf, 10)## Aktual mtry2_tree200 mtry3_tree200 mtry5_tree200 mtry2_tree500
## 1 benign benign benign benign benign
## 2 benign benign benign benign benign
## 3 benign benign benign benign benign
## 4 benign benign benign benign benign
## 5 benign benign benign benign benign
## 6 benign benign benign benign benign
## 7 malignant malignant malignant malignant malignant
## 8 benign benign benign benign benign
## 9 benign benign benign benign benign
## 10 malignant malignant malignant malignant malignant
## mtry3_tree500 mtry5_tree500 mtry2_tree1000 mtry3_tree1000 mtry5_tree1000
## 1 benign benign benign benign benign
## 2 benign benign benign benign benign
## 3 benign benign benign benign benign
## 4 benign benign benign benign benign
## 5 benign benign benign benign benign
## 6 benign benign benign benign benign
## 7 malignant malignant malignant malignant malignant
## 8 benign benign benign benign benign
## 9 benign benign benign benign benign
## 10 malignant malignant malignant malignant malignant
Seluruh model digunakan untuk memprediksi kelas pada 204 observasi data testing. Hasil prediksi dikonversi menjadi factor dengan urutan tingkat yang sama dengan data aktual agar dapat dibandingkan secara langsung. Sepuluh observasi pertama disajikan sebagai gambaran perbandingan nilai aktual dan prediksi dari kesembilan model.
Pada sepuluh observasi pertama, kesembilan model menghasilkan
prediksi yang sama dan seluruhnya sesuai dengan nilai aktual, yaitu
delapan observasi benign dan dua observasi malignant
(observasi ke-7 dan ke-10). Kesesuaian ini menunjukkan bahwa perubahan
mtry dan num.trees tidak mengubah hasil
klasifikasi pada observasi tersebut. Penilaian secara keseluruhan
dilakukan melalui confusion matrix dan ukuran evaluasi pada
subbab berikutnya.
# Fungsi Evaluasi Klasifikasi
eval.class <- function(actual, pred) {
# Menyamakan level kelas
actual <- factor(
actual,
levels = c("benign", "malignant")
)
pred <- factor(
pred,
levels = c("benign", "malignant")
)
# Membentuk confusion matrix
tab <- table(
Aktual = actual,
Prediksi = pred
)
# Komponen confusion matrix
TN <- tab["benign", "benign"]
FP <- tab["benign", "malignant"]
FN <- tab["malignant", "benign"]
TP <- tab["malignant", "malignant"]
# Accuracy
Accuracy <- (TP + TN) / (TP + TN + FP + FN)
# Precision
Precision <- TP / (TP + FP)
# Recall / Sensitivity
Recall <- TP / (TP + FN)
# Specificity
Specificity <- TN / (TN + FP)
# F1-Score
F1_Score <- 2 * (Precision * Recall) / (Precision + Recall)
# Mengembalikan seluruh komponen dan ukuran evaluasi
c(
TN = TN,
FP = FP,
FN = FN,
TP = TP,
Accuracy = Accuracy,
Precision = Precision,
Recall = Recall,
Specificity = Specificity,
F1_Score = F1_Score
)
}
# Confusion matrix setiap model
for (nama in names(pred.list)) {
cat("\n=====", nama, "=====\n")
print(
table(
Aktual = bc.test$Class,
Prediksi = pred.list[[nama]]
)
)
}##
## ===== mtry2_tree200 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry3_tree200 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry5_tree200 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry2_tree500 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry3_tree500 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry5_tree500 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry2_tree1000 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry3_tree1000 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
##
## ===== mtry5_tree1000 =====
## Prediksi
## Aktual benign malignant
## benign 131 2
## malignant 1 70
# Ukuran evaluasi setiap model
hasil.eval <- t(
sapply(
pred.list,
eval.class,
actual = bc.test$Class
)
)
eval.rf <- data.frame(
mtry = grid$mtry,
num.trees = grid$num.trees,
OOB_Error = oob.rf$OOB_Error,
hasil.eval,
row.names = NULL
)
cat("\n===== PERBANDINGAN KLASIFIKASI (DATA TESTING) =====\n")##
## ===== PERBANDINGAN KLASIFIKASI (DATA TESTING) =====
## mtry num.trees OOB_Error TN FP FN TP Accuracy Precision Recall Specificity
## 1 2 200 0.0334 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 2 3 200 0.0334 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 3 5 200 0.0334 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 4 2 500 0.0355 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 5 3 500 0.0313 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 6 5 500 0.0334 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 7 2 1000 0.0376 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 8 3 1000 0.0334 131 2 1 70 0.9853 0.9722 0.9859 0.985
## 9 5 1000 0.0334 131 2 1 70 0.9853 0.9722 0.9859 0.985
## F1_Score
## 1 0.979
## 2 0.979
## 3 0.979
## 4 0.979
## 5 0.979
## 6 0.979
## 7 0.979
## 8 0.979
## 9 0.979
# Pemilihan model terbaik
# Accuracy tertinggi, lalu F1-score tertinggi, lalu OOB error terendah
urut <- order(-eval.rf$Accuracy, -eval.rf$F1_Score, eval.rf$OOB_Error)
best <- urut[1]
best.nama <- grid$Model[best]
best.nama## [1] "mtry3_tree500"
## mtry num.trees OOB_Error TN FP FN TP Accuracy Precision Recall
## 5 3 500 0.03131524 131 2 1 70 0.9852941 0.9722222 0.9859155
## Specificity F1_Score
## 5 0.9849624 0.979021
# Confusion matrix lengkap pada model terbaik
cm.best <- confusionMatrix(
data = pred.list[[best.nama]],
reference = bc.test$Class,
positive = "malignant"
)
cm.best## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 131 1
## malignant 2 70
##
## Accuracy : 0.9853
## 95% CI : (0.9576, 0.997)
## No Information Rate : 0.652
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9677
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9859
## Specificity : 0.9850
## Pos Pred Value : 0.9722
## Neg Pred Value : 0.9924
## Prevalence : 0.3480
## Detection Rate : 0.3431
## Detection Prevalence : 0.3529
## Balanced Accuracy : 0.9854
##
## 'Positive' Class : malignant
##
Confusion matrix merangkum hasil klasifikasi ke dalam empat komponen, yaitu true positive (TP), true negative (TN), false positive (FP), dan false negative (FN). Kelas malignant ditetapkan sebagai kelas positif sehingga TP menunjukkan tumor ganas yang diprediksi ganas. Hasil klasifikasi pada data testing disajikan pada Tabel 4.5 dan berlaku untuk seluruh skenario model.
Tabel 4.5 Confusion matrix pada data testing
| Kelas Aktual | Prediksi Benign | Prediksi Malignant | Total |
|---|---|---|---|
| Benign | 131 | 2 | 133 |
| Malignant | 1 | 70 | 71 |
Kesembilan skenario menghasilkan confusion matrix yang
identik pada data testing, yaitu 131 TN, 2 FP, 1 FN, dan 70 TP.
Dari 204 observasi, sebanyak 201 observasi terklasifikasi benar, dengan
dua observasi benign diprediksi malignant dan satu
observasi malignant diprediksi benign. Tabel keluaran
confusionMatrix() pada paket caret menempatkan
prediksi pada baris dan nilai aktual pada kolom, sehingga letak angka 2
dan 1 tampak tertukar terhadap Tabel 4.5, tetapi isi kedua tabel
sama.
Ukuran evaluasi dihitung dari komponen confusion matrix tersebut dan disajikan pada Tabel 4.6. Accuracy menyatakan proporsi observasi yang terklasifikasi benar, precision menyatakan proporsi prediksi malignant yang benar-benar malignant, dan recall menyatakan kemampuan model menemukan observasi malignant. Specificity menyatakan kemampuan model mengenali observasi benign, sedangkan F1-score merupakan rata-rata harmonik precision dan recall.
Tabel 4.6 Ukuran evaluasi setiap skenario model pada data testing
mtry |
num.trees |
OOB Error | Accuracy | Precision | Recall | Specificity | F1-score |
|---|---|---|---|---|---|---|---|
| 2 | 200 | 0,0334 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 3 | 200 | 0,0334 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 5 | 200 | 0,0334 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 2 | 500 | 0,0355 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 3 | 500 | 0,0313 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 5 | 500 | 0,0334 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 2 | 1000 | 0,0376 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 3 | 1000 | 0,0334 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
| 5 | 1000 | 0,0334 | 0,9853 | 0,9722 | 0,9859 | 0,9850 | 0,9790 |
Seluruh model memperoleh accuracy sebesar 0,9853,
precision sebesar 0,9722, recall sebesar 0,9859,
specificity sebesar 0,9850, dan F1-score sebesar
0,9790, sehingga tidak terdapat perbedaan performa pada data
testing. Keseragaman ini menunjukkan bahwa variasi
mtry (2, 3, dan 5) dan num.trees (200, 500,
dan 1000) tidak mengubah ketepatan klasifikasi pada data
testing. Perbedaan antarmodel hanya tampak pada OOB
error, sehingga model dengan mtry = 3 dan
num.trees = 500 yang memiliki OOB error terendah
sebesar 0,0313 dipilih sebagai model terbaik.
Nilai accuracy sebesar 0,9853 setara dengan 201 observasi yang tepat dari 204 observasi, dan melampaui No Information Rate sebesar 0,6520 dengan p-value kurang dari 2e-16. Selang kepercayaan 95% bagi accuracy berkisar antara 0,9576 dan 0,9970, dengan nilai Kappa sebesar 0,9677 dan balanced accuracy sebesar 0,9854. Nilai recall sebesar 0,9859 menunjukkan bahwa hanya satu tumor ganas yang tidak terdeteksi, yang penting dalam konteks diagnosis.
# Variable importance seluruh model
imp.mat <- sapply(rf.list, function(m) m$variable.importance)
imp.mat <- imp.mat[order(-imp.mat[, best.nama]), ]
round(imp.mat, 4)## mtry2_tree200 mtry3_tree200 mtry5_tree200 mtry2_tree500
## Bare.nuclei 0.0623 0.0729 0.0796 0.0663
## Cell.size 0.0558 0.0747 0.0767 0.0606
## Cell.shape 0.0454 0.0515 0.0530 0.0493
## Cl.thickness 0.0454 0.0419 0.0430 0.0455
## Bl.cromatin 0.0284 0.0292 0.0191 0.0269
## Marg.adhesion 0.0180 0.0188 0.0180 0.0209
## Normal.nucleoli 0.0204 0.0125 0.0199 0.0184
## Epith.c.size 0.0105 0.0130 0.0090 0.0115
## Mitoses 0.0056 0.0046 0.0068 0.0052
## mtry3_tree500 mtry5_tree500 mtry2_tree1000 mtry3_tree1000
## Bare.nuclei 0.0754 0.0764 0.0690 0.0727
## Cell.size 0.0727 0.0729 0.0650 0.0718
## Cell.shape 0.0517 0.0475 0.0518 0.0528
## Cl.thickness 0.0431 0.0462 0.0422 0.0421
## Bl.cromatin 0.0267 0.0208 0.0263 0.0261
## Marg.adhesion 0.0188 0.0204 0.0198 0.0198
## Normal.nucleoli 0.0153 0.0193 0.0175 0.0154
## Epith.c.size 0.0131 0.0092 0.0121 0.0121
## Mitoses 0.0053 0.0062 0.0055 0.0048
## mtry5_tree1000
## Bare.nuclei 0.0783
## Cell.size 0.0769
## Cell.shape 0.0469
## Cl.thickness 0.0455
## Bl.cromatin 0.0216
## Marg.adhesion 0.0199
## Normal.nucleoli 0.0189
## Epith.c.size 0.0084
## Mitoses 0.0064
# Variable importance model terbaik
importance.best <- sort(
rf.list[[best.nama]]$variable.importance,
decreasing = TRUE
)
importance.best## Bare.nuclei Cell.size Cell.shape Cl.thickness Bl.cromatin
## 0.075403708 0.072709054 0.051740474 0.043132471 0.026673673
## Marg.adhesion Normal.nucleoli Epith.c.size Mitoses
## 0.018769489 0.015307826 0.013055128 0.005300426
## mtry2_tree200 mtry3_tree200 mtry5_tree200 mtry2_tree500 mtry3_tree500
## "Bare.nuclei" "Cell.size" "Bare.nuclei" "Bare.nuclei" "Bare.nuclei"
## mtry5_tree500 mtry2_tree1000 mtry3_tree1000 mtry5_tree1000
## "Bare.nuclei" "Bare.nuclei" "Bare.nuclei" "Bare.nuclei"
par(mar = c(9, 4, 4, 2))
barplot(
importance.best,
las = 2,
main = "Variable Importance - Random Forest Classification",
ylab = "Permutation Importance"
)Gambar 4.1 Variable Importance Random Forest (mtry = 3, num.trees = 500)
Variable importance menunjukkan seberapa besar kontribusi setiap prediktor terhadap ketepatan prediksi model. Metode permutasi yang digunakan menghitung penurunan ketepatan prediksi OOB ketika nilai suatu variabel diacak, sehingga semakin besar penurunannya, semakin penting variabel tersebut. Nilai importance seluruh skenario model disajikan pada Tabel 4.7, sedangkan visualisasi pada model terbaik ditampilkan pada Gambar 4.1.
Tabel 4.7 Nilai permutation importance
Setiap Skenario Model (mtry / num.trees)
| Variabel | 2 / 200 | 3 / 200 | 5 / 200 | 2 / 500 | 3 / 500 | 5 / 500 | 2 / 1000 | 3 / 1000 | 5 / 1000 |
|---|---|---|---|---|---|---|---|---|---|
Bare.nuclei |
0,0623 | 0,0729 | 0,0796 | 0,0663 | 0,0754 | 0,0764 | 0,0690 | 0,0727 | 0,0783 |
Cell.size |
0,0558 | 0,0747 | 0,0767 | 0,0606 | 0,0727 | 0,0729 | 0,0650 | 0,0718 | 0,0769 |
Cell.shape |
0,0454 | 0,0515 | 0,0530 | 0,0493 | 0,0517 | 0,0475 | 0,0518 | 0,0528 | 0,0469 |
Cl.thickness |
0,0454 | 0,0419 | 0,0430 | 0,0455 | 0,0431 | 0,0462 | 0,0422 | 0,0421 | 0,0455 |
Bl.cromatin |
0,0284 | 0,0292 | 0,0191 | 0,0269 | 0,0267 | 0,0208 | 0,0263 | 0,0261 | 0,0216 |
Marg.adhesion |
0,0180 | 0,0188 | 0,0180 | 0,0209 | 0,0188 | 0,0204 | 0,0198 | 0,0198 | 0,0199 |
Normal.nucleoli |
0,0204 | 0,0125 | 0,0199 | 0,0184 | 0,0153 | 0,0193 | 0,0175 | 0,0154 | 0,0189 |
Epith.c.size |
0,0105 | 0,0130 | 0,0090 | 0,0115 | 0,0131 | 0,0092 | 0,0121 | 0,0121 | 0,0084 |
Mitoses |
0,0056 | 0,0046 | 0,0068 | 0,0052 | 0,0053 | 0,0062 | 0,0055 | 0,0048 | 0,0064 |
Pada model terbaik, variabel Bare.nuclei menempati
peringkat pertama dengan nilai 0,0754, disusul Cell.size
dengan nilai 0,0727 dan Cell.shape dengan nilai 0,0517.
Ketiga variabel tersebut, bersama Cl.thickness sebesar
0,0431, memberikan kontribusi terbesar terhadap kemampuan model
membedakan tumor jinak dan ganas. Variabel Mitoses memiliki
nilai terkecil, yaitu 0,0053, sehingga pengaruhnya terhadap ketepatan
prediksi paling rendah.
Variabel Bare.nuclei menempati peringkat pertama pada
delapan dari sembilan model, sedangkan Cell.size unggul
tipis pada mtry = 3 dan num.trees = 200
(0,0747 berbanding 0,0729). Variabel Bare.nuclei dan
Cell.size selalu menempati dua peringkat teratas, sedangkan
Mitoses selalu menempati peringkat terakhir pada seluruh
model. Urutan kepentingan variabel tersebut relatif konsisten terhadap
perubahan mtry dan num.trees.
Nilai importance Bare.nuclei dan
Cell.size cenderung meningkat seiring bertambahnya
mtry, misalnya Bare.nuclei sebesar 0,0663;
0,0754; dan 0,0764 pada mtry = 2, 3, dan 5 untuk
num.trees = 500. Kecenderungan ini dapat dijelaskan karena
pada mtry yang lebih besar, variabel yang kuat lebih sering
masuk dalam kandidat pemisah sehingga lebih sering digunakan. Pada
mtry yang kecil, variabel lain memperoleh kesempatan
terpilih yang lebih besar, seperti Bl.cromatin yang
bernilai 0,0269 pada mtry = 2 dan 0,0208 pada
mtry = 5 untuk num.trees = 500.
Random Forest dan Double Random Forest merupakan metode ensemble berbasis decision tree yang menggabungkan prediksi banyak pohon untuk menekan varians dan meningkatkan kestabilan prediksi. Random Forest membentuk setiap pohon dari satu sampel bootstrap dengan pemilihan prediktor secara acak pada setiap simpul, lalu menggabungkan hasilnya melalui majority voting atau rata-rata. Double Random Forest membangun setiap pohon dari seluruh data training, sedangkan bootstrap digunakan pada setiap simpul untuk mencari aturan pemisahan terbaik. Pohon yang dihasilkan Double Random Forest cenderung lebih besar, tetapi waktu komputasinya lebih lama.
Random Forest dan Double Random Forest dapat diterapkan pada klasifikasi untuk memprediksi kelas kategorik dan pada regresi untuk memprediksi nilai numerik. Pada klasifikasi, prediksi akhir ditentukan melalui majority voting dari seluruh pohon dengan indeks Gini sebagai kriteria pemisahan. Pada regresi, prediksi akhir diperoleh dari rata-rata prediksi seluruh pohon dengan penurunan galat kuadrat sebagai dasar pemisahan. Parameter seperti jumlah pohon, jumlah prediktor yang dipilih pada setiap simpul, dan ukuran simpul akhir memengaruhi bentuk model yang dihasilkan.
Performa model dievaluasi menggunakan ukuran yang sesuai dengan jenis permasalahan, yaitu confusion matrix beserta accuracy, precision, recall, specificity, dan F1-score pada klasifikasi, serta MSE, RMSE, MAE, dan \(R^2\) pada regresi. Out-of-Bag (OOB) error menyediakan evaluasi internal yang dihitung dari observasi yang tidak terpilih dalam sampel bootstrap, sehingga tidak memerlukan himpunan validasi tambahan. Perbandingan Random Forest dan Double Random Forest dapat ditinjau dari mekanisme pembentukan pohon, ketepatan prediksi, OOB error, dan beban komputasi. Evaluasi yang objektif pada data yang tidak digunakan saat pelatihan diperlukan agar kemampuan prediksi kedua metode dapat dibandingkan secara adil.
Pada batasan masalah, Random Forest Classification pada data
BreastCancer dengan mtry sebesar 2, 3, dan 5
serta num.trees sebesar 200, 500, dan 1000 menghasilkan OOB
error antara 3,13% dan 3,76%, dengan nilai terendah pada
mtry = 3 dan num.trees = 500. Seluruh skenario
memperoleh performa data testing yang sama, yaitu
accuracy sebesar 0,9853, precision sebesar 0,9722,
recall sebesar 0,9859, specificity sebesar 0,9850, dan
F1-score sebesar 0,9790. Model dengan mtry = 3 dan
num.trees = 500 dipilih sebagai model terbaik karena
memiliki OOB error terendah. Analisis variable
importance menempatkan Bare.nuclei dan
Cell.size sebagai dua prediktor paling berpengaruh,
sedangkan Mitoses memiliki pengaruh paling kecil pada
seluruh model.
Penelitian selanjutnya disarankan melakukan tuning parameter, seperti jumlah pohon, jumlah prediktor pada setiap simpul, dan ukuran simpul akhir, melalui validasi silang agar model yang diperoleh lebih optimal. Penanganan data hilang dapat dilakukan dengan imputasi sehingga seluruh observasi tetap digunakan dalam pembentukan model. Perbandingan dengan Double Random Forest maupun metode ensemble lain dapat dilakukan untuk menilai metode yang paling sesuai pada data yang dianalisis. Penggunaan ukuran evaluasi tambahan, seperti AUC dari kurva ROC, juga dianjurkan agar penilaian kemampuan model dalam membedakan kelas lebih mendalam.
Ananda, R., Ula, M., & Fadlisyah. (2026). Predicting Household Food Insecurity Status in Langsa City Using Double Random Forest and EasyEnsemble Algorithms. Journal of Artificial Intelligence and Software Engineering, 6(2), 95–104. https://doi.org/10.30811/jaise.v6i2.9116
Chang, C. Y., & Chang, M. C. (2026). Bootstrap aggregation for regression problems via generalized least squares. Statistics and Computing, 36(3), 1–20. https://doi.org/10.1007/s11222-026-10893-x
Farhan, M., Puspasari, S., & Gasim, G. (2025). Analisis Sentimen Supporter Sriwijaya FC Berbasis Manchine Learning. Jurnal Algoritme, 6(1), 37–49. https://doi.org/10.35957/algoritme.v6i1.11288
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Bengkulu: Laboratorium Matematika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Bengkulu.
Khairunnisa, A., Notodiputro, K. A., & Sartono, B. (2024). A Comparative Study of Random Forest and Double Random Forest Models from View Points of Their Interpretability. Scientific Journal of Informatics, 11(1), 207–218. https://doi.org/10.15294/sji.v11i1.48721
Nugroho, A. (2022). Analisa Splitting Criteria Pada Decision Tree dan Random Forest untuk Klasifikasi Evaluasi Kendaraan. JSITIK: Jurnal Sistem Informasi dan Teknologi Informasi Komputer, 1(1), 41–49. https://doi.org/10.53624/jsitik.v1i1.154
Pargent, F., Schoedel, R., & Stachl, C. (2023). Best Practices in Supervised Machine Learning: A Tutorial for Psychologists. Advances in Methods and Practices in Psychological Science, 6(3), 1–35. https://doi.org/10.1177/25152459231162559
Rashidi, H. H., Albahra, S., Robertson, S., Tran, N. K., & Hu, B. (2023). Common statistical concepts in the supervised Machine Learning arena. Frontiers in Oncology, 13(1), 1–14. https://doi.org/10.3389/fonc.2023.1130229
Ratnasari, A. P., Susetyo, B., & Notodiputro, K. A. (2023). COMPARISON OF DOUBLE RANDOM FOREST AND LONG SHORT-TERM MEMORY METHODS FOR ANALYZING ECONOMIC INDICATOR DATA. BAREKENG: Journal of Mathematics and Its Applications, 17(2), 757–766. https://doi.org/10.30598/barekengvol17iss2pp0757-0766
Scornet, E., & Hooker, G. (2026). Theory of Random Forests. Annual Review of Statistics and Its Application, 13(1), 99–121. https://doi.org/10.1146/annurev-statistics-112723
Sharma, N., & Iqbal, S. I. M. (2023). Applying Decision Tree Algorithm Classification and Regression Tree (CART) Algorithm to Gini Techniques Binary Splits. International Journal of Engineering and Advanced Technology, 12(5), 77–81. https://doi.org/10.35940/ijeat.E4195.0612523
Sitio, S. L. M., Darmawati, & Samudra, Y. (2026). COMPARATIVE ANALYSIS OF BAGGING AND BOOSTING MODELS IN ENSEMBLE LEARNING FOR GRADUATION PREDICTION. JITK (Jurnal Ilmu Pengetahuan dan Teknologi Komputer), 11(3), 979–986. https://doi.org/10.33480/jitk.v11i3.7579