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.
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)