Random forest merupakan salah satu algoritma dalam machine learning yang banyak digunakan untuk menyelesaikan permasalahan klasifikasi dan regresi. Random forest termasuk ke dalam metode ensemble learning, yaitu pendekatan yang menggabungkan beberapa model prediktif sederhana untuk meningkatkan kinerja prediksi dibandingkan dengan penggunaan satu model saja.
Secara umum, random forest bekerja dengan membangun sejumlah pohon keputusan (decision tree) selama proses pelatihan data. Setiap pohon dibangun menggunakan sampel data yang diambil secara acak dari data pelatihan serta subset fitur yang dipilih secara acak, yang dikenal dengan teknik bootstrap aggregating atau bagging. Pada permasalahan klasifikasi, hasil akhir model diperoleh melalui mekanisme voting mayoritas dari seluruh pohon keputusan yang terbentuk sehingga dapat menghasilkan prediksi yang lebih stabil dan mengurangi risiko overfitting.
Data yang digunakan merupakan data klasifikasi penanganan pasien yang diperoleh dari situs Kaggle. Dataset ini merupakan data rekam medis elektronik yang dikumpulkan dari sebuah rumah sakit swasta di Indonesia. Data ini berisi hasil pemeriksaan laboratorium pasien yang digunakan untuk menentukan penanganan pasien selanjutnya, apakah rawat inap atau rawat jalan.
## Warning: package 'readxl' was built under R version 4.3.3
| HAEMATOCRIT | HAEMOGLOBINS | ERYTHROCYTE | LEUCOCYTE | THROMBOCYTE | MCH | MCHC | MCV | AGE | SEX | SOURCE |
|---|---|---|---|---|---|---|---|---|---|---|
| 338 | 111 | 418 | 46 | 150 | 266 | 328 | 809 | 33 | F | 1 |
| 446 | 140 | 686 | 63 | 232 | 204 | 314 | 650 | 36 | M | 0 |
| 429 | 140 | 457 | 62 | 336 | 306 | 326 | 939 | 70 | F | 0 |
| 419 | 144 | 467 | 35 | 276 | 308 | 344 | 897 | 18 | F | 0 |
| 406 | 133 | 485 | 149 | 711 | 274 | 328 | 837 | 36 | M | 0 |
| 328 | 112 | 394 | 110 | 324 | 284 | 341 | 832 | 89 | F | 0 |
Daftar atribut/variabel yang terdapat pada dataset:
HAEMATOCRIT (Continuous) : hasil pemeriksaan laboratorium pasien untuk kadar hematokrit.
HAEMOGLOBINS (Continuous) : hasil pemeriksaan laboratorium pasien untuk kadar hemoglobin.
ERYTHROCYTE (Continuous) : hasil pemeriksaan laboratorium pasien untuk jumlah eritrosit.
LEUCOCYTE (Continuous) : hasil pemeriksaan laboratorium pasien untuk jumlah leukosit.
THROMBOCYTE (Continuous) : hasil pemeriksaan laboratorium pasien untuk jumlah trombosit.
MCH (Continuous) : hasil pemeriksaan laboratorium pasien untuk Mean Corpuscular Hemoglobin.
MCHC (Continuous) : hasil pemeriksaan laboratorium pasien untuk Mean Corpuscular Hemoglobin Concentration.
MCV (Continuous) : hasil pemeriksaan laboratorium pasien untuk Mean Corpuscular Volume.
AGE (Continuous) : usia pasien.
SEX (Nominal/Binary) : jenis kelamin pasien.
SOURCE (Nominal) : variabel target yang menunjukkan status penanganan pasien, yaitu 1 = pasien rawat inap dan 0 = pasien rawat jalan.
Berikut variabel yang digunakan dalam penelitian ini
Variabel respon (Y) :SOURCE
Variabel prediktor (X) : HAEMATOCRIT, HAEMOGLOBINS, ERYTHROCYTE, LEUCOCYTE, THROMBOCYTE, MCH, MCHC, MCV, AGE, SEX
str(data)
## tibble [3,309 × 11] (S3: tbl_df/tbl/data.frame)
## $ HAEMATOCRIT : num [1:3309] 338 446 429 419 406 328 219 384 279 382 ...
## $ HAEMOGLOBINS: num [1:3309] 111 140 140 144 133 112 73 123 92 129 ...
## $ ERYTHROCYTE : num [1:3309] 418 686 457 467 485 394 306 437 313 453 ...
## $ LEUCOCYTE : num [1:3309] 46 63 62 35 149 110 226 90 192 117 ...
## $ THROMBOCYTE : num [1:3309] 150 232 336 276 711 324 237 193 135 452 ...
## $ MCH : num [1:3309] 266 204 306 308 274 284 239 281 294 285 ...
## $ MCHC : num [1:3309] 328 314 326 344 328 341 333 320 330 338 ...
## $ MCV : num [1:3309] 809 650 939 897 837 832 716 879 891 843 ...
## $ AGE : num [1:3309] 33 36 70 18 36 89 53 74 56 66 ...
## $ SEX : chr [1:3309] "F" "M" "F" "F" ...
## $ SOURCE : num [1:3309] 1 0 0 0 0 0 0 1 1 1 ...
summary(data)
## HAEMATOCRIT HAEMOGLOBINS ERYTHROCYTE LEUCOCYTE
## Min. :137.0 Min. : 38.0 Min. : 18.0 Min. : 11.00
## 1st Qu.:343.0 1st Qu.:114.0 1st Qu.:379.0 1st Qu.: 57.00
## Median :387.0 Median :129.0 Median :448.0 Median : 76.00
## Mean :382.3 Mean :127.5 Mean :414.8 Mean : 87.16
## 3rd Qu.:425.0 3rd Qu.:142.0 3rd Qu.:499.0 3rd Qu.:103.00
## Max. :690.0 Max. :189.0 Max. :786.0 Max. :766.00
## THROMBOCYTE MCH MCHC MCV
## Min. : 10.0 Min. :149.0 Min. :260.0 Min. : 540.0
## 1st Qu.: 191.0 1st Qu.:272.0 1st Qu.:327.0 1st Qu.: 815.0
## Median : 257.0 Median :287.0 Median :334.0 Median : 853.0
## Mean : 258.9 Mean :282.3 Mean :333.4 Mean : 846.1
## 3rd Qu.: 322.0 3rd Qu.:298.0 3rd Qu.:341.0 3rd Qu.: 888.0
## Max. :1121.0 Max. :408.0 Max. :384.0 Max. :1156.0
## AGE SEX SOURCE
## Min. : 1.00 Length:3309 Min. :0.000
## 1st Qu.:29.00 Class :character 1st Qu.:0.000
## Median :48.00 Mode :character Median :0.000
## Mean :46.64 Mean :0.398
## 3rd Qu.:64.00 3rd Qu.:1.000
## Max. :99.00 Max. :1.000
data$SOURCE <- as.factor(data$SOURCE)
data$SEX <- as.factor(data$SEX)
colSums(is.na(data))
## HAEMATOCRIT HAEMOGLOBINS ERYTHROCYTE LEUCOCYTE THROMBOCYTE MCH
## 0 0 0 0 0 0
## MCHC MCV AGE SEX SOURCE
## 0 0 0 0 0
Dari hasil pengecekkan, seluruh atribut tidak terdapat data yang hilang (missing value) pada dataset. Seluruh observasi pada setiap variabel tersedia secara lengkap.
boxplot(data[,1:9], main="Deteksi Outlier", las=2)
Deteksi outlier dilakukan menggunakan metode boxplot pada setiap variabel numerik. Hasil pemeriksaan menunjukkan adanya beberapa nilai ekstrem pada beberapa variabel pemeriksaan laboratorium. Namun demikian, nilai tersebut tidak dihapus dari dataset karena metode Random Forest relatif robust terhadap keberadaan outlier sehingga tidak mempengaruhi kinerja model secara signifikan
set.seed(123)
index <- sample(1:nrow(data), 0.7*nrow(data))
train <- data[index, ]
test <- data[-index, ]
Pada proses ini data dibagi menjadi dua jenis yaitu data training dan testing, dengan proporsi 70% untuk data training dan 30% data testing
library(randomForest)
## Warning: package 'randomForest' was built under R version 4.3.3
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
model_rf <- randomForest(
SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS + ERYTHROCYTE +
LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV +
AGE + SEX,
data = train,
ntree = 500
)
model_rf
##
## Call:
## randomForest(formula = SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS + ERYTHROCYTE + LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV + AGE + SEX, data = train, ntree = 500)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 25.22%
## Confusion matrix:
## 0 1 class.error
## 0 1206 214 0.1507042
## 1 370 526 0.4129464
Model Random Forest dibangun menggunakan variabel X sebagai variabel prediktor untuk memprediksi variabel respon Y. Model dilatih menggunakan data training dengan jumlah pohon sebanyak 500. Hasil pemodelan menunjukkan bahwa tipe model yang digunakan adalah klasifikasi, dengan 3 variabel yang dipilih secara acak pada setiap pemisahan node. Nilai Out-of-Bag (OOB) error sebesar 24,87% menunjukkan tingkat kesalahan prediksi model pada data pelatihan.
Tuning Parameter dilakukan untuk meningkatkan performa model Random Forest dengan mencari kombinasi parameter yang lebih optimal
library(randomForest)
tuning <- tuneRF(
x = train[, -which(names(train) == "SOURCE")],
y = train$SOURCE,
stepFactor = 1.5,
improve = 0.01,
ntreeTry = 500,
trace = TRUE,
plot = TRUE
)
## mtry = 3 OOB error = 24.87%
## Searching left ...
## mtry = 2 OOB error = 24.35%
## 0.02083333 0.01
## Searching right ...
## mtry = 4 OOB error = 24.78%
## -0.0177305 0.01
tuning
## mtry OOBError
## 2.OOB 2 0.2435233
## 3.OOB 3 0.2487047
## 4.OOB 4 0.2478411
library(randomForest)
model_rf_tuned <- randomForest(
SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS + ERYTHROCYTE +
LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV +
AGE + SEX,
data = train,
ntree = 500,
mtry = 4
)
model_rf_tuned
##
## Call:
## randomForest(formula = SOURCE ~ HAEMATOCRIT + HAEMOGLOBINS + ERYTHROCYTE + LEUCOCYTE + THROMBOCYTE + MCH + MCHC + MCV + AGE + SEX, data = train, ntree = 500, mtry = 4)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 4
##
## OOB estimate of error rate: 24.22%
## Confusion matrix:
## 0 1 class.error
## 0 1221 199 0.1401408
## 1 362 534 0.4040179
prediksi_tuned <- predict(model_rf_tuned, newdata = test)
cm_tuned <- table(Prediksi = prediksi_tuned, Aktual = test$SOURCE)
cm_tuned
## Aktual
## Prediksi 0 1
## 0 487 161
## 1 85 260
cm <- table(Prediksi = prediksi_tuned, Aktual = test$SOURCE)
cm
## Aktual
## Prediksi 0 1
## 0 487 161
## 1 85 260
Berdasarkan confusion matrix, model Random Forest menghasilkan 487 prediksi benar untuk kelas 0 dan 266 prediksi benar untuk kelas 1. Sementara itu, terdapat 155 data kelas 1 yang salah diprediksi sebagai kelas 0 serta 85 data kelas 0 yang salah diprediksi sebagai kelas 1. Hasil ini menunjukkan bahwa model sudah mampu mengklasifikasikan sebagian besar data dengan benar, meskipun masih terdapat beberapa kesalahan prediksi pada kedua kelas.
accuracy <- sum(diag(cm)) / sum(cm)
precision <- cm[2,2] / (cm[2,2] + cm[2,1])
recall <- cm[2,2] / (cm[2,2] + cm[1,2])
f1_score <- 2 * ((precision * recall) / (precision + recall))
hasil <- data.frame(
Accuracy = accuracy,
Precision = precision,
Recall = recall,
F1_Score = f1_score
)
hasil
## Accuracy Precision Recall F1_Score
## 1 0.7522659 0.7536232 0.6175772 0.6788512
Berdasarkan hasil evaluasi model menggunakan confusion matrix, diperoleh nilai akurasi sebesar 0,7583 (75,83%), yang menunjukkan bahwa sekitar 75,83% data berhasil diklasifikasikan dengan benar oleh model Random Forest. Nilai precision sebesar 0,7578 menunjukkan bahwa sekitar 75,78% dari seluruh prediksi kelas positif merupakan prediksi yang benar. Sementara itu, nilai recall sebesar 0,6318 menunjukkan bahwa model mampu mengidentifikasi sekitar 63,18% dari seluruh data yang benar-benar termasuk kelas positif. Nilai F1-Score sebesar 0,6891 menggambarkan keseimbangan antara precision dan recall dalam model. Secara keseluruhan, hasil ini menunjukkan bahwa model memiliki kinerja yang cukup baik dalam melakukan klasifikasi, meskipun kemampuan mendeteksi seluruh kelas positif masih dapat ditingkatkan.
importance(model_rf_tuned)
## MeanDecreaseGini
## HAEMATOCRIT 135.21612
## HAEMOGLOBINS 96.65088
## ERYTHROCYTE 96.44436
## LEUCOCYTE 133.83613
## THROMBOCYTE 247.48300
## MCH 79.82556
## MCHC 85.65908
## MCV 93.55132
## AGE 112.52434
## SEX 17.46729
varImpPlot(model_rf_tuned)
Hasil analisis variable importance menunjukkan bahwa variabel THROMBOCYTE memiliki pengaruh paling besar dalam menentukan klasifikasi penanganan pasien, diikuti oleh LEUCOCYTE dan HAEMATOCRIT. Sementara itu, variabel SEX memiliki pengaruh paling kecil dalam model.
Berdasarkan hasil pemodelan menggunakan metode Random Forest, model klasifikasi berhasil dibangun untuk memprediksi status penanganan pasien berdasarkan data hasil pemeriksaan laboratorium dan informasi demografis pasien. Variabel yang digunakan dalam model meliputi haematocrit, haemoglobins, erythrocyte, leucocyte, thrombocyte, MCH, MCHC, MCV, usia, dan jenis kelamin.
Hasil analisis variable importance menunjukkan bahwa variabel THROMBOCYTE memiliki pengaruh paling besar dalam menentukan klasifikasi penanganan pasien, diikuti oleh LEUCOCYTE dan HAEMATOCRIT. Sementara itu, variabel SEX memiliki pengaruh paling kecil dalam model. Hal ini menunjukkan bahwa parameter hasil pemeriksaan laboratorium darah memiliki peranan yang lebih penting dibandingkan faktor demografis dalam menentukan keputusan penanganan pasien. Dengan demikian, model Random Forest dapat digunakan sebagai alat bantu dalam memprediksi status penanganan pasien berdasarkan data rekam medis yang tersedia.