IMPLEMENTASI NEURAL NETWORKS UNTUK PREDICTION MENGGUNAKAN R

Contoh gunakan nnet

  1. Pada package mlbench terdapat dataset BostonHousing yang akan digunakan. Boston Housing adalah data mengenai perumahan berisi data perumahan dan 506 wilayah. Misal, kita ingin membuat model untuk memprediksi medv, dimana variabel medv adalah nilai median dari harga rumah untuk masing-masing wilayah.
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.2.3
library(caret) # untuk mempermudah proses pemrosesan data, pemilihan fitur, penyetelan parameter, dan evaluasi model.
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 4.2.3
library(nnet) #untuk membangun model jaringan saraf.
data("BostonHousing") #berisi data tentang harga rumah di Boston

# a. cek range dari medv, digunakan untuk scaling data
summary(BostonHousing$medv) #tampilkan ringkasan statistik
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   17.02   21.20   22.53   25.00   50.00
# b. Partisi data untuk training dan testing
inTrain <- createDataPartition(BostonHousing$medv, 
                               p = 0.75, 
                               list = FALSE) # membagi dataset menjadi subset untuk pelatihan (75%) dan pengujian (25%), FALSE menunjukkan bahwa hasil yang dihasilkan akan berupa indeks data dan bukan daftar data itu sendiri.
train.set <- BostonHousing[inTrain,]
test.set <- BostonHousing[-inTrain,]

# c. Bangun model menggunakan data training
netmodel <- nnet(medv/50~., size = 5, data = train.set, maxit = 500)
## # weights:  76
## initial  value 12.464286 
## iter  10 value 9.265815
## iter  20 value 6.951121
## iter  30 value 5.968592
## iter  40 value 5.261743
## iter  50 value 3.859451
## iter  60 value 3.440021
## iter  70 value 3.116499
## iter  80 value 2.886639
## iter  90 value 2.808186
## iter 100 value 2.751581
## iter 110 value 2.729876
## iter 120 value 2.716783
## iter 130 value 2.709332
## iter 140 value 2.704305
## iter 150 value 2.700835
## iter 160 value 2.698764
## iter 170 value 2.697738
## iter 180 value 2.697647
## final  value 2.697638 
## converged
## "~' menunjukkan bahwa variabel di sebelah kiri ~ adalah variabel target, sedangkan variabel-variabel di sebelah kanan ~ adalah variabel-variabel prediktor.
## '.'menunjukkan semua variabel prediktor yang tersedia dalam dataset, kecuali variabel target. Dalam hal ini, '.' merupakan representasi singkat dari semua variabel prediktor dalam dataset kecuali medv.
## size=5 menentukan jumlah neuron yang akan ada dalam satu lapisan tersembunyi dari jaringan saraf.
## maxit=500 Dalam hal ini, algoritma pelatihan akan berhenti setelah melakukan 500 iterasi atau ketika konvergensi tercapai, mana yang terjadi lebih dulu.

# d. Uji model dengan data testing
medv.predict <- predict(netmodel, test.set[,-14])*50

# e. Hitung mean squared error
mean((medv.predict - test.set$medv)^2)
## [1] 12.11521
# f. membuat plot dengan harga rumah aktual (test.set$medv) di sumbu x dan harga rumah yang diprediksi oleh model 
plot(test.set$medv, medv.predict, main = "Neural Network Predictions vs Actual", xlab = "Actual")

abline(lm(medv.predict~test.set$medv), col = "red")

## Semakin dekat titik-titik data ke garis regresi, semakin baik model dalam memprediksi harga rumah.

Berdasarkan output di atas, terlihat bahwa mean squared errors hasil prediksi neural networks pada data testing adalah sebesar 20.05389 dan akurasi prediksi juga dapat terlihat pada plot gambar tersebut. Hasil prediksi dengan fungsi nnet sudah cukup baik.

Kelemahan dari package nnet adalah hanya untuk arsitektur dengan single hidden layer, untuk pilihan single hidden layer dan metode yang lebih fleksibel kita bisa menggunakan package neuralnet.

Kelemahan dari neuralnet adalah tidak bisa menangani variabel kategorik secara otomatis, sehingga kita perlu merubah variabel kategorik menjadi variabel dummy.

Contoh gunakan neuralnet

  1. Misal dengan menggunakan dataset BostonHousing, dilakukan prediksi dengan menggunakan neuralnet.
library(mlbench)
library(caret)
library(neuralnet)
## Warning: package 'neuralnet' was built under R version 4.2.3
data("BostonHousing")

data <- BostonHousing

# a. ubah var kategorik menjadi numerik
data$chas <- as.numeric(data$chas)
##karena var chas adalah biner, cukup menggunakan as.numeric

# b. lakukan scaling pada data untuk memastikan semua variabel memiliki skala yang seragam (Normalisasi)
maxs <- apply(data, 2, max) ## menghitung nilai maksimum untuk setiap kolom dalam data frame
mins <- apply(data, 2, min)
maxs
##     crim       zn    indus     chas      nox       rm      age      dis 
##  88.9762 100.0000  27.7400   2.0000   0.8710   8.7800 100.0000  12.1265 
##      rad      tax  ptratio        b    lstat     medv 
##  24.0000 711.0000  22.0000 396.9000  37.9700  50.0000
mins
##      crim        zn     indus      chas       nox        rm       age       dis 
##   0.00632   0.00000   0.46000   1.00000   0.38500   3.56100   2.90000   1.12960 
##       rad       tax   ptratio         b     lstat      medv 
##   1.00000 187.00000  12.60000   0.32000   1.73000   5.00000
scaled <- as.data.frame(scale(data, center = mins, scale = maxs-mins))
## center adalah nilai tengah yang digunakan untuk scaling, sedangkan scale adalah skala yang digunakan untuk scaling. Dalam kasus ini, nilai tengahnya adalah mins dan skalanya adalah maxs - mins.

# c. Partisi data untuk training dan testing
index <- createDataPartition(BostonHousing$medv, p=0.75,
                             list = FALSE)
train <- scaled[index,]
test <- scaled[-index,]

# d. neural net model untuk membuat model jaringan saraf.
n <- names(train) ##untuk mendapatkan nama-nama variabel dari dataset pelatihan
f <- as.formula(paste("medv ~", paste(n[!n %in% "medv"], collapse = "+")))
## paste(n[!n %in% "medv"], collapse = "+") digunakan untuk menggabungkan semua nama variabel kecuali variabel target (medv) dengan tanda tambah +, yang akan digunakan dalam formula model.
## Kemudian, paste("medv ~", ...) digunakan untuk membuat string yang berisi formula model dengan variabel target (medv) di bagian kiri simbol ~.
## as.formula() digunakan untuk mengonversi string tersebut menjadi objek formula yang sesuai dengan format yang dibutuhkan oleh fungsi neuralnet()
nn <- neuralnet(f, data=train, hidden=c(5,3), linear.output=T)
## hidden=c(5,3) menunjukkan struktur jaringan saraf. Dalam hal ini, dimiliki dua lapisan tersembunyi, dengan lima neuron di lapisan pertama dan tiga neuron di lapisan kedua.

# e. hitung prediksi pada data test
pr.nn <- compute(nn, test[,1:13])

# f. Unscaling data untuk mengembalikan skala data prediksi dan data aktual ke skala aslinya agar bisa dibandingkan dengan benar
pr.nn_ <- pr.nn$net.result*(max(data$medv)-min(data$medv))+min(data$medv)
test.r <- (test$medv)*(max(data$medv)-min(data$medv))+min(data$medv)

# g. Hitung MSE untuk mengevaluasi performa model
sum((test.r - pr.nn_)^2)/nrow(test)
## [1] 13.35704
# h. plot data prediksi vs data aktual
plot(test.r, pr.nn_)
abline(lm(test.r~pr.nn_), col="red")

Berdasarkan output di atas, terlihat bahwa neuralnet menghasilkan mean squared error (MSE) sebesar 10.37677, jauh lebih kecil dari MSE yang dihaasilkan oleh fungsi nnet. Akurasi prediksi pada data testing juga terlihat pada plot antara data prediksi dan data aktual gambar tersebut.

SUMBER : BUKU DATA MINING DENGAN R (Prof Setia Pramana, dkk)