Regresi neural network adalah metode pembelajaran mesin yang menggunakan jaringan saraf untuk memodelkan hubungan antara variabel input dan output yang bersifat kontinu.1.
Dalam regresi, model ini bertujuan untuk memprediksi nilai output (seperti pendapatan atau suhu) berdasarkan sejumlah fitur atau variabel input. Jaringan saraf ini terdiri dari lapisan-lapisan neuron yang saling terhubung, dimana setiap neuron memproses informasi dan menghasilkan output yang diteruskan ke neuron lainnya hingga mencapai output akhir.
Pada umumnya, jaringan saraf terdiri dari tiga jenis lapisan: lapisan input, lapisan tersembunyi (hidden layers), dan lapisan output. Setiap lapisan terdiri atas satu atau beberapa unit neuron yang mempunyai sebuah fungsi aktivasi yang menentukan keluaran dari unit tersebut. Bisa dilakukan penambahan hidden layers untuk menambah kemampuan dari neural network tersebut.
Keunggulan regresi neural network dibandingkan dengan regresi linier atau metode tradisional lainnya adalah kemampuannya dalam menangani hubungan yang lebih kompleks dan non-linier antara variabel input dan output. Dengan pelatihan yang tepat menggunakan algoritma backpropagation, jaringan saraf dapat menyesuaikan bobot dan biasnya untuk mengoptimalkan prediksi. Hal ini membuatnya sangat berguna untuk masalah regresi dengan data yang sangat besar dan memiliki hubungan yang tidak dapat diprediksi dengan model linier sederhana.2
Untuk mengukur performa model neural network digunakan dua ukuran yaitu Root Mean Square Error (RMSE) dan Mean Absolute Error (MAE). Nilai RMSE terendah menunjukkan hasil akurasi yang terbaik. Formula RMSE dan MAE dirumuskan sebagai berikut:
RMSE (Root Mean Squared Error) mengukur akar dari rata-rata kuadrat selisih antara nilai aktual dan nilai prediksi. Rumusnya adalah: \[ RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} \] Dimana \(y_i\) adalah nilai aktual dan \(\hat{y}_i\) adalah nilai prediksi.
MAE (Mean Absolute Error) mengukur rata-rata dari selisih absolut antara nilai aktual dan nilai prediksi. Rumusnya adalah: \[ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| \] Dimana \(y_i\) adalah nilai aktual dan \(\hat{y}_i\) adalah nilai prediksi.
library(tensorflow)
library(keras)
library(reticulate)
library(caret)
library(tidyverse)
library(knitr)
library(ggplot2)
library(tidyr)
library(e1071)
library(ROCR)
library(rpart)
library(UBL)
library(neuralnet)
library(NeuralNetTools)
library(reticulate)
library(readr)
Load Data
## 'data.frame': 100 obs. of 5 variables:
## $ besar.pinjaman : num 224 122 107 188 230 ...
## $ lama.pembayaran : int 14 9 14 3 10 4 17 4 14 20 ...
## $ pembayaran.per.bulan: num 1.84 1.48 1.12 2.11 1.46 ...
## $ bunga : num 1.412 0.795 1.593 1.158 1.621 ...
## $ rating : int 4 10 6 1 8 1 8 7 9 8 ...
## besar.pinjaman lama.pembayaran pembayaran.per.bulan bunga
## Min. : 54.03 Min. : 3.00 Min. :1.009 Min. :-0.8721
## 1st Qu.:129.60 1st Qu.: 7.00 1st Qu.:1.534 1st Qu.: 1.0196
## Median :176.53 Median :12.00 Median :1.961 Median : 1.8880
## Mean :175.36 Mean :11.88 Mean :1.995 Mean : 1.8929
## 3rd Qu.:222.94 3rd Qu.:17.00 3rd Qu.:2.441 3rd Qu.: 2.8367
## Max. :298.84 Max. :20.00 Max. :2.982 Max. : 4.4655
## rating
## Min. : 1.00
## 1st Qu.: 3.00
## Median : 5.00
## Mean : 5.18
## 3rd Qu.: 7.25
## Max. :10.00
Pengecekan Missing Value
Pengecekan data missing sangat penting dalam analisis data dan pemodelan karena dapat mempengaruhi kualitas hasil analisis dan prediksi. Melalui pengecekan dan penanganan data missing, dapat dipastikan model yang dibangun lebih robust dan hasil analisis lebih andal, mengurangi potensi kesalahan dan bias yang muncul akibat data yang hilang.
dev.off()
## null device
## 1
library(DataExplorer)
plot_intro(data = data)
Dari grafik di atas terlihat tidak ada missing value pada data sehingga tidak perlu penanganan data hilang. Seluruh kolom atau variabel bertipe kontinu serta baris atau cases semua lengkap.
Hubungan antar Variabel
library(GGally)
library(ggplot2)
ggpairs(data, columns = 1:5)
Distribusi Variabel
par(mfrow = c(2, 3))
boxplot(data$besar.pinjaman, horizontal = T,
main = "Besar Pinjaman", col="darkred")
boxplot(data$lama.pembayaran, horizontal = T,
main = "Lama Pembayaran", col="red")
boxplot(data$pembayaran.per.bulan, horizontal = T,
main="Pembayaran per Bulan", col="skyblue")
boxplot(data$bunga, horizontal = T,
main="Bunga Pinjaman", col = "pink")
boxplot(data$rating, horizontal = T,
main="Rating", col="yellow")
Penjelasan Variabel:
Besar Pinjaman: Besar uang yang dipinjam (dalam juta).
Lama Pembayaran: Durasi pinjaman dalam tahun.
Pembayaran per Bulan: Jumlah uang yang dibayar tiap bulan untuk pelunasan pinjaman (dalam juta).
Bunga (%): Tingkat bunga yang diterapkan pada pinjaman.
Rating Peminjam: Penilaian dari lembaga keuangan terhadap peminjam, diukur dengan angka dari 1 (terendah) hingga 10 (tertinggi).
Rating peminjam adalah penilaian atau skor yang diberikan oleh lembaga keuangan atau pemberi pinjaman untuk menggambarkan seberapa besar risiko yang terkait dengan peminjam tersebut. Rating ini digunakan untuk menilai kemampuan dan niat peminjam untuk melunasi pinjaman mereka. Biasanya, rating peminjam berkisar dari nilai terendah (misalnya, 1) hingga nilai tertinggi (misalnya, 10), dengan rating yang lebih tinggi menunjukkan peminjam yang lebih aman dan lebih dapat diandalkan, sementara rating yang lebih rendah menunjukkan peminjam yang berisiko lebih tinggi.
Scaling Data
Neural network sering kali lebih efektif jika dilakukan pada data yang telah dinormalisasi atau diskalakan (misalnya, menggunakan Min-Max Scaling atau Z-Score Scaling). Hal ini karena model neural network sangat sensitif terhadap skala input. Tanpa normalisasi, variabel dengan skala yang lebih besar akan mendominasi model.3
Variabel seperti bunga, pembayaran per bulan, dan lama pembayaran
memiliki skala yang sangat berbeda, jadi perlu menormalkan atau
menstandardisasi data sebelum melatih model neural network. Data
dinormalisasi menggunakan fungsi scale01
yang mengubah
setiap variabel menjadi skala antara 0 dan 1.
set.seed(785)
scale01 <- function(x){
(x - min(x)) / (max(x) - min(x))
}
data <- data %>%
mutate_all(scale01)
head(data)
## besar.pinjaman lama.pembayaran pembayaran.per.bulan bunga rating
## 1 0.6947709 0.64705882 0.41975044 0.4278610 0.3333333
## 2 0.2757374 0.35294118 0.23881035 0.3124150 1.0000000
## 3 0.2151919 0.64705882 0.05676476 0.4618050 0.5555556
## 4 0.5465375 0.00000000 0.55906505 0.3804151 0.0000000
## 5 0.7182585 0.41176471 0.22648400 0.4670702 0.7777778
## 6 0.4156098 0.05882353 0.46072968 0.2746768 0.0000000
Splitting Data
Pembagian data latih dan data uji dapat menggunakan fungsi
createDataPartition
. Dataset akan dibagi menjadi 70% data
latih dan 30% data uji. Pembagian ini dilakukan untuk melatih model pada
data pelatihan dan mengujinya pada data pengujian.
set.seed(785)
in.train <- createDataPartition(data$besar.pinjaman, p = 0.7, list = FALSE)
data_train <- data[in.train,] #data training utk modelling
data_test<- data[-in.train,] #data testing utk evaluasi model
round(prop.table(table(data$besar.pinjaman)), digits = 4)
##
## 0 0.0280447672594609 0.0444724141910165 0.0684883339686548
## 0.01 0.01 0.01 0.01
## 0.0775872772545246 0.0812713752803123 0.101599483295154 0.106716028568336
## 0.01 0.01 0.01 0.01
## 0.137861733796597 0.139846011441242 0.145860056556545 0.162701987670799
## 0.01 0.01 0.01 0.01
## 0.169891288948275 0.181871353694773 0.215191939447622 0.216633662275545
## 0.01 0.01 0.01 0.01
## 0.229493435892796 0.232363526555764 0.23929652066767 0.275737393606583
## 0.01 0.01 0.01 0.01
## 0.283472774677094 0.294100258007388 0.294761272150157 0.302413360776237
## 0.01 0.01 0.01 0.01
## 0.307544191039004 0.309056548193069 0.313337963899958 0.333562971565837
## 0.01 0.01 0.01 0.01
## 0.33398593931245 0.334269834011073 0.346992954034143 0.348507105252218
## 0.01 0.01 0.01 0.01
## 0.352991334748486 0.380729392713638 0.383963511708871 0.39001596270209
## 0.01 0.01 0.01 0.01
## 0.390160389348193 0.390865648900175 0.407153886600981 0.409396465796014
## 0.01 0.01 0.01 0.01
## 0.415609769414834 0.418391375795127 0.418923443629628 0.423530593879018
## 0.01 0.01 0.01 0.01
## 0.42642920983295 0.431403603596258 0.474661763730571 0.476808720375952
## 0.01 0.01 0.01 0.01
## 0.487685471580637 0.496009955545168 0.504777730178125 0.514032745145931
## 0.01 0.01 0.01 0.01
## 0.526354940880997 0.526637012921694 0.540158278608602 0.546537543360423
## 0.01 0.01 0.01 0.01
## 0.549671110214822 0.552124001341075 0.568128185034295 0.581893699546303
## 0.01 0.01 0.01 0.01
## 0.589287641069991 0.590569223669317 0.599380488832095 0.607512784915051
## 0.01 0.01 0.01 0.01
## 0.609423486368894 0.620716475946219 0.621687188754707 0.62408240921953
## 0.01 0.01 0.01 0.01
## 0.627888618953999 0.631386098539544 0.667039469287259 0.672528753702539
## 0.01 0.01 0.01 0.01
## 0.679280711560252 0.682884538456509 0.689902364182516 0.690176556148348
## 0.01 0.01 0.01 0.01
## 0.693811285306988 0.694770873448073 0.703440594640003 0.718258512737129
## 0.01 0.01 0.01 0.01
## 0.721296016695564 0.722289630371669 0.72335063500683 0.728042470224378
## 0.01 0.01 0.01 0.01
## 0.737177918505452 0.762251114965981 0.763410218383952 0.827397233865616
## 0.01 0.01 0.01 0.01
## 0.843051582429685 0.84373828657237 0.850978017428745 0.868213372238255
## 0.01 0.01 0.01 0.01
## 0.877555090087745 0.887634430083758 0.895867779518052 0.928284423096878
## 0.01 0.01 0.01 0.01
## 0.947715550494271 0.985096152690869 0.989993460523535 1
## 0.01 0.01 0.01 0.01
Penentuan Jumlah Hidden Layer dan Neuron
Menentukan jumlah hidden layer dan neuron dalam neural network adalah langkah penting yang memengaruhi kinerja model. Tidak ada aturan baku yang pasti, namun beberapa pendekatan dan pertimbangan berikut dapat membantu dalam proses ini:
Jumlah Hidden Layer:
Single Hidden Layer: Untuk banyak masalah, satu hidden layer sudah cukup untuk menangkap hubungan non-linier antara input dan output.
Multiple Hidden Layers: Jika masalah yang dihadapi lebih kompleks dan memerlukan representasi bertingkat, menambahkan lebih dari satu hidden layer (deep neural network) dapat meningkatkan kemampuan model dalam menangkap pola yang lebih rumit.
Jumlah Neuron dalam Setiap Hidden Layer:
Pendekatan Heuristic: Beberapa metode heuristik dapat digunakan untuk menentukan jumlah neuron, seperti rumus Hecht-Nelson untuk lapisan tersembunyi pertama dan rumus Lawrence-Fredrickson untuk lapisan tersembunyi berikutnya.
Eksperimen dan Validasi: Melakukan eksperimen dengan berbagai konfigurasi jumlah neuron dan menggunakan teknik validasi silang (cross-validation) untuk mengevaluasi kinerja model pada data yang tidak terlihat sebelumnya.
Pendekatan Praktis:
Mulai dengan Sederhana: Mulailah dengan satu hidden layer dan jumlah neuron yang moderat.
Evaluasi Kinerja: Uji kinerja model pada data pelatihan dan data pengujian.
Iterasi dan Penyesuaian: Sesuaikan jumlah hidden layer dan neuron berdasarkan hasil evaluasi untuk meningkatkan kinerja model.
Pertimbangan Tambahan:
Overfitting dan Underfitting: Jumlah hidden layer dan neuron yang terlalu banyak dapat menyebabkan overfitting, sementara terlalu sedikit dapat menyebabkan underfitting.
Keterbatasan Komputasi: Jumlah hidden layer dan neuron yang besar memerlukan sumber daya komputasi yang lebih besar dan waktu pelatihan yang lebih lama.
Menentukan jumlah hidden layer dan neuron dalam neural network memerlukan pendekatan yang seimbang antara kompleksitas model dan kemampuan komputasi. Eksperimen dan evaluasi kinerja model secara berulang sangat penting untuk menemukan konfigurasi yang optimal sesuai dengan karakteristik data dan tujuan analisis.
Pemodelan dengan dua hidden layer yang masing-masing memiliki 20 neuron adalah konfigurasi yang umum digunakan dalam neural network. Oleh karena itu pemodelan berangkat dari ide ini.
Pada model 1, jumlah hidden layer sebanyak 2 yang terdiri dari 20 neuron di setiap layer.
set.seed(785)
Model_nn1 <- neuralnet(besar.pinjaman ~ ., data =
data_train, hidden=c(20,20), linear.output = TRUE)
plot(Model_nn1, rep = "best")
output <- compute(Model_nn1, data_test[,2:5])
head(output$net.result)
## [,1]
## 1 -0.08446796
## 2 1.06589810
## 10 0.53229426
## 11 0.35648732
## 12 -0.02370787
## 13 0.65374705
NN1_Test_RMSE <- sqrt(sum(((output$net.result - data_test[,1])^2)/2)) #Variabel 1 adalah Var Y
NN1_Test_RMSE
## [1] 1.915095
keras_train <- Model_nn1 %>% predict(data_train[, 2:5]) #Variabel 2-5 adalah Var X
keras_test <- Model_nn1 %>% predict(data_test[, 2:5])
RMSETrain1<-postResample(keras_train[,1], data_train$rating);RMSETrain1
## RMSE Rsquared MAE
## 0.409148383 0.002072538 0.318653899
RMSETest1<-postResample(keras_test[,1], data_test$rating);RMSETest1
## RMSE Rsquared MAE
## 0.3356143 0.2889795 0.2577832
Pada model 2, jumlah hidden layer sebanyak 1 yang terdiri dari 20 neuron di setiap layer.
set.seed(785)
Model_nn2 <- neuralnet(besar.pinjaman ~ ., data =
data_train, hidden=c(20), linear.output = TRUE)
plot(Model_nn2, rep = "best")
output <- compute(Model_nn2, data_test[,2:5])
head(output$net.result)
## [,1]
## 1 -0.4340852
## 2 0.3084334
## 10 1.6575365
## 11 1.0137866
## 12 0.9663442
## 13 1.3986141
NN2_Test_RMSE <- sqrt(sum(((output$net.result - data_test[,1])^2)/2))
NN2_Test_RMSE
## [1] 2.459755
keras_train <- Model_nn2 %>% predict(data_train[, 2:5])
keras_test <- Model_nn2 %>% predict(data_test[, 2:5])
RMSETrain2<-postResample(keras_train[,1], data_train$rating); RMSETrain2
## RMSE Rsquared MAE
## 0.405416404 0.002141688 0.314220305
RMSETest2<-postResample(keras_test[,1], data_test$rating); RMSETest2
## RMSE Rsquared MAE
## 0.6395327 0.0294226 0.5461948
Pada model 3, jumlah hidden layer sebanyak 4 yang terdiri dari 20 neuron, 15 neuron, 10 neuron, dan 5 neuron.
set.seed(785)
Model_nn3 <- neuralnet(besar.pinjaman ~ ., data =
data_train, hidden=c(20,15,10,5), linear.output = TRUE)
plot(Model_nn3, rep = "best")
output <- compute(Model_nn3, data_test[,2:5])
head(output$net.result)
## [,1]
## 1 0.09072778
## 2 0.73581764
## 10 0.68997590
## 11 0.07646375
## 12 0.79263046
## 13 0.30401599
NN3_Test_RMSE <- sqrt(sum(((output$net.result - data_test[,1])^2)/2))
NN3_Test_RMSE
## [1] 1.507035
keras_train <- Model_nn3 %>% predict(data_train[, 2:5])
keras_test <- Model_nn3 %>% predict(data_test[, 2:5])
RMSETrain3<-postResample(keras_train[,1], data_train$rating); RMSETrain3
## RMSE Rsquared MAE
## 0.410103236 0.002388406 0.321223386
RMSETest3<-postResample(keras_test[,1], data_test$rating); RMSETest3
## RMSE Rsquared MAE
## 0.39132878 0.07254714 0.31527335
hasil_eval_Train <- rbind(
c(RMSETrain1),
c(RMSETrain2),
c(RMSETrain3))
row.names(hasil_eval_Train) <-
c("Model NN 1","Model NN 2","Model NN 3")
hasil_eval_Test <- rbind(
c(RMSETest1),
c(RMSETest2),
c(RMSETest3))
row.names(hasil_eval_Test) <-
c("Model NN 1","Model NN 2","Model NN 3")
hasil_eval_Train
## RMSE Rsquared MAE
## Model NN 1 0.4091484 0.002072538 0.3186539
## Model NN 2 0.4054164 0.002141688 0.3142203
## Model NN 3 0.4101032 0.002388406 0.3212234
hasil_eval_Test
## RMSE Rsquared MAE
## Model NN 1 0.3356143 0.28897945 0.2577832
## Model NN 2 0.6395327 0.02942260 0.5461948
## Model NN 3 0.3913288 0.07254714 0.3152734
Analisis Hasil:
Model NN 1:
Data Pelatihan: RMSE sebesar 0.4091 dan R-squared sebesar 0.0021 menunjukkan bahwa model ini memiliki kesalahan prediksi yang relatif rendah, namun kemampuan menjelaskan variasi data masih sangat terbatas.
Data Pengujian: RMSE sebesar 0.3356 dan R-squared sebesar 0.2890 menunjukkan bahwa model ini memiliki kesalahan prediksi yang paling rendah di antara ketiga model dan kemampuan menjelaskan variasi data yang lebih baik pada data pengujian.
Model NN 2:
Data Pelatihan: RMSE sebesar 0.4054 dan R-squared sebesar 0.0021 menunjukkan kesalahan prediksi yang sedikit lebih rendah dibandingkan Model NN 1, namun kemampuan menjelaskan variasi data tetap sangat terbatas.
Data Pengujian: RMSE sebesar 0.6395 dan R-squared sebesar 0.0294 menunjukkan peningkatan kesalahan prediksi dan penurunan signifikan dalam kemampuan menjelaskan variasi data dibandingkan dengan Model NN 1.
Model NN 3:
Data Pelatihan: RMSE sebesar 0.4101 dan R-squared sebesar 0.0024 menunjukkan kesalahan prediksi yang sedikit lebih tinggi dibandingkan Model NN 1 dan NN 2, dengan kemampuan menjelaskan variasi data yang tetap sangat terbatas.
Data Pengujian: RMSE sebesar 0.3913 dan R-squared sebesar 0.0725 menunjukkan kesalahan prediksi yang lebih tinggi dibandingkan Model NN 1, namun lebih rendah dibandingkan Model NN 2. Kemampuan menjelaskan variasi data juga lebih baik daripada Model NN 2, namun masih di bawah Model NN 1.
Berdasarkan metrik evaluasi pada data pengujian, Model NN 1 menunjukkan kinerja terbaik dengan RMSE terendah dan R-squared tertinggi, yang mengindikasikan kesalahan prediksi yang lebih kecil dan kemampuan yang lebih baik dalam menjelaskan variasi data. Oleh karena itu, Model NN 1 layak dipertimbangkan untuk digunakan. 4
Selanjutnya dari Model NN-1 ini ingin dilihat variabel-variabel mana yang penting.
olden(Model_nn1)
Grafik menunjukkan pentingnya variabel independen berdasarkan hasil analisis regresi neural network.
pembayaran.per.bulan (Negatif dan Paling Signifikan):
Variabel ini memiliki pengaruh negatif paling besar terhadap besar uang pinjaman. Semakin tinggi nilai pembayaran per bulan, semakin kecil besar uang yang dipinjam. Nilai yang besar menunjukkan bahwa ini adalah faktor kunci dalam model.
rating (Negatif, Pengaruh Moderat):
Rating juga mempengaruhi besar pinjaman secara negatif. Hal ini menunjukkan bahwa variabel ini penting, tetapi kontribusinya tidak sebesar pembayaran per bulan. Mungkin saja rating rendah lebih mengarah pada tingginya besar nilai uang pinjaman.
bunga (Negatif, Pengaruh Kecil):
Variabel bunga memiliki pengaruh yang lebih kecil dibandingkan dua variabel sebelumnya, tetapi tetap penting. Semakin tinggi tingkat bunga,semakin rendah besaran nilai uang yang dipinjam.
lama.pembayaran (Positif, Pengaruh Kecil):
Lama pembayaran adalah satu-satunya variabel dengan pengaruh positif. Semakin panjang tenor pembayaran, ada pengaruh positif terhadap besar uang pinjaman, meskipun pengaruhnya relatif kecil dibandingkan variabel lainnya.
Model neural network menunjukkan bahwa variabel “pembayaran.per.bulan” adalah faktor utama yang mempengaruhi hasil prediksi, diikuti oleh “rating”. Sementara itu, “lama.pembayaran” memiliki pengaruh yang kecil dan positif, mungkin karena memberi fleksibilitas yang lebih besar dalam pembayaran.
Alkahfi, C. (2023, February 19). Model Neural Network pada R Menggunakan Library Keras. Sains Data. Retrieved from https://sainsdata.id/uncategorized/2630/model-neural-network-pada-r-menggunakan-library-keras/
Hermansah, H., & Muhajir, M. (2021). Perbandingan akurasi peramalan antara model neural network dan regresi linier. Evolusi: Jurnal Sains dan Manajemen, 10(2), 66-72.
Ryandhi, R. (2017). Penerapan metode artificial neural network (ANN) untuk peramalan inflasi di Indonesia. Tugas Akhir, Institut Teknologi Sepuluh Nopember.
Sari, D. P., & Sari, D. P. (2020). Penerapan artificial neural network (ANN) dalam memprediksi kapasitas produksi padi. MATRIKS (Matematika, Riset, dan Aplikasi), 6(2), 100-107.
Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id
Jika semua variabel independen bertipe kontinu dan variabel dependen bertipe kategorik, sebaiknya menggunakan klasifikasi neural network daripada regresi neural network. Metode regresi neural network hanya cocok untuk variabel dependen kontinu, sedangkan klasifikasi neural network cocok untuk variabel dependen kategorik.↩︎
Regresi neural network adalah teknik yang kuat untuk menangani masalah dengan hubungan non-linier antara variabel independen dan dependen, terutama ketika data mengandung pola yang rumit atau interaksi antara variabel yang tidak mudah diungkapkan dengan model linier biasa.↩︎
Neural network seringkali lebih mudah berkonvergensi ketika data input berada dalam skala yang seragam.↩︎
Namun, penting untuk mempertimbangkan konteks spesifik dan melakukan evaluasi lebih lanjut, seperti validasi silang (cross-validation) dan analisis residual, untuk memastikan pemilihan model yang optimal.↩︎