Regresi merupakan salah satu metode machine learning yang digunakan untuk memprediksi nilai numerik berdasarkan variabel prediktor. Dalam penerapannya, hubungan antara variabel prediktor dan variabel respons tidak selalu bersifat linier. Oleh karena itu, diperlukan metode yang mampu mempelajari hubungan nonlinier dan interaksi antarvariabel.
Random Forest merupakan metode ensemble learning berbasis decision tree yang membangun banyak pohon keputusan dan menggabungkan hasil prediksinya. Metode ini merupakan pengembangan dari Bootstrap Aggregating (Bagging) dengan menambahkan pengacakan pemilihan prediktor pada setiap node. Pengacakan tersebut bertujuan mengurangi korelasi antar-pohon sehingga dapat meningkatkan kemampuan generalisasi model.
Pada praktikum Pertemuan V, Random Forest Regression diterapkan pada
dataset Friedman untuk mempelajari hubungan antara sejumlah variabel
prediktor dan variabel respons numerik. Model dibangun dengan
membandingkan parameter mtry sebesar 2, 3, dan 5 serta
jumlah pohon sebanyak 200, 500, dan 1000.
Performa model dievaluasi menggunakan data testing berdasarkan Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Error (MAE), dan koefisien determinasi (\(R^2\)). Selain itu, analisis residual plot dan variable importance dilakukan untuk mendukung interpretasi hasil. Nilai Out-of-Bag Mean Squared Error (OOB MSE) juga digunakan sebagai evaluasi internal model.
ranger di R?mtry sebesar 2, 3, dan 5 serta jumlah pohon sebanyak 200,
500, dan 1000?ranger.mtry dan
jumlah pohon.Praktikum ini diharapkan dapat menambah pemahaman mengenai konsep dan penerapan Random Forest Regression, pengaruh parameter model terhadap performa prediksi, serta penggunaan metrik evaluasi regresi. Praktikum ini juga diharapkan membantu memahami fungsi OOB MSE, residual plot, dan variable importance dalam mengevaluasi model.
mlbench.X1 hingga X10.set.seed(234).ranger() dengan tipe
regresi.mtry yang digunakan adalah 2, 3, dan 5.Laporan ini terdiri atas lima bab utama. Bab I membahas pendahuluan, Bab II menjelaskan tinjauan pustaka, Bab III menjelaskan metode penelitian, Bab IV menyajikan hasil dan pembahasan, sedangkan Bab V berisi kesimpulan dan saran. Bagian akhir laporan dilengkapi daftar pustaka dan kode program.
Random Forest merupakan metode ensemble learning berbasis pohon keputusan yang dikembangkan dari konsep Bootstrap Aggregating atau Bagging. Bagging membangun banyak model menggunakan sampel bootstrap yang diambil dari data training dengan pengembalian. Prediksi akhir diperoleh dengan menggabungkan prediksi dari seluruh model.
Pada Random Forest, selain menggunakan bootstrap sampling, dilakukan pula pemilihan sejumlah prediktor secara acak pada setiap node ketika mencari pemisahan terbaik. Mekanisme ini membedakan Random Forest dari Bagging biasa, yang pada umumnya mempertimbangkan seluruh prediktor pada setiap pemisahan.
Tujuan pengacakan prediktor adalah mengurangi korelasi antar-pohon. Dengan menggabungkan banyak pohon yang memiliki keragaman, Random Forest dapat mengurangi variansi prediksi dan meningkatkan kemampuan generalisasi.
Pada regresi, prediksi akhir diperoleh melalui rata-rata prediksi dari seluruh pohon:
\[ \hat{f}_{RF}(x)= \frac{1}{B}\sum_{b=1}^{B}T_b(x) \]
dengan:
Proses pembentukan Random Forest Regression secara umum terdiri atas beberapa tahapan berikut.
mtry prediktor secara acak pada setiap
node.Random Forest termasuk metode parallel ensemble, karena setiap pohon dapat dibangun secara relatif independen. Hal ini berbeda dengan metode Boosting, yang membangun model secara berurutan dengan memperhatikan kesalahan model sebelumnya.
mtryParameter mtry menentukan banyaknya prediktor yang
dipilih secara acak untuk dipertimbangkan pada setiap node. Nilai
mtry memengaruhi struktur pohon, keragaman antar-pohon, dan
performa prediksi.
Pada praktikum ini, nilai mtry yang digunakan adalah 2,
3, dan 5. Ketiga nilai tersebut dibandingkan untuk mengetahui pengaruh
jumlah kandidat prediktor terhadap hasil prediksi.
num.treesParameter num.trees pada fungsi ranger()
menentukan jumlah pohon yang dibangun dalam ensemble. Semakin banyak
pohon yang digunakan, semakin banyak prediksi yang digabungkan untuk
menghasilkan prediksi akhir.
Pada praktikum ini, jumlah pohon ditetapkan sebesar 200, 500, dan 1000. Penambahan pohon dapat membantu menstabilkan prediksi, tetapi juga meningkatkan waktu komputasi.
min.node.sizeParameter min.node.size menentukan ukuran minimum node
terminal. Nilai parameter ini memengaruhi tingkat kompleksitas pohon dan
kemampuan model dalam menangkap pola data.
Pada praktikum ini, min.node.size ditetapkan sebesar 5
untuk seluruh model agar perbandingan berfokus pada pengaruh
mtry dan jumlah pohon.
importanceParameter importance digunakan untuk mengatur
perhitungan kepentingan variabel. Dalam praktikum ini digunakan nilai
"permutation" untuk memperoleh ukuran kepentingan
berdasarkan perubahan kesalahan prediksi ketika nilai suatu variabel
diacak.
Friedman No. 1 merupakan dataset simulasi yang digunakan untuk menguji kemampuan metode regresi dalam mempelajari hubungan nonlinier.
Dataset ini terdiri atas sepuluh variabel prediktor dan satu variabel respons. Lima prediktor pertama digunakan secara langsung dalam fungsi pembentuk respons, sedangkan lima prediktor lainnya berperan sebagai prediktor tambahan.
Hubungan respons pada Friedman No. 1 secara umum dapat dituliskan sebagai:
\[ \begin{aligned} Y={}&10\sin(\pi X_1X_2)\\ &+20(X_3-0.5)^2\\ &+10X_4+5X_5+\varepsilon \end{aligned} \]
dengan \(\varepsilon\) sebagai komponen galat acak. Hubungan tersebut bersifat nonlinier sehingga dapat digunakan untuk mengevaluasi kemampuan Random Forest dalam mempelajari pola prediksi yang kompleks.
Pada proses bootstrap, pengambilan sampel dilakukan dengan pengembalian. Akibatnya, sebagian observasi dapat terpilih lebih dari satu kali, sedangkan sebagian lainnya tidak terpilih dalam sampel bootstrap suatu pohon.
Secara rata-rata, proporsi observasi unik yang masuk ke dalam sampel bootstrap mendekati:
\[ 1-e^{-1}\approx 0.632 \]
Dengan demikian, sekitar 36,8% observasi tidak digunakan untuk membangun pohon tertentu. Observasi tersebut disebut Out-of-Bag (OOB).
Prediksi OOB diperoleh dengan menggabungkan prediksi dari pohon-pohon yang tidak menggunakan observasi terkait dalam proses pembentukan pohon. Pada regresi, OOB error dinyatakan sebagai Mean Squared Error (MSE).
OOB MSE dapat digunakan untuk menilai kesalahan prediksi internal Random Forest tanpa menyediakan data validasi tambahan. Namun, OOB MSE tidak sama dengan MSE pada data testing karena keduanya menggunakan mekanisme evaluasi yang berbeda.
MSE merupakan rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi.
\[ MSE=\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \]
MSE yang lebih kecil menunjukkan kesalahan kuadrat rata-rata yang lebih rendah. Karena menggunakan kuadrat residual, MSE memberikan penalti lebih besar terhadap kesalahan prediksi yang besar.
RMSE merupakan akar kuadrat dari MSE.
\[ RMSE=\sqrt{MSE} \]
RMSE memiliki satuan yang sama dengan variabel respons sehingga lebih mudah diinterpretasikan dalam konteks nilai prediksi. Nilai RMSE yang lebih kecil menunjukkan performa prediksi yang lebih baik.
MAE mengukur rata-rata nilai absolut selisih antara nilai aktual dan nilai prediksi.
\[ MAE=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat{y}_i| \]
Nilai MAE yang lebih kecil menunjukkan bahwa rata-rata besar kesalahan prediksi semakin rendah.
Koefisien determinasi mengukur kemampuan prediksi model dalam menjelaskan variasi nilai respons pada data evaluasi.
\[ R^2=1- \frac{\sum_{i=1}^{n}(y_i-\hat{y}_i)^2} {\sum_{i=1}^{n}(y_i-\bar{y})^2} \]
Nilai \(R^2\) yang mendekati 1 menunjukkan performa yang lebih baik. Nilai \(R^2\) dapat negatif apabila kesalahan model lebih besar daripada kesalahan ketika seluruh pengamatan diprediksi menggunakan rata-rata nilai aktual.
Residual merupakan selisih antara nilai aktual dan nilai prediksi:
\[ e_i=y_i-\hat{y}_i \]
Residual plot menggambarkan hubungan antara nilai prediksi dan residual. Grafik ini digunakan untuk melihat apakah kesalahan prediksi tersebar secara acak di sekitar nol atau menunjukkan pola tertentu.
Residual yang tersebar di sekitar nol tanpa pola sistematis umumnya menunjukkan bahwa model telah menangkap sebagian besar pola hubungan data. Sebaliknya, pola melengkung atau perubahan penyebaran residual dapat mengindikasikan adanya struktur hubungan yang belum tertangkap dengan baik.
Variable importance merupakan ukuran yang digunakan untuk menilai kontribusi relatif prediktor terhadap performa model.
Pada Random Forest dengan pengaturan "permutation",
nilai kepentingan variabel dihitung berdasarkan perubahan kesalahan
prediksi ketika nilai prediktor diacak. Variabel yang menyebabkan
peningkatan kesalahan prediksi lebih besar ketika diacak umumnya
dianggap lebih penting bagi model.
Hasil variable importance membantu mengidentifikasi prediktor yang berkontribusi terhadap prediksi. Namun, ukuran ini tidak membuktikan hubungan sebab-akibat dan dapat dipengaruhi oleh karakteristik data serta hubungan antarvariabel.
Data yang digunakan adalah dataset simulasi Friedman No. 1 yang
dibangkitkan melalui fungsi mlbench.friedman1() dari paket
mlbench pada R.
Sesuai dengan sintaks pada modul praktikum, jumlah pengamatan yang digunakan adalah 200. Dataset terdiri atas sepuluh variabel prediktor dan satu variabel respons numerik.
var_tab <- data.frame(
Variabel = c("Y", paste0("X", 1:10)),
Peran = c("Respons", rep("Prediktor", 10)),
Keterangan = c(
"Variabel numerik yang diprediksi",
"Prediktor utama dalam fungsi Friedman",
"Prediktor utama dalam fungsi Friedman",
"Prediktor utama dalam fungsi Friedman",
"Prediktor utama dalam fungsi Friedman",
"Prediktor utama dalam fungsi Friedman",
rep("Prediktor tambahan", 5)
)
)
knitr::kable(
var_tab,
caption = "Tabel 3.1 Variabel penelitian"
)
| Variabel | Peran | Keterangan |
|---|---|---|
| Y | Respons | Variabel numerik yang diprediksi |
| X1 | Prediktor | Prediktor utama dalam fungsi Friedman |
| X2 | Prediktor | Prediktor utama dalam fungsi Friedman |
| X3 | Prediktor | Prediktor utama dalam fungsi Friedman |
| X4 | Prediktor | Prediktor utama dalam fungsi Friedman |
| X5 | Prediktor | Prediktor utama dalam fungsi Friedman |
| X6 | Prediktor | Prediktor tambahan |
| X7 | Prediktor | Prediktor tambahan |
| X8 | Prediktor | Prediktor tambahan |
| X9 | Prediktor | Prediktor tambahan |
| X10 | Prediktor | Prediktor tambahan |
Penelitian membandingkan sembilan kombinasi parameter Random Forest Regression sebagai berikut.
rancangan <- expand.grid(
mtry = c(2, 3, 5),
num.trees = c(200, 500, 1000)
)
rancangan <- rancangan[
order(rancangan$mtry, rancangan$num.trees),
]
rownames(rancangan) <- NULL
rancangan$Model <- paste0(
"RF_mtry", rancangan$mtry,
"_trees", rancangan$num.trees
)
knitr::kable(
rancangan[, c("Model", "mtry", "num.trees")],
caption = "Tabel 3.2 Rancangan sembilan model Random Forest"
)
| Model | mtry | num.trees |
|---|---|---|
| RF_mtry2_trees200 | 2 | 200 |
| RF_mtry2_trees500 | 2 | 500 |
| RF_mtry2_trees1000 | 2 | 1000 |
| RF_mtry3_trees200 | 3 | 200 |
| RF_mtry3_trees500 | 3 | 500 |
| RF_mtry3_trees1000 | 3 | 1000 |
| RF_mtry5_trees200 | 5 | 200 |
| RF_mtry5_trees500 | 5 | 500 |
| RF_mtry5_trees1000 | 5 | 1000 |
Tahapan analisis yang dilakukan adalah:
Gambar 3.1. Diagram alir penelitian Random Forest Regression.
set.seed(234)
data_friedman <- mlbench::mlbench.friedman1(200)
data_analisis <- as.data.frame(data_friedman$x)
names(data_analisis) <- paste0("X", 1:10)
data_analisis$Y <- as.numeric(data_friedman$y)
cat("Jumlah pengamatan:", nrow(data_analisis), "\n")
## Jumlah pengamatan: 200
cat("Jumlah prediktor:", ncol(data_analisis) - 1, "\n")
## Jumlah prediktor: 10
cat("Jumlah variabel keseluruhan:", ncol(data_analisis), "\n")
## Jumlah variabel keseluruhan: 11
str(data_analisis)
## 'data.frame': 200 obs. of 11 variables:
## $ X1 : num 0.7456 0.7817 0.02 0.7761 0.0669 ...
## $ X2 : num 0.575 0.316 0.765 0.229 0.172 ...
## $ X3 : num 0.0289 0.9375 0.7978 0.668 0.5974 ...
## $ X4 : num 0.72 0.185 0.534 0.553 0.755 ...
## $ X5 : num 0.875 0.704 0.952 0.478 0.533 ...
## $ X6 : num 0.276 0.643 0.987 0.843 0.733 ...
## $ X7 : num 0.9332 0.4018 0.0874 0.893 0.1024 ...
## $ X8 : num 0.60746 0.00369 0.0106 0.44639 0.83494 ...
## $ X9 : num 0.756 0.405 0.247 0.144 0.187 ...
## $ X10: num 0.718 0.534 0.667 0.68 0.595 ...
## $ Y : num 24.35 18.05 12.02 12.1 9.91 ...
Dataset yang digunakan memiliki 200 pengamatan, 10 variabel prediktor, dan satu variabel respons numerik. Dataset ini digunakan untuk mengevaluasi kemampuan Random Forest dalam mempelajari hubungan nonlinier.
knitr::kable(
head(data_analisis, 6),
caption = "Tabel 4.1 Enam pengamatan pertama dataset Friedman"
)
| X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | Y |
|---|---|---|---|---|---|---|---|---|---|---|
| 0.7456200 | 0.5754994 | 0.0288559 | 0.7201653 | 0.8748022 | 0.2761835 | 0.9331909 | 0.6074629 | 0.7560942 | 0.7179672 | 24.349507 |
| 0.7817124 | 0.3157821 | 0.9374539 | 0.1849746 | 0.7039934 | 0.6426889 | 0.4017780 | 0.0036875 | 0.4046106 | 0.5338439 | 18.046792 |
| 0.0200371 | 0.7646459 | 0.7977729 | 0.5338609 | 0.9515834 | 0.9873938 | 0.0874300 | 0.0105981 | 0.2473974 | 0.6669937 | 12.018651 |
| 0.7760854 | 0.2289793 | 0.6679795 | 0.5534984 | 0.4780999 | 0.8425175 | 0.8930220 | 0.4463931 | 0.1443539 | 0.6802987 | 12.101870 |
| 0.0669101 | 0.1715219 | 0.5974095 | 0.7547957 | 0.5332404 | 0.7327976 | 0.1024456 | 0.8349360 | 0.1874371 | 0.5950115 | 9.911772 |
| 0.6447951 | 0.6473963 | 0.0135133 | 0.7894812 | 0.2376348 | 0.4302338 | 0.8823674 | 0.8435092 | 0.6166422 | 0.1081932 | 21.874286 |
knitr::kable(
data.frame(
Statistik = c("Minimum", "Kuartil 1", "Median",
"Rata-rata", "Kuartil 3", "Maksimum"),
Nilai_Y = c(
min(data_analisis$Y),
unname(quantile(data_analisis$Y, 0.25)),
median(data_analisis$Y),
mean(data_analisis$Y),
unname(quantile(data_analisis$Y, 0.75)),
max(data_analisis$Y)
)
),
digits = 4,
caption = "Tabel 4.2 Ringkasan statistik variabel respons"
)
| Statistik | Nilai_Y |
|---|---|
| Minimum | 3.0821 |
| Kuartil 1 | 10.5935 |
| Median | 13.8105 |
| Rata-rata | 14.2697 |
| Kuartil 3 | 18.0632 |
| Maksimum | 26.1458 |
Data dibagi menjadi 70% data training dan 30% data testing. Pembagian
dilakukan secara acak dengan set.seed(234) agar dapat
direproduksi.
set.seed(234)
n_total <- nrow(data_analisis)
idx_train <- sample(
seq_len(n_total),
size = floor(0.70 * n_total)
)
data_train <- data_analisis[idx_train, , drop = FALSE]
data_test <- data_analisis[-idx_train, , drop = FALSE]
ringkasan_pembagian <- data.frame(
Data = c("Keseluruhan", "Training", "Testing"),
Jumlah = c(
nrow(data_analisis),
nrow(data_train),
nrow(data_test)
),
Persentase = c(
100,
100 * nrow(data_train) / n_total,
100 * nrow(data_test) / n_total
)
)
knitr::kable(
ringkasan_pembagian,
digits = 2,
caption = "Tabel 4.3 Pembagian data training dan testing"
)
| Data | Jumlah | Persentase |
|---|---|---|
| Keseluruhan | 200 | 100 |
| Training | 140 | 70 |
| Testing | 60 | 30 |
Data training digunakan untuk membangun model Random Forest, sedangkan data testing digunakan untuk mengevaluasi performa prediksi pada pengamatan yang tidak digunakan dalam pelatihan.
Sembilan model dibangun menggunakan kombinasi mtry
sebesar 2, 3, dan 5 serta jumlah pohon sebesar 200, 500, dan 1000.
Parameter jumlah pohon dituliskan sebagai num.trees sesuai
fungsi ranger().
Parameter min.node.size ditetapkan sebesar 5 dan
importance menggunakan metode "permutation".
Seluruh model menggunakan data training yang sama agar perbandingan
lebih terarah.
nilai_mtry <- c(2, 3, 5)
nilai_trees <- c(200, 500, 1000)
model_list <- list()
prediksi_list <- list()
residual_list <- list()
hasil_model <- list()
for (m in nilai_mtry) {
for (nt in nilai_trees) {
nama_model <- paste0(
"RF_mtry", m,
"_trees", nt
)
set.seed(234)
model <- ranger::ranger(
formula = Y ~ .,
data = data_train,
num.trees = nt,
mtry = m,
min.node.size = 5,
replace = TRUE,
sample.fraction = 1,
importance = "permutation",
seed = 234
)
prediksi <- predict(
model,
data = data_test
)$predictions
aktual <- data_test$Y
residual <- aktual - prediksi
mse <- mean(residual^2)
rmse <- sqrt(mse)
mae <- mean(abs(residual))
r2 <- 1 -
sum(residual^2) /
sum((aktual - mean(aktual))^2)
# Pada ranger untuk regresi, prediction.error
# merupakan estimasi OOB MSE.
oob_mse <- model$prediction.error
model_list[[nama_model]] <- model
prediksi_list[[nama_model]] <- prediksi
residual_list[[nama_model]] <- residual
hasil_model[[nama_model]] <- data.frame(
Model = nama_model,
mtry = m,
num.trees = nt,
OOB_MSE = oob_mse,
MSE = mse,
RMSE = rmse,
MAE = mae,
R2 = r2
)
}
}
tabel_hasil <- do.call(rbind, hasil_model)
rownames(tabel_hasil) <- NULL
tabel_hasil <- tabel_hasil[
order(tabel_hasil$mtry, tabel_hasil$num.trees),
]
tabel_hasil_tampil <- tabel_hasil
kolom_metrik <- c(
"OOB_MSE", "MSE", "RMSE", "MAE", "R2"
)
tabel_hasil_tampil[kolom_metrik] <- lapply(
tabel_hasil_tampil[kolom_metrik],
fmt
)
knitr::kable(
tabel_hasil_tampil,
caption = "Tabel 4.4 Hasil evaluasi sembilan model Random Forest"
)
| Model | mtry | num.trees | OOB_MSE | MSE | RMSE | MAE | R2 |
|---|---|---|---|---|---|---|---|
| RF_mtry2_trees200 | 2 | 200 | 8.8009 | 7.9691 | 2.8230 | 2.2390 | 0.6524 |
| RF_mtry2_trees500 | 2 | 500 | 8.3630 | 8.0263 | 2.8331 | 2.2475 | 0.6499 |
| RF_mtry2_trees1000 | 2 | 1000 | 8.2434 | 7.8975 | 2.8102 | 2.2456 | 0.6556 |
| RF_mtry3_trees200 | 3 | 200 | 7.4579 | 7.4211 | 2.7242 | 2.1780 | 0.6763 |
| RF_mtry3_trees500 | 3 | 500 | 7.2766 | 7.2625 | 2.6949 | 2.1746 | 0.6833 |
| RF_mtry3_trees1000 | 3 | 1000 | 7.2317 | 7.2026 | 2.6838 | 2.1597 | 0.6859 |
| RF_mtry5_trees200 | 5 | 200 | 6.6030 | 7.0778 | 2.6604 | 2.1505 | 0.6913 |
| RF_mtry5_trees500 | 5 | 500 | 6.5659 | 7.3454 | 2.7102 | 2.1681 | 0.6796 |
| RF_mtry5_trees1000 | 5 | 1000 | 6.5798 | 7.2505 | 2.6927 | 2.1575 | 0.6838 |
Tabel 4.4 menunjukkan perbandingan OOB MSE dan metrik evaluasi pada data testing. MSE, RMSE, dan MAE yang lebih kecil menunjukkan kesalahan prediksi yang lebih rendah, sedangkan \(R^2\) yang lebih besar umumnya menunjukkan kemampuan prediksi yang lebih baik.
OOB MSE dihitung secara internal oleh ranger(). Nilai
tersebut berbeda dari MSE testing karena OOB MSE menggunakan prediksi
observasi yang tidak digunakan pada pembentukan pohon terkait, sedangkan
MSE testing menggunakan data testing yang terpisah.
data_plot <- rbind(
data.frame(
Model = tabel_hasil$Model,
mtry = factor(tabel_hasil$mtry),
num.trees = factor(tabel_hasil$num.trees),
Metrik = "MSE",
Nilai = tabel_hasil$MSE
),
data.frame(
Model = tabel_hasil$Model,
mtry = factor(tabel_hasil$mtry),
num.trees = factor(tabel_hasil$num.trees),
Metrik = "RMSE",
Nilai = tabel_hasil$RMSE
),
data.frame(
Model = tabel_hasil$Model,
mtry = factor(tabel_hasil$mtry),
num.trees = factor(tabel_hasil$num.trees),
Metrik = "MAE",
Nilai = tabel_hasil$MAE
),
data.frame(
Model = tabel_hasil$Model,
mtry = factor(tabel_hasil$mtry),
num.trees = factor(tabel_hasil$num.trees),
Metrik = "R2",
Nilai = tabel_hasil$R2
)
)
ggplot(
data_plot,
aes(
x = num.trees,
y = Nilai,
group = mtry,
color = mtry
)
) +
geom_line(linewidth = 0.8) +
geom_point(size = 2.5) +
facet_wrap(~ Metrik, scales = "free_y") +
labs(
title = "Perbandingan Metrik Testing Random Forest",
x = "Jumlah pohon (num.trees)",
y = "Nilai metrik",
color = "mtry"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
face = "bold",
hjust = 0.5
),
legend.position = "bottom"
)
Gambar 4.1. Perbandingan MSE, RMSE, MAE, dan \(R^2\) berdasarkan mtry dan
jumlah pohon.
Grafik digunakan untuk mengamati perubahan performa ketika jumlah
pohon meningkat dari 200 menjadi 500 dan 1000. Perbedaan garis
menunjukkan bagaimana pengaturan mtry berhubungan dengan
kesalahan prediksi pada jumlah pohon yang berbeda.
ggplot(
tabel_hasil,
aes(
x = num.trees,
y = OOB_MSE,
color = factor(mtry),
group = factor(mtry)
)
) +
geom_line(linewidth = 0.8) +
geom_point(size = 2.5) +
labs(
title = "Perbandingan OOB MSE",
x = "Jumlah pohon (num.trees)",
y = "OOB MSE",
color = "mtry"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
face = "bold",
hjust = 0.5
),
legend.position = "bottom"
)
Gambar 4.2. Perbandingan OOB MSE pada sembilan model Random Forest.
OOB MSE merupakan ukuran kesalahan internal model yang dihitung berdasarkan pengamatan out-of-bag. Nilai yang lebih kecil menunjukkan estimasi kesalahan internal yang lebih rendah. Namun, OOB MSE tidak menggantikan evaluasi data testing karena kedua ukuran tersebut berasal dari mekanisme evaluasi yang berbeda.
Model terbaik ditentukan berdasarkan RMSE testing terendah. Apabila terdapat nilai RMSE yang sama, MSE yang lebih rendah digunakan sebagai kriteria pembanding. Nilai \(R^2\) yang lebih tinggi menjadi pembanding berikutnya.
peringkat <- tabel_hasil[
order(
tabel_hasil$RMSE,
tabel_hasil$MSE,
-tabel_hasil$R2
),
]
rownames(peringkat) <- NULL
peringkat_tampil <- peringkat
peringkat_tampil[kolom_metrik] <- lapply(
peringkat_tampil[kolom_metrik],
fmt
)
knitr::kable(
peringkat_tampil,
caption = "Tabel 4.5 Peringkat model berdasarkan RMSE testing"
)
| Model | mtry | num.trees | OOB_MSE | MSE | RMSE | MAE | R2 |
|---|---|---|---|---|---|---|---|
| RF_mtry5_trees200 | 5 | 200 | 6.6030 | 7.0778 | 2.6604 | 2.1505 | 0.6913 |
| RF_mtry3_trees1000 | 3 | 1000 | 7.2317 | 7.2026 | 2.6838 | 2.1597 | 0.6859 |
| RF_mtry5_trees1000 | 5 | 1000 | 6.5798 | 7.2505 | 2.6927 | 2.1575 | 0.6838 |
| RF_mtry3_trees500 | 3 | 500 | 7.2766 | 7.2625 | 2.6949 | 2.1746 | 0.6833 |
| RF_mtry5_trees500 | 5 | 500 | 6.5659 | 7.3454 | 2.7102 | 2.1681 | 0.6796 |
| RF_mtry3_trees200 | 3 | 200 | 7.4579 | 7.4211 | 2.7242 | 2.1780 | 0.6763 |
| RF_mtry2_trees1000 | 2 | 1000 | 8.2434 | 7.8975 | 2.8102 | 2.2456 | 0.6556 |
| RF_mtry2_trees200 | 2 | 200 | 8.8009 | 7.9691 | 2.8230 | 2.2390 | 0.6524 |
| RF_mtry2_trees500 | 2 | 500 | 8.3630 | 8.0263 | 2.8331 | 2.2475 | 0.6499 |
model_terbaik_nama <- peringkat$Model[1]
model_terbaik <- model_list[[model_terbaik_nama]]
cat(
"\nModel terbaik:", model_terbaik_nama,
"\nRMSE testing:", round(peringkat$RMSE[1], 4),
"\nMSE testing:", round(peringkat$MSE[1], 4),
"\nMAE testing:", round(peringkat$MAE[1], 4),
"\nR2 testing:", round(peringkat$R2[1], 4),
"\nOOB MSE:", round(peringkat$OOB_MSE[1], 4),
"\n"
)
##
## Model terbaik: RF_mtry5_trees200
## RMSE testing: 2.6604
## MSE testing: 7.0778
## MAE testing: 2.1505
## R2 testing: 0.6913
## OOB MSE: 6.603
Berdasarkan aturan evaluasi yang telah ditetapkan, model pada peringkat pertama merupakan model dengan RMSE testing terendah. Hasil tersebut menunjukkan bahwa model memiliki akar kesalahan kuadrat rata-rata paling kecil pada pembagian data yang digunakan.
Meskipun demikian, RMSE perlu diinterpretasikan bersama MSE, MAE, dan \(R^2\). Model dengan RMSE terendah belum tentu menghasilkan MAE terendah atau \(R^2\) tertinggi.
Residual plot digunakan untuk memeriksa pola kesalahan prediksi pada model terbaik. Residual didefinisikan sebagai nilai aktual dikurangi nilai prediksi.
data_residual <- data.frame(
Aktual = data_test$Y,
Prediksi = prediksi_list[[model_terbaik_nama]],
Residual = residual_list[[model_terbaik_nama]]
)
ggplot(
data_residual,
aes(
x = Prediksi,
y = Residual
)
) +
geom_point(alpha = 0.75) +
geom_hline(
yintercept = 0,
linetype = "dashed",
color = "#CB4335"
) +
geom_smooth(
method = "loess",
se = FALSE,
color = "#2874A6"
) +
labs(
title = paste(
"Residual Plot Model Terbaik:",
model_terbaik_nama
),
x = "Nilai prediksi",
y = "Residual (aktual - prediksi)"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
face = "bold",
hjust = 0.5
)
)
Gambar 4.3. Residual plot model terbaik pada data testing.
Residual yang tersebar di sekitar garis nol tanpa pola sistematis umumnya menunjukkan bahwa model telah menangkap sebagian besar struktur hubungan data. Sebaliknya, pola melengkung atau perubahan penyebaran residual dapat mengindikasikan adanya pola yang belum tertangkap dengan baik.
Interpretasi akhir dilakukan berdasarkan pola yang benar-benar terlihat pada grafik hasil pemodelan.
Analisis variable importance dilakukan menggunakan model terbaik. Metode permutation importance digunakan untuk mengukur perubahan kesalahan prediksi ketika nilai prediktor diacak.
importance_tab <- data.frame(
Variabel = names(model_terbaik$variable.importance),
Importance = as.numeric(
model_terbaik$variable.importance
)
)
importance_tab <- importance_tab[
order(
importance_tab$Importance,
decreasing = TRUE
),
]
rownames(importance_tab) <- NULL
knitr::kable(
transform(
importance_tab,
Importance = round(Importance, 4)
),
caption = paste(
"Tabel 4.6 Variable importance model",
model_terbaik_nama
)
)
| Variabel | Importance |
|---|---|
| X4 | 11.8326 |
| X1 | 10.2982 |
| X2 | 4.5789 |
| X3 | 1.9682 |
| X5 | 0.4796 |
| X9 | 0.1334 |
| X10 | 0.0709 |
| X6 | 0.0607 |
| X7 | 0.0489 |
| X8 | 0.0466 |
ggplot(
importance_tab,
aes(
x = reorder(Variabel, Importance),
y = Importance
)
) +
geom_col(
fill = "#2E86C1",
width = 0.7
) +
coord_flip() +
labs(
title = paste(
"Variable Importance:",
model_terbaik_nama
),
x = "Variabel prediktor",
y = "Permutation importance"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(
face = "bold",
hjust = 0.5
)
)
Gambar 4.4. Tingkat kepentingan variabel pada model terbaik.
Variabel dengan nilai permutation importance lebih besar menunjukkan kontribusi prediktif yang lebih tinggi berdasarkan ukuran yang digunakan. Pada dataset Friedman, lima prediktor pertama secara teoritis memengaruhi pembentukan respons.
Hasil analisis dapat digunakan untuk memeriksa apakah model memberikan tingkat kepentingan relatif yang sejalan dengan karakteristik data. Namun, ukuran kepentingan variabel tidak membuktikan hubungan sebab-akibat.
terbaik <- peringkat[1, ]
cat(
"**Model terbaik berdasarkan RMSE testing:** ",
terbaik$Model, ".\n\n",
sep = ""
)
Model terbaik berdasarkan RMSE testing: RF_mtry5_trees200.
cat(
"- **MSE testing:** ", round(terbaik$MSE, 4), "\n",
"- **RMSE testing:** ", round(terbaik$RMSE, 4), "\n",
"- **MAE testing:** ", round(terbaik$MAE, 4), "\n",
"- **R-squared testing:** ", round(terbaik$R2, 4), "\n",
"- **OOB MSE:** ", round(terbaik$OOB_MSE, 4), "\n\n",
sep = ""
)
cat(
"Hasil tersebut menggambarkan performa model terbaik pada satu ",
"pembagian data training dan testing. Metrik evaluasi perlu ",
"diinterpretasikan bersama-sama, sedangkan residual plot dan ",
"variable importance digunakan untuk melengkapi evaluasi numerik.\n",
sep = ""
)
Hasil tersebut menggambarkan performa model terbaik pada satu pembagian data training dan testing. Metrik evaluasi perlu diinterpretasikan bersama-sama, sedangkan residual plot dan variable importance digunakan untuk melengkapi evaluasi numerik.
Perbandingan sembilan model menunjukkan bagaimana pengaturan
mtry dan jumlah pohon berkaitan dengan performa prediksi.
Nilai mtry memengaruhi keragaman pohon yang dibangun,
sedangkan jumlah pohon memengaruhi banyaknya prediksi yang
digabungkan.
OOB MSE memberikan gambaran kesalahan internal model, sedangkan MSE, RMSE, MAE, dan \(R^2\) pada data testing memberikan gambaran performa terhadap pengamatan yang tidak digunakan dalam pelatihan.
Residual plot digunakan untuk melengkapi evaluasi dengan memperlihatkan pola kesalahan prediksi. Sementara itu, variable importance memberikan informasi mengenai kontribusi relatif variabel prediktor pada model terbaik.
Kesimpulan numerik harus mengikuti hasil aktual pada tabel dan grafik. Model yang terbaik pada satu pembagian data belum tentu selalu terbaik apabila pembagian data berubah.
Random Forest Regression diterapkan pada dataset Friedman No. 1
dengan 200 pengamatan dan 10 variabel prediktor. Data dibagi menjadi 70%
data training dan 30% data testing, kemudian digunakan untuk membangun
sembilan kombinasi model dengan mtry sebesar 2, 3, dan 5
serta jumlah pohon sebanyak 200, 500, dan 1000.
Evaluasi performa dilakukan menggunakan MSE, RMSE, MAE, dan \(R^2\) pada data testing. OOB MSE digunakan sebagai evaluasi internal model, sedangkan residual plot dan variable importance digunakan untuk melengkapi interpretasi hasil.
Model terbaik ditentukan berdasarkan RMSE testing terendah. Nama model dan hasil evaluasinya ditampilkan pada Tabel 4.5. Kesimpulan akhir mengenai kombinasi parameter terbaik mengikuti hasil komputasi aktual yang diperoleh ketika dokumen dijalankan.
Penelitian berikutnya dapat menggunakan validasi silang atau beberapa
pengulangan pembagian data untuk menilai kestabilan performa model.
Rentang nilai mtry, jumlah pohon, dan
min.node.size juga dapat diperluas untuk mengeksplorasi
kombinasi parameter lainnya.
Perbandingan dengan metode regresi lain juga dapat dilakukan untuk mengetahui performa relatif Random Forest. Selain itu, analisis residual dan variable importance dapat digunakan bersama evaluasi numerik agar pemilihan model tidak hanya didasarkan pada satu metrik.
Breiman, L. (2001). Random forests. Machine Learning, 45, 5–32.
Friedman, J. H. (1991). Multivariate adaptive regression splines. The Annals of Statistics, 19(1), 1–67.
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer.
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.
R Core Team. (2026). R: A language and environment for statistical computing. R Foundation for Statistical Computing.
Kode program tersedia pada setiap bagian kode dalam laporan ini. Jalankan dokumen menggunakan tombol Knit di RStudio untuk menghasilkan laporan HTML yang memuat tabel data, rancangan model, hasil evaluasi, grafik perbandingan metrik, OOB MSE, residual plot, dan variable importance berdasarkan hasil perhitungan aktual.