Machine learning merupakan bagian dari kecerdasan buatan yang memungkinkan komputer mempelajari pola dari data untuk melakukan prediksi maupun pengelompokan. Salah satu pendekatan yang banyak digunakan adalah ensemble learning, yaitu penggabungan sejumlah model pembelajaran untuk menghasilkan prediksi yang lebih stabil. Random Forest merupakan salah satu metode ensemble learning berbasis pohon keputusan yang menggabungkan prinsip bootstrap aggregating (bagging) dan pemilihan subset prediktor secara acak pada setiap proses pemisahan simpul.
Random Forest membentuk banyak pohon keputusan dari sampel bootstrap. Pada setiap simpul, hanya sebagian variabel prediktor yang dipertimbangkan sebagai kandidat pemisah. Untuk kasus regresi, hasil prediksi dari seluruh pohon digabungkan melalui nilai rata-rata, sedangkan pada klasifikasi umumnya digunakan suara mayoritas. Pengacakan sampel dan prediktor tersebut bertujuan mengurangi korelasi antarpohon sehingga gabungan pohon dapat menghasilkan prediksi yang lebih baik dibandingkan satu pohon keputusan.
Pengembangan dari Random Forest juga mencakup Double Random Forest (DRF). Han dkk. (2020) memperkenalkan DRF dengan mekanisme bootstrap pada setiap simpul selama pembentukan pohon, bukan hanya satu kali pada akar pohon. Pendekatan tersebut dirancang untuk membentuk pohon yang lebih besar dan beragam pada kondisi tertentu. Penelitian lanjutan juga mengembangkan pendekatan oblique dan rotation double random forest untuk meningkatkan keragaman pohon melalui transformasi ruang prediktor (Ganaie dkk., 2022). Dengan demikian, Random Forest dan Double Random Forest merupakan metode yang berkaitan, tetapi memiliki mekanisme pembentukan pohon yang berbeda.
Pada praktikum ini, analisis komputasi difokuskan pada Random Forest
Regression menggunakan data simulasi Friedman. Data Friedman memiliki
hubungan respons dan prediktor yang bersifat nonlinier serta memuat
prediktor yang tidak informatif, sehingga dapat digunakan untuk
mengamati kemampuan model dalam menangkap pola nonlinier. Model
dibandingkan berdasarkan kombinasi nilai mtry sebesar 2, 3,
dan 5 serta jumlah pohon (num.trees) sebesar 200, 500, dan
1000. Evaluasi dilakukan menggunakan MSE, RMSE, MAE, koefisien
determinasi (\(R^2\)), OOB MSE,
residual plot, dan variable importance. Melalui praktikum ini,
mahasiswa diharapkan memahami konsep Random Forest dan Double Random
Forest serta mampu menerapkan dan mengevaluasi model Random Forest pada
kasus regresi menggunakan R.
Ensemble learning merupakan pendekatan pembelajaran mesin yang menggabungkan prediksi dari beberapa model dasar untuk menghasilkan satu prediksi akhir (Dietterich, 2000). Penggabungan tersebut dapat mengurangi ketidakstabilan model dan meningkatkan kemampuan generalisasi (Dietterich, 2000; Hastie dkk., 2009). Salah satu bentuk ensemble learning adalah bagging, yaitu membangun model dari beberapa sampel bootstrap yang diambil dari data pelatihan (Breiman, 1996). Prediksi akhir regresi diperoleh dengan merata-ratakan prediksi seluruh model, sedangkan klasifikasi umumnya menggunakan suara mayoritas (Breiman, 1996; James dkk., 2021).
Random Forest merupakan metode ensemble yang membangun sejumlah pohon keputusan menggunakan sampel bootstrap dan subset prediktor yang dipilih secara acak (Breiman, 2001). Setiap pohon dibentuk secara relatif independen. Penggunaan subset prediktor pada setiap simpul membantu mengurangi kemiripan antarpohon, sehingga penggabungan prediksi dapat mengurangi varians model (Breiman, 2001; James dkk., 2021).
Misalkan terdapat \(B\) pohon keputusan yang dibentuk dari data pelatihan. Untuk regresi, prediksi Random Forest pada pengamatan dengan vektor prediktor \(x\) dirumuskan sebagai berikut (Hastie dkk., 2009):
\[ \hat{f}_{RF}(x)=\frac{1}{B}\sum_{b=1}^{B}\hat{f}_b(x) \]
dengan \(\hat{f}_b(x)\) merupakan prediksi dari pohon ke-\(b\), sedangkan \(B\) adalah jumlah pohon dalam hutan (Hastie dkk., 2009). Untuk klasifikasi, kelas akhir umumnya ditentukan berdasarkan kelas yang memperoleh suara terbanyak dari seluruh pohon (Breiman, 2001).
Parameter penting Random Forest antara lain num.trees,
yaitu jumlah pohon yang dibangun; mtry, yaitu jumlah
prediktor yang dipertimbangkan secara acak pada setiap pemisahan simpul;
serta min.node.size, yaitu ukuran minimum simpul terminal
(Wright & Ziegler, 2017). Nilai mtry yang kecil
meningkatkan pengacakan prediktor, sedangkan nilai yang lebih besar
memungkinkan lebih banyak kandidat variabel dipertimbangkan pada setiap
pemisahan (Probst dkk., 2019). Pemilihan parameter dapat memengaruhi
akurasi dan kompleksitas model (Probst dkk., 2019).
Double Random Forest (DRF) merupakan pengembangan dari Random Forest yang mengubah mekanisme pengambilan sampel selama pembentukan pohon (Han dkk., 2020). Pada Random Forest standar, satu sampel bootstrap digunakan untuk membangun satu pohon (Breiman, 2001). Sementara itu, DRF yang diperkenalkan oleh Han dkk. (2020) melakukan bootstrap pada setiap simpul ketika menentukan aturan pemisahan, termasuk pada akar pohon. Mekanisme tersebut memungkinkan pohon tumbuh menggunakan informasi observasi yang lebih luas dan menghasilkan struktur pohon yang lebih besar pada kondisi tertentu (Han dkk., 2020).
Perbedaan mekanisme tersebut ditujukan untuk mengatasi kondisi ketika Random Forest standar menghasilkan pohon yang belum cukup besar atau mengalami underfitting (Han dkk., 2020). DRF bukan sekadar Random Forest dengan jumlah pohon dua kali lebih banyak. Istilah double merujuk pada penggunaan proses pengambilan sampel secara berulang pada tahap pembentukan pohon (Han dkk., 2020). Pengembangan lain, seperti oblique dan rotation double random forest, menggabungkan mekanisme DRF dengan transformasi atau rotasi ruang prediktor pada simpul pohon (Ganaie dkk., 2022).
Dalam proses bootstrap, setiap pohon dibentuk menggunakan sampel yang diambil dengan pengembalian dari data pelatihan. Sebagian observasi tidak terpilih dalam sampel bootstrap untuk pohon tertentu. Observasi yang tidak terpilih tersebut disebut Out-of-Bag (OOB) dan dapat digunakan untuk mengevaluasi prediksi pohon tanpa memerlukan satu set validasi terpisah (Breiman, 2001; James dkk., 2021).
Untuk regresi, OOB Mean Squared Error dapat dituliskan sebagai berikut (James dkk., 2021):
\[ OOB\ MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_{i,OOB})^2 \]
dengan \(y_i\) merupakan nilai aktual dan \(\hat{y}_{i,OOB}\) merupakan prediksi observasi ke-\(i\) yang dihitung dari pohon-pohon yang tidak menggunakan observasi tersebut dalam sampel bootstrap (James dkk., 2021). OOB error dapat digunakan sebagai evaluasi internal selama pembentukan Random Forest (Breiman, 2001). Meskipun demikian, evaluasi pada data testing yang benar-benar dipisahkan tetap diperlukan untuk menilai kemampuan prediksi pada data yang tidak digunakan dalam pelatihan (Smith dkk., 2024).
Variable importance merupakan ukuran yang digunakan untuk melihat kontribusi relatif setiap prediktor terhadap hasil prediksi model (Breiman, 2001). Salah satu pendekatan yang umum digunakan adalah permutation importance (Wright & Ziegler, 2017). Pada pendekatan ini, nilai suatu prediktor diacak, kemudian perubahan kesalahan prediksi diamati. Jika pengacakan suatu prediktor menyebabkan kesalahan meningkat, prediktor tersebut memiliki kontribusi terhadap kemampuan prediksi model (Breiman, 2001). Ukuran kepentingan variabel berguna untuk memahami prediktor yang paling berkontribusi, tetapi tidak dapat langsung ditafsirkan sebagai hubungan sebab-akibat (Strobl dkk., 2007).
Evaluasi regresi dilakukan dengan membandingkan nilai aktual dan nilai prediksi pada data testing (James dkk., 2021). Ukuran evaluasi yang digunakan dalam praktikum ini meliputi (Hyndman & Koehler, 2006):
Mean Squared Error (MSE) merupakan rata-rata kuadrat selisih nilai aktual dan prediksi (James dkk., 2021).
\[ MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \]
Root Mean Squared Error (RMSE) merupakan akar kuadrat MSE dan memiliki satuan yang sama dengan respons (Willmott & Matsuura, 2005).
\[ RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2} \]
Mean Absolute Error (MAE) merupakan rata-rata nilai absolut selisih nilai aktual dan prediksi (Willmott & Matsuura, 2005).
\[ MAE=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat{y}_i| \]
Koefisien determinasi (\(R^2\)) menunjukkan proporsi variasi respons yang dapat dijelaskan oleh model (James dkk., 2021).
\[ R^2=1-\frac{\sum_{i=1}^{n}(y_i-\hat{y}_i)^2} {\sum_{i=1}^{n}(y_i-\bar{y})^2} \]
Nilai MSE, RMSE, dan MAE yang lebih kecil menunjukkan kesalahan prediksi yang lebih rendah (Hyndman & Koehler, 2006). Nilai \(R^2\) yang lebih besar menunjukkan kemampuan model yang lebih baik dalam menjelaskan variasi respons. Nilai \(R^2\) dapat bernilai negatif apabila prediksi model pada data uji lebih buruk daripada prediksi menggunakan rata-rata respons data uji (James dkk., 2021).
Data yang digunakan adalah data simulasi Friedman yang dibangkitkan
menggunakan fungsi mlbench.friedman1() dari paket
mlbench dalam program R (Leisch & Dimitriadou, 2024).
Data terdiri atas sepuluh variabel prediktor (\(X_1,\ldots,X_{10}\)) dan satu variabel
respons numerik (\(Y\)). Pembangkitan
data dilakukan sebanyak 1.000 observasi. Data Friedman digunakan karena
memiliki pola hubungan nonlinier antara prediktor dan respons serta
beberapa prediktor yang tidak informatif.
Respons pada data Friedman dibentuk oleh persamaan berikut (Friedman, 1991):
\[ Y=10\sin(\pi X_1X_2)+20(X_3-0{,}5)^2+10X_4+5X_5+\varepsilon \]
dengan \(X_1,\ldots,X_{10}\)
berdistribusi seragam pada interval [0, 1] dan \(\varepsilon\) merupakan galat acak
berdistribusi normal dengan simpangan baku 1 (sd = 1).
Berdasarkan persamaan tersebut, hanya \(X_1\) sampai \(X_5\) yang memengaruhi respons, sedangkan
\(X_6\) sampai \(X_{10}\) merupakan prediktor yang tidak
informatif.
| Variabel | Keterangan |
|---|---|
| \(Y\) | Variabel respons numerik yang diprediksi |
| \(X_1,\ldots,X_{10}\) | Sepuluh variabel prediktor pada data Friedman |
mtry |
Jumlah prediktor yang dipertimbangkan pada setiap pemisahan simpul |
num.trees |
Jumlah pohon yang dibentuk dalam Random Forest |
Langkah-langkah analisis yang dilakukan adalah sebagai berikut.
mlbench.friedman1().set.seed(234).mtry sebesar 2, 3, dan 5 serta
num.trees sebesar 200, 500, dan 1000.Paket mlbench digunakan untuk membangkitkan data
Friedman, ranger digunakan untuk membentuk model Random
Forest, sedangkan dplyr, tidyr,
ggplot2, dan knitr digunakan untuk pengolahan
data, visualisasi, serta penyajian hasil.
# Instal paket jika belum tersedia:
# install.packages(c("mlbench", "ranger", "dplyr", "tidyr", "ggplot2", "knitr"))
library(mlbench)
library(ranger)
library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
# Membangkitkan data simulasi Friedman
set.seed(234)
data_friedman <- mlbench.friedman1(n = 1000, sd = 1)
data_friedman <- as.data.frame(data_friedman)
head(data_friedman)## x.1 x.2 x.3 x.4 x.5 x.6 x.7
## 1 0.74562000 0.2761835 0.077996212 0.172081056 0.18625795 0.06679016 0.3463721
## 2 0.78171242 0.6426889 0.320190865 0.631658023 0.08349904 0.77180754 0.3080644
## 3 0.02003711 0.9873938 0.967770780 0.804429963 0.22333695 0.64791751 0.6502673
## 4 0.77608539 0.8425175 0.167261944 0.008992943 0.26031592 0.23493175 0.6340176
## 5 0.06691009 0.7327976 0.369795339 0.261133095 0.20119368 0.17158940 0.3941911
## 6 0.64479512 0.4302338 0.006615464 0.773696859 0.63979112 0.96461657 0.9707886
## x.8 x.9 x.10 y
## 1 0.07157006 0.4752933 0.13868054 11.465738
## 2 0.71483408 0.5965775 0.80690110 14.907177
## 3 0.46882941 0.7349675 0.41666208 14.853880
## 4 0.73573328 0.1351517 0.03941805 13.021960
## 5 0.46004389 0.9950917 0.78918644 6.638268
## 6 0.62609475 0.5691647 0.52862538 25.189397
## 'data.frame': 1000 obs. of 11 variables:
## $ x.1 : num 0.7456 0.7817 0.02 0.7761 0.0669 ...
## $ x.2 : num 0.276 0.643 0.987 0.843 0.733 ...
## $ x.3 : num 0.078 0.32 0.968 0.167 0.37 ...
## $ x.4 : num 0.17208 0.63166 0.80443 0.00899 0.26113 ...
## $ x.5 : num 0.1863 0.0835 0.2233 0.2603 0.2012 ...
## $ x.6 : num 0.0668 0.7718 0.6479 0.2349 0.1716 ...
## $ x.7 : num 0.346 0.308 0.65 0.634 0.394 ...
## $ x.8 : num 0.0716 0.7148 0.4688 0.7357 0.46 ...
## $ x.9 : num 0.475 0.597 0.735 0.135 0.995 ...
## $ x.10: num 0.1387 0.8069 0.4167 0.0394 0.7892 ...
## $ y : num 11.47 14.91 14.85 13.02 6.64 ...
Data terdiri atas y sebagai variabel respons dan
x.1 sampai x.10 sebagai variabel prediktor.
Ringkasan statistik digunakan untuk melihat karakteristik awal data.
## x.1 x.2 x.3 x.4
## Min. :0.001198 Min. :0.001884 Min. :1.477e-05 Min. :0.000531
## 1st Qu.:0.252244 1st Qu.:0.229962 1st Qu.:2.536e-01 1st Qu.:0.249890
## Median :0.502501 Median :0.493678 Median :5.008e-01 Median :0.500833
## Mean :0.490455 Mean :0.493386 Mean :5.001e-01 Mean :0.501039
## 3rd Qu.:0.724930 3rd Qu.:0.750807 3rd Qu.:7.444e-01 3rd Qu.:0.738471
## Max. :0.999850 Max. :0.999021 Max. :9.992e-01 Max. :0.998386
## x.5 x.6 x.7 x.8
## Min. :0.001774 Min. :0.0001198 Min. :0.0009038 Min. :0.0005495
## 1st Qu.:0.248165 1st Qu.:0.2485552 1st Qu.:0.2435999 1st Qu.:0.2685956
## Median :0.513857 Median :0.5008499 Median :0.4886027 Median :0.5252676
## Mean :0.504918 Mean :0.5015384 Mean :0.4973700 Mean :0.5123303
## 3rd Qu.:0.761429 3rd Qu.:0.7458245 3rd Qu.:0.7520365 3rd Qu.:0.7569608
## Max. :0.998546 Max. :0.9993431 Max. :0.9968358 Max. :0.9999746
## x.9 x.10 y
## Min. :0.0006859 Min. :0.0006466 Min. :-0.1529
## 1st Qu.:0.2620676 1st Qu.:0.2527644 1st Qu.:10.7287
## Median :0.5036696 Median :0.4925590 Median :14.2324
## Mean :0.5044159 Mean :0.4960867 Mean :14.2698
## 3rd Qu.:0.7498544 3rd Qu.:0.7418533 3rd Qu.:17.7313
## Max. :0.9996305 Max. :0.9931607 Max. :28.8621
Pemeriksaan nilai hilang dan duplikasi dilakukan untuk memastikan kondisi data sebelum pemodelan.
## x.1 x.2 x.3 x.4 x.5 x.6 x.7 x.8 x.9 x.10 y
## 0 0 0 0 0 0 0 0 0 0 0
## [1] 0
Hasil pemeriksaan menunjukkan bahwa data terdiri atas 1000 observasi dan 11 variabel (sepuluh prediktor dan satu respons). Jumlah nilai hilang pada seluruh variabel adalah 0 dan jumlah baris duplikat adalah 0. Dengan demikian, data tidak memerlukan imputasi maupun penghapusan observasi sehingga seluruh observasi dapat langsung digunakan pada tahap pemodelan.
Distribusi variabel respons diamati menggunakan histogram. Diagram pencar digunakan untuk melihat pola hubungan respons dengan beberapa prediktor.
ggplot(data_friedman, aes(x = y)) +
geom_histogram(bins = 30, color = "white") +
labs(
title = "Distribusi Variabel Respons Friedman",
x = "Nilai Y",
y = "Frekuensi"
) +
theme_minimal()Gambar 1. Distribusi variabel respons Y
Gambar 1 memperlihatkan bahwa nilai Y berada pada rentang -0.15 sampai 28.86 dengan rata-rata 14.27, median 14.23, dan simpangan baku 5.02. Koefisien kemiringan sebesar 0.11 yang mendekati nol, sehingga sebaran Y relatif simetris dan tidak memerlukan transformasi sebelum pemodelan. Karena Random Forest tidak mensyaratkan distribusi tertentu pada respons, bentuk sebaran ini tidak menjadi hambatan pada tahap pemodelan.
data_friedman %>%
select(y, x.1, x.2, x.3, x.4, x.5) %>%
pivot_longer(
cols = starts_with("x."),
names_to = "Prediktor",
values_to = "Nilai_X"
) %>%
ggplot(aes(x = Nilai_X, y = y)) +
geom_point(alpha = 0.45) +
geom_smooth(method = "loess", se = FALSE) +
facet_wrap(~ Prediktor, scales = "free_x") +
labs(
title = "Hubungan Respons dengan Lima Prediktor Pertama",
x = "Nilai prediktor",
y = "Y"
) +
theme_minimal()## `geom_smooth()` using formula = 'y ~ x'
Gambar 2. Hubungan Y dengan X1 sampai X5
Gambar 2 menampilkan hubungan Y dengan lima prediktor pertama beserta kurva penghalus loess. Koefisien korelasi linear Pearson antara Y dan x.1 sampai x.5 berturut-turut adalah 0.38, 0.40, 0.03, 0.58, 0.30. Prediktor x.4 dan x.5 menunjukkan hubungan linear positif (korelasi 0.58 dan 0.30), sesuai dengan persamaan pembangkit data yang memuat suku linear 10·x4 dan 5·x5. Korelasi linear x.3 hanya sebesar 0.03, mendekati nol, padahal x.3 berperan melalui suku kuadratik 20(x3 − 0,5)². Hal ini menunjukkan bahwa hubungan yang berbentuk lengkung tidak tertangkap oleh korelasi linear. Prediktor x.1 dan x.2 berperan melalui suku interaksi 10 sin(π·x1·x2) sehingga hubungan marginal masing-masing terhadap Y relatif lemah (korelasi 0.38 dan 0.40), dan baru terlihat jelas apabila kedua prediktor dipertimbangkan bersama. Kombinasi hubungan linear, kuadratik, dan interaksi tersebut membuat model linear sederhana kurang memadai dan menjadi alasan penggunaan metode berbasis pohon.
Pola hubungan yang tidak sepenuhnya linier dapat menjadi alasan penggunaan metode berbasis pohon. Data Friedman juga memuat prediktor yang tidak informatif sehingga hasil variable importance dapat digunakan untuk mengamati kemampuan model dalam mengenali prediktor yang berkontribusi.
Data dibagi menjadi 80% data training dan 20% data testing. Data training digunakan untuk membentuk model, sedangkan data testing digunakan untuk mengevaluasi kemampuan prediksi pada observasi yang tidak digunakan selama pelatihan. Seed 234 digunakan tepat sebelum proses pengambilan indeks sampel agar pembagian data dapat direproduksi.
set.seed(234)
n <- nrow(data_friedman)
id_train <- sample(seq_len(n), size = floor(0.80 * n))
data_train <- data_friedman[id_train, ]
data_test <- data_friedman[-id_train, ]
cat("Jumlah data keseluruhan:", nrow(data_friedman), "\n")## Jumlah data keseluruhan: 1000
## Jumlah data training: 800
## Jumlah data testing: 200
Pembagian data menghasilkan 800 observasi training (80%) dan 200 observasi testing (20%), sesuai proporsi yang ditetapkan. Data testing yang berjumlah 200 observasi relatif kecil sehingga nilai MSE, RMSE, MAE, dan \(R^2\) pada data testing dapat bervariasi apabila pembagian data diubah. Oleh karena itu, selisih kecil antarmodel pada pembahasan berikutnya perlu ditafsirkan secara hati-hati.
Pemodelan dilakukan menggunakan fungsi ranger() dari
paket ranger. Parameter mtry dibandingkan pada
nilai 2, 3, dan 5, sedangkan num.trees dibandingkan pada
200, 500, dan 1000. Kombinasi tersebut menghasilkan sembilan model.
Parameter importance = "permutation" digunakan untuk
menghitung kepentingan variabel berdasarkan pengacakan prediktor. OOB
error dihitung secara internal oleh model menggunakan observasi yang
tidak terpilih dalam sampel bootstrap masing-masing pohon.
kombinasi <- expand.grid(
mtry = c(2, 3, 5),
num.trees = c(200, 500, 1000)
)
model_list <- vector("list", nrow(kombinasi))
nama_model <- paste0("mtry_", kombinasi$mtry,
"_trees_", kombinasi$num.trees)
names(model_list) <- nama_model
for (i in seq_len(nrow(kombinasi))) {
set.seed(234)
model_list[[i]] <- ranger(
formula = y ~ .,
data = data_train,
num.trees = kombinasi$num.trees[i],
mtry = kombinasi$mtry[i],
importance = "permutation",
seed = 234,
num.threads = 1
)
}
hasil_parameter <- kombinasi
hasil_parameter$Model <- nama_model
kable(hasil_parameter[, c("Model", "mtry", "num.trees")],
caption = "Sembilan Kombinasi Parameter Random Forest")| Model | mtry | num.trees |
|---|---|---|
| mtry_2_trees_200 | 2 | 200 |
| mtry_3_trees_200 | 3 | 200 |
| mtry_5_trees_200 | 5 | 200 |
| mtry_2_trees_500 | 2 | 500 |
| mtry_3_trees_500 | 3 | 500 |
| mtry_5_trees_500 | 5 | 500 |
| mtry_2_trees_1000 | 2 | 1000 |
| mtry_3_trees_1000 | 3 | 1000 |
| mtry_5_trees_1000 | 5 | 1000 |
Setiap model dibangun menggunakan data training yang sama. Penggunaan seed yang sama bertujuan menjaga proses pengacakan agar dapat direproduksi. Perbedaan hasil antarmodel selanjutnya diamati berdasarkan nilai OOB MSE dan evaluasi pada data testing.
Prediksi dilakukan pada data testing untuk seluruh kombinasi model.
Metrik evaluasi yang digunakan adalah MSE, RMSE, MAE, dan \(R^2\). Nilai OOB MSE diperoleh dari
komponen prediction.error pada objek model
ranger() untuk regresi.
hitung_metrik <- function(aktual, prediksi) {
mse <- mean((aktual - prediksi)^2)
rmse <- sqrt(mse)
mae <- mean(abs(aktual - prediksi))
r2 <- 1 - sum((aktual - prediksi)^2) /
sum((aktual - mean(aktual))^2)
data.frame(
MSE = mse,
RMSE = rmse,
MAE = mae,
R2 = r2
)
}
prediksi_list <- vector("list", length(model_list))
names(prediksi_list) <- names(model_list)
hasil_list <- vector("list", length(model_list))
for (i in seq_along(model_list)) {
prediksi <- predict(model_list[[i]], data = data_test)$predictions
prediksi_list[[i]] <- prediksi
metrik <- hitung_metrik(data_test$y, prediksi)
hasil_list[[i]] <- data.frame(
Model = names(model_list)[i],
mtry = kombinasi$mtry[i],
num.trees = kombinasi$num.trees[i],
OOB_MSE = model_list[[i]]$prediction.error,
metrik
)
}
hasil_evaluasi <- bind_rows(hasil_list) %>%
arrange(RMSE)
kable(hasil_evaluasi, digits = 4,
caption = "Perbandingan OOB MSE dan Performa pada Data Testing")| Model | mtry | num.trees | OOB_MSE | MSE | RMSE | MAE | R2 |
|---|---|---|---|---|---|---|---|
| mtry_5_trees_1000 | 5 | 1000 | 4.0102 | 4.1630 | 2.0404 | 1.6046 | 0.8269 |
| mtry_5_trees_500 | 5 | 500 | 4.0387 | 4.1796 | 2.0444 | 1.6152 | 0.8262 |
| mtry_5_trees_200 | 5 | 200 | 4.1066 | 4.2566 | 2.0632 | 1.6312 | 0.8230 |
| mtry_3_trees_1000 | 3 | 1000 | 4.4599 | 4.5041 | 2.1223 | 1.6677 | 0.8127 |
| mtry_3_trees_500 | 3 | 500 | 4.4965 | 4.5164 | 2.1252 | 1.6771 | 0.8122 |
| mtry_3_trees_200 | 3 | 200 | 4.5715 | 4.5913 | 2.1427 | 1.6891 | 0.8091 |
| mtry_2_trees_1000 | 2 | 1000 | 5.3141 | 5.3636 | 2.3159 | 1.8326 | 0.7770 |
| mtry_2_trees_500 | 2 | 500 | 5.2784 | 5.3822 | 2.3199 | 1.8344 | 0.7762 |
| mtry_2_trees_200 | 2 | 200 | 5.4169 | 5.4468 | 2.3338 | 1.8344 | 0.7735 |
MSE, RMSE, dan MAE yang lebih kecil menunjukkan kesalahan prediksi yang lebih rendah. Nilai \(R^2\) yang lebih besar menunjukkan proporsi variasi respons yang lebih mampu dijelaskan oleh model. OOB MSE merupakan evaluasi internal yang dihitung dari observasi out-of-bag, sedangkan MSE testing dihitung menggunakan data testing yang dipisahkan sebelum pemodelan. Kedua nilai tersebut tidak harus sama karena berasal dari observasi evaluasi yang berbeda.
Model dengan RMSE testing terkecil dipilih sebagai model terbaik berdasarkan kriteria utama. Metrik lainnya dan OOB MSE tetap diperiksa untuk memperoleh gambaran performa yang lebih menyeluruh.
model_terbaik <- hasil_evaluasi %>% slice(1)
cat("Model terbaik berdasarkan RMSE testing:", model_terbaik$Model, "\n")## Model terbaik berdasarkan RMSE testing: mtry_5_trees_1000
## mtry: 5
## Jumlah pohon: 1000
## OOB MSE: 4.0102
## MSE testing: 4.163
## RMSE testing: 2.0404
## MAE testing: 1.6046
## R-squared testing: 0.8269
Tabel di atas memuat hasil evaluasi sembilan kombinasi parameter yang
diurutkan dari RMSE testing terkecil. RMSE testing berkisar dari 2.0404
pada model mtry_5_trees_1000 hingga 2.3338 pada model
mtry_2_trees_200, sehingga selisih RMSE antara model
terbaik dan terburuk adalah 0.2935 atau 12.6% dari RMSE model terburuk.
Model terbaik menghasilkan MSE sebesar 4.1630 dan MAE sebesar 1.6046,
yang berarti rata-rata selisih absolut antara nilai aktual dan prediksi
pada data testing adalah 1.6046 satuan Y. MAE yang lebih kecil daripada
RMSE (rasio MAE terhadap RMSE sebesar 0.79) merupakan hal yang wajar
karena RMSE memberi bobot lebih besar pada galat yang besar; rasio yang
mendekati 0,8 umumnya menunjukkan sebaran galat yang mendekati normal
tanpa didominasi pengamatan ekstrem.
Nilai \(R^2\) pada data testing
berkisar dari 0.7735 hingga 0.8269. Pada model terbaik, \(R^2\) sebesar 0.8269 berarti sekitar 82.7%
variasi Y pada data testing dapat dijelaskan oleh model, sedangkan
sekitar 17.3% variasi belum terjelaskan. Simpangan baku Y pada data
testing adalah 4.92, sehingga RMSE model terbaik setara dengan 41.5%
dari simpangan baku tersebut. Data Friedman dibangkitkan dengan galat
acak yang bersimpangan baku 1 (sd = 1), sehingga galat yang
tidak dapat dihilangkan oleh model apa pun berada di sekitar 1 pada
skala RMSE. RMSE model terbaik berada sekitar 1.04 satuan di atas nilai
tersebut, sehingga masih terdapat ruang perbaikan model.
Pemilihan model terbaik pada praktikum ini mengacu pada RMSE testing terkecil, sedangkan OOB MSE dari setiap model dibahas tersendiri pada subbab 4.7 sebagai evaluasi internal.
Grafik berikut membandingkan MSE, RMSE, dan MAE testing pada sembilan kombinasi parameter. Skala sumbu dibuat bebas pada setiap panel agar pola perubahan masing-masing metrik dapat diamati dengan lebih jelas.
hasil_evaluasi %>%
select(Model, MSE, RMSE, MAE) %>%
pivot_longer(
cols = c(MSE, RMSE, MAE),
names_to = "Metrik",
values_to = "Nilai"
) %>%
ggplot(aes(x = Model, y = Nilai, fill = Model)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ Metrik, scales = "free_y") +
labs(
title = "Perbandingan Kesalahan Prediksi",
x = "Kombinasi model",
y = "Nilai metrik"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Gambar 3. Perbandingan MSE, RMSE, dan MAE pada data testing
ggplot(hasil_evaluasi,
aes(x = reorder(Model, R2), y = R2)) +
geom_col() +
coord_flip() +
labs(
title = "R-squared untuk Setiap Kombinasi Model",
x = "Model",
y = expression(R^2)
) +
theme_minimal()Gambar 4. Perbandingan R-squared pada data testing
Gambar 3 menunjukkan bahwa model dengan batang terendah pada panel
MSE dan RMSE adalah mtry_5_trees_1000, sedangkan batang
tertinggi dimiliki model mtry_2_trees_200. Karena RMSE
merupakan akar kuadrat dari MSE, kedua ukuran tersebut selalu
mengurutkan model dengan cara yang sama. Pada panel MAE, model dengan
nilai terkecil adalah mtry_5_trees_1000, yang sama dengan
model terbaik menurut RMSE, sehingga kesimpulan pemilihan model
konsisten pada ketiga ukuran kesalahan.
Gambar 4 memperlihatkan nilai \(R^2\) dengan model teratas
mtry_5_trees_1000 sebesar 0.8269 dan model terbawah
mtry_2_trees_200 sebesar 0.7735. Rentang \(R^2\) antarmodel hanya 0.0534, yang
menunjukkan bahwa kesembilan kombinasi parameter menghasilkan kemampuan
penjelasan variasi yang relatif berdekatan. Pada data testing yang sama,
\(R^2 = 1 - SSE/SST\) dengan SST yang
tetap, sehingga urutan model berdasarkan \(R^2\) identik dengan urutan berdasarkan
MSE.
Pengaruh mtry dapat dilihat dari rata-rata RMSE pada
setiap nilainya, yaitu 2.3232 untuk mtry = 2, 2.1301 untuk
mtry = 3, dan 2.0493 untuk mtry = 5, sehingga
rata-rata RMSE menurun seiring bertambahnya mtry. Penurunan
tersebut sejalan dengan struktur data Friedman yang hanya memuat lima
prediktor informatif di antara sepuluh prediktor. Pada mtry
= 2, peluang kedua kandidat pemisah pada suatu simpul sama-sama
prediktor tidak informatif adalah sekitar 22%, pada mtry =
3 sekitar 8%, dan pada mtry = 5 sekitar 0,4%, sehingga
mtry yang lebih besar lebih sering menyediakan prediktor
informatif sebagai kandidat pemisah (Breiman, 2001).
Pengaruh jumlah pohon dapat dilihat dari rata-rata RMSE sebesar 2.1799 pada 200 pohon, 2.1632 pada 500 pohon, dan 2.1595 pada 1000 pohon. Perubahan dari 200 ke 1000 pohon adalah penurunan sebesar 0.94%. Perubahan yang sangat kecil ini sejalan dengan sifat Random Forest, yaitu galat generalisasi cenderung konvergen ketika jumlah pohon bertambah (Breiman, 2001). Dengan demikian, penambahan pohon di atas 200 tidak banyak mengubah akurasi, sedangkan waktu komputasi terus meningkat, dan selisih kecil antarjumlah pohon dapat berasal dari variasi pengacakan.
Rentang rata-rata RMSE antarnilai mtry sebesar 0.2739
dibandingkan 0.0204 antarjumlah pohon. Pada data ini mtry
berpengaruh lebih besar terhadap performa dibandingkan jumlah pohon.
Kesimpulan tersebut berasal dari satu kali pembagian data dan satu nilai
seed sehingga perbedaan yang kecil sebaiknya tidak ditafsirkan
berlebihan.
OOB MSE merupakan ukuran kesalahan prediksi internal Random Forest. Pada setiap pohon, observasi yang tidak masuk ke sampel bootstrap digunakan untuk memperoleh prediksi OOB. Prediksi OOB dari pohon-pohon yang relevan kemudian digunakan untuk menghitung galat. Nilai OOB MSE yang lebih rendah menunjukkan kesalahan internal yang lebih kecil.
hasil_evaluasi %>%
select(Model, OOB_MSE, MSE) %>%
pivot_longer(
cols = c(OOB_MSE, MSE),
names_to = "Jenis_Evaluasi",
values_to = "Nilai"
) %>%
ggplot(aes(x = Model, y = Nilai, fill = Jenis_Evaluasi)) +
geom_col(position = "dodge") +
labs(
title = "Perbandingan OOB MSE dan MSE Testing",
x = "Model",
y = "Mean Squared Error",
fill = "Evaluasi"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Gambar 5. Perbandingan OOB MSE dan MSE testing
Gambar 5 membandingkan OOB MSE yang dihitung pada data training
dengan MSE yang dihitung pada data testing untuk setiap model. OOB MSE
berkisar dari 4.0102 pada model mtry_5_trees_1000 hingga
5.4169 pada model mtry_2_trees_200 (setara OOB RMSE 2.0026
hingga 2.3274), sedangkan MSE testing berkisar dari 4.1630 hingga
5.4468. Rata-rata OOB MSE seluruh model adalah 4.6325 dan rata-rata MSE
testing adalah 4.7115. OOB MSE lebih besar daripada MSE testing pada 0
dari 9 model. Selisih ini dapat terjadi karena kedua nilai dihitung dari
kumpulan observasi yang berbeda: OOB MSE dari 800 observasi training
dengan prediksi dari sebagian pohon, sedangkan MSE testing dari 200
observasi dengan prediksi dari seluruh pohon.
Korelasi peringkat Spearman antara OOB MSE dan MSE testing pada
sembilan model adalah 0.98, yang menunjukkan bahwa model dengan OOB MSE
rendah umumnya juga memiliki MSE testing rendah, sehingga OOB MSE cukup
andal sebagai petunjuk awal dalam membandingkan kombinasi parameter
tanpa memerlukan data validasi terpisah. Model dengan OOB MSE terendah
adalah mtry_5_trees_1000, yang sama dengan model terbaik
menurut RMSE testing, sehingga kedua pendekatan evaluasi memberikan
kesimpulan yang sama. Perbedaan kecil antarmodel pada kedua ukuran ini
juga dipengaruhi oleh variasi pengacakan bootstrap.
Residual merupakan selisih antara nilai aktual dan nilai prediksi. Residual dihitung sebagai \(e_i=y_i-\hat{y}_i\). Residual plot digunakan untuk melihat pola kesalahan prediksi. Model yang baik diharapkan memiliki residual yang menyebar di sekitar nol tanpa pola sistematis yang jelas.
hasil_residual <- data.frame(
Aktual = data_test$y,
Prediksi = prediksi_list[[model_terbaik$Model]]
) %>%
mutate(Residual = Aktual - Prediksi)ggplot(hasil_residual, aes(x = Prediksi, y = Residual)) +
geom_point(alpha = 0.65) +
geom_hline(yintercept = 0, linetype = "dashed") +
geom_smooth(method = "loess", se = FALSE) +
labs(
title = paste("Residual Plot", model_terbaik$Model),
x = "Nilai prediksi",
y = "Residual"
) +
theme_minimal()## `geom_smooth()` using formula = 'y ~ x'
Gambar 6. Residual plot model terbaik
Gambar 6 menampilkan residual model mtry_5_trees_1000
terhadap nilai prediksinya pada data testing. Residual memiliki
rata-rata -0.2652 dan simpangan baku 2.0281, dengan rentang dari -8.21
sampai 4.61. Rata-rata yang sangat dekat dengan nol menunjukkan bahwa
model tidak cenderung menaksir terlalu tinggi maupun terlalu rendah
secara keseluruhan. Sebanyak 67.0% residual berada dalam rentang ±2
satuan Y. Proporsi ini dapat dibandingkan dengan sekitar 95% yang
diharapkan apabila sisa galat hanya berupa galat acak bersimpangan baku
1; proporsi yang lebih rendah menandakan galat model masih melampaui
galat acak data.
Untuk memeriksa pola sistematis, observasi dibagi menjadi tiga kelompok nilai prediksi (rendah, sedang, dan tinggi). Rata-rata residual pada ketiga kelompok tersebut berturut-turut adalah -0.8387, -0.2340, dan 0.2776. Rata-rata residual pada ketiga kelompok relatif kecil dan tidak menunjukkan kecenderungan sistematis yang kuat, sehingga tidak tampak kegagalan model menangkap pola pada rentang prediksi tertentu. Korelasi antara nilai prediksi dan residual adalah 0.29, yang menunjukkan masih adanya hubungan linear antara besarnya prediksi dan arah kesalahan sehingga model belum sepenuhnya menangkap pola data. Korelasi antara nilai prediksi dan nilai absolut residual adalah -0.05, sehingga tidak terdapat indikasi kuat bahwa lebar sebaran residual berubah pada rentang prediksi yang berbeda (ragam galat relatif homogen).
Variable importance digunakan untuk mengetahui prediktor yang memberikan kontribusi relatif besar terhadap prediksi model. Pada praktikum ini digunakan permutation importance. Nilai kepentingan yang lebih tinggi menunjukkan bahwa pengacakan prediktor tersebut lebih banyak mengurangi kemampuan prediksi model.
importance_terbaik <- sort(
model_list[[model_terbaik$Model]]$variable.importance,
decreasing = TRUE
)
data_importance <- data.frame(
Variabel = names(importance_terbaik),
Importance = as.numeric(importance_terbaik)
)ggplot(data_importance,
aes(x = reorder(Variabel, Importance), y = Importance)) +
geom_col() +
coord_flip() +
labs(
title = "Variable Importance Random Forest",
x = "Variabel prediktor",
y = "Permutation importance"
) +
theme_minimal()Gambar 7. Variable importance model terbaik
Gambar 7 menampilkan permutation importance dari model
mtry_5_trees_1000. Tiga prediktor dengan nilai tertinggi
adalah x.4 (15.64), x.2 (10.77), dan x.1 (8.81). Dari lima prediktor
dengan importance tertinggi, 5 merupakan prediktor yang memang berperan
dalam persamaan pembangkit data (x.1 sampai x.5). Peringkat prediktor
informatif tersebut berturut-turut adalah x.1 pada peringkat 3, x.2 pada
peringkat 2, x.3 pada peringkat 5, x.4 pada peringkat 1, dan x.5 pada
peringkat 4.
Prediktor tidak informatif (x.6 sampai x.10) memiliki importance antara -0.01 dan 0.07, sedangkan prediktor informatif memiliki importance antara 1.43 dan 15.64. Seluruh prediktor informatif memiliki importance lebih tinggi daripada seluruh prediktor tidak informatif, sehingga model berhasil membedakan prediktor yang berkontribusi dari prediktor yang hanya berperan sebagai noise. Nilai permutation importance dapat mendekati nol atau sedikit negatif pada prediktor yang tidak berkontribusi karena pengacakan nilainya tidak menurunkan, atau hanya mengubah secara acak, kemampuan prediksi.
Perbedaan besar importance antarprediktor informatif sesuai dengan bentuk persamaan pembangkit data. Prediktor x.4 berperan melalui suku linear dengan koefisien 10 dan x.5 dengan koefisien 5, x.3 berperan melalui suku kuadratik 20(x3 − 0,5)², sedangkan x.1 dan x.2 berperan secara bersama melalui interaksi 10 sin(π·x1·x2), sehingga kontribusi masing-masing prediktor terpisah lebih sulit dibedakan. Hasil ini menunjukkan kontribusi prediktif dalam model, bukan hubungan sebab-akibat (Strobl dkk., 2007). Selain itu, importance di atas dihitung dari satu model terbaik sehingga urutan prediktor dengan nilai yang berdekatan dapat berubah apabila model dibangun ulang dengan pengacakan yang berbeda.
Berdasarkan evaluasi pada data testing, model dengan performa terbaik
berdasarkan RMSE adalah mtry_5_trees_1000. Model tersebut
menggunakan nilai mtry sebesar 5 dan
jumlah pohon sebanyak 1000. Model menghasilkan OOB MSE
sebesar 4.0102, MSE testing sebesar
4.1630, RMSE sebesar 2.0404, MAE
sebesar 1.6046, serta \(R^2\) sebesar 0.8269.
Sebagai pembanding, model dengan RMSE testing terbesar adalah
mtry_2_trees_200 dengan RMSE sebesar
2.3338.
Model terbaik ditentukan berdasarkan RMSE testing terkecil karena
ukuran tersebut menyatakan besarnya kesalahan prediksi dalam satuan yang
sama dengan respons. MSE dan MAE digunakan sebagai ukuran pendukung,
sedangkan \(R^2\) menunjukkan proporsi
variasi respons yang dapat dijelaskan model. OOB MSE memberikan
informasi tambahan mengenai kesalahan internal model. Dengan
mempertimbangkan seluruh ukuran tersebut, perbandingan sembilan
kombinasi parameter dapat memberikan gambaran mengenai pengaruh
mtry dan num.trees terhadap performa Random
Forest.
Pembahasan di atas dapat dikaitkan dengan rumusan masalah dan batasan analisis praktikum sebagai berikut.
ranger() pada data Friedman dengan sembilan kombinasi
mtry dan num.trees. Implementasi untuk
klasifikasi dan untuk Double Random Forest tidak termasuk dalam batasan
analisis komputasi sehingga tidak dijalankan pada praktikum ini.Perbandingan numerik antara Random Forest dan Double Random Forest tidak dilakukan karena Double Random Forest tidak diimplementasikan pada analisis ini. Perbandingan keduanya pada praktikum ini bersifat konseptual, yaitu pada mekanisme pengambilan sampel: satu sampel bootstrap per pohon pada Random Forest dan bootstrap pada setiap simpul pada Double Random Forest (Han dkk., 2020). Oleh karena itu, hasil numerik pada Bab IV hanya dapat digunakan untuk menilai performa Random Forest Regression pada sembilan kombinasi parameter, dan tidak dapat digunakan untuk menyimpulkan metode mana yang lebih unggul.
Berdasarkan praktikum Random Forest Regression pada data Friedman,
model dibangun menggunakan sembilan kombinasi parameter, yaitu
mtry sebesar 2, 3, dan 5 serta num.trees
sebesar 200, 500, dan 1000. Data dibagi menjadi 80% data training dan
20% data testing dengan menggunakan set.seed(234) agar
proses pembagian dapat direproduksi. Performa model dievaluasi
menggunakan MSE, RMSE, MAE, \(R^2\),
dan OOB MSE.
Model terbaik berdasarkan RMSE terkecil pada data testing adalah
mtry_5_trees_1000 dengan RMSE sebesar 2.0404, MAE sebesar
1.6046, dan \(R^2\) sebesar 0.8269,
yang berarti sekitar 82.7% variasi respons pada data testing dapat
dijelaskan oleh model. Rata-rata RMSE menurun seiring bertambahnya
mtry, dan perubahan jumlah pohon dari 200 ke 1000 mengubah
rata-rata RMSE sebesar 0.94%. OOB MSE digunakan sebagai evaluasi
internal yang melengkapi evaluasi data testing, dengan korelasi
peringkat Spearman terhadap MSE testing sebesar 0.98. Residual plot
memberikan gambaran mengenai pola kesalahan prediksi, sedangkan
variable importance menunjukkan bahwa 5 dari 5 prediktor dengan
importance tertinggi merupakan prediktor informatif pada data
Friedman.
Secara teori, Random Forest dan Double Random Forest memiliki mekanisme pembentukan pohon yang berbeda. Random Forest menggunakan sampel bootstrap pada pembentukan setiap pohon, sedangkan Double Random Forest menerapkan bootstrap pada setiap simpul ketika menentukan pemisahan. Praktikum komputasi ini dibatasi pada Random Forest Regression sesuai batasan analisis yang diberikan, sehingga hasil numerik yang diperoleh tidak dapat digunakan untuk menyimpulkan bahwa Random Forest lebih baik atau lebih buruk daripada Double Random Forest.
Breiman, L. (1996). Bagging predictors. Machine Learning, 24(2), 123–140. https://doi.org/10.1007/BF00058655
Breiman, L. (2001). Random forests. Machine Learning, 45(1), 5–32. https://doi.org/10.1023/A:1010933404324
Dietterich, T. G. (2000). Ensemble methods in machine learning. Dalam Multiple classifier systems (MCS 2000) (Lecture Notes in Computer Science, Vol. 1857, hlm. 1–15). Springer. https://doi.org/10.1007/3-540-45014-9_1
Friedman, J. H. (1991). Multivariate adaptive regression splines. The Annals of Statistics, 19(1), 1–67. https://doi.org/10.1214/aos/1176347963
Ganaie, M. A., Tanveer, M., Suganthan, P. N., & Snasel, V. (2022). Oblique and rotation double random forest. Neural Networks, 153, 496–517. https://doi.org/10.1016/j.neunet.2022.06.012
Han, S., Kim, H., & Lee, Y.-S. (2020). Double random forest. Machine Learning, 109, 1569–1586. https://doi.org/10.1007/s10994-020-05889-1
Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining, inference, and prediction (2nd ed.). Springer. https://doi.org/10.1007/978-0-387-84858-7
Hyndman, R. J., & Koehler, A. B. (2006). Another look at measures of forecast accuracy. International Journal of Forecasting, 22(4), 679–688. https://doi.org/10.1016/j.ijforecast.2006.03.001
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer. https://doi.org/10.1007/978-1-0716-1418-1
Leisch, F., & Dimitriadou, E. (2024). mlbench: Machine learning benchmark problems. R package documentation. https://CRAN.R-project.org/package=mlbench
Probst, P., Wright, M. N., & Boulesteix, A.-L. (2019). Hyperparameters and tuning strategies for random forest. WIREs Data Mining and Knowledge Discovery, 9(3), e1301. https://doi.org/10.1002/widm.1301
Smith, H. L., Biggs, P. J., French, N. P., Smith, A. N. H., & Marshall, J. C. (2024). Out of (the) bag—encoding categorical predictors impacts out-of-bag samples. PeerJ Computer Science, 10, e2445. https://doi.org/10.7717/peerj-cs.2445
Strobl, C., Boulesteix, A.-L., Zeileis, A., & Hothorn, T. (2007). Bias in random forest variable importance measures: Illustrations, sources and a solution. BMC Bioinformatics, 8, 25. https://doi.org/10.1186/1471-2105-8-25
Willmott, C. J., & Matsuura, K. (2005). Advantages of the mean absolute error (MAE) over the root mean square error (RMSE) in assessing average model performance. Climate Research, 30(1), 79–82. https://doi.org/10.3354/cr030079
Wright, M. N., & Ziegler, A. (2017). ranger: A fast implementation of random forests for high dimensional data in C++ and R. Journal of Statistical Software, 77(1), 1–17. https://doi.org/10.18637/jss.v077.i01