Artificial Neural Network (ANN) dengan R |
Halo teman-teman, jumpa lagi dengan blog sederhana ini. Kita kemarin telah banyak membahas mengenai salah satu model machine learning berjenis unsupervised learning, yaitu Fuzzy C Means Clustering. Kali ini kita akan beranjak belajar bersama-sama mengenai salah satu jenis supervised learning yang saya sendiri merupakan model yang cukup "berat", yaitu Artificial Neural Network (ANN) atau disebut pula Neural Network Model.
Model yang disebut-sebut jaringan syaraf tiruan (Neural Network) ini saya rasa menjadi poin awal kita membahas model yang advance, karena dari model inilah lahir dan berkembang model-model lain yang semakin rumit untuk dijelaskan secara sederhana dan renyah. Tetapi, kita di sini bersama-sama untuk mengupas Artificial Neural Network ini langkah demi langkah.
Seperti adat istiadat dalam blog ini, sebelum praktikum, kita akan mengulas model secara teoritis terlebih dahulu. Jaringan syarat tiruan (Artificial Neural Network) atau ANN ini sejatinya merupakan algoritma yang lahir sebagai tiruan atau miniatur dari sistem jaringan syaraf pada ilmu biologi. Kalau dalam biologi, sistem syaraf yang kita kenal memiliki beberapa elemen pembangun, yaitu badan sel, dendrit, akson, nodus ranvier, selubung mielin, sel Schwan, serta celah sinapsis. Masing-masing dari elemen sistem syaraf ini memiliki fungsi masing-masing. Demikian halnya dengan jaringan syaraf tiruan yang kemudian kita kenal sebagai Artificial Neural Network. Seperti halnya sistem syaraf manusia atau mahluk hidup lainnya, ANN juga belajar berdasarkan secuplik pengalaman (data sampel atau contoh) untuk kemudian mampu membuat sebuah keputusan bila menemui situasi yang sama dengan pengalaman sebelumnya.
Kalau di dalam sebuah sel syaraf (neuron) atau node, kita mengenal istilah efek stimulus, maka kalau di dalam ANN kita akan mengenal istilah efek masukan (input). Efek inilah yang dinotasikan sebagai penimbang atau pembobot dalam proses penghitungan keluaran (output) ANN. Setiap input yang menstimulus masuk dalam neuron akan memiliki bobot masing-masing dan kemudian dijumlahkan menjadi sebuah nilai tertentu. Kalau di biologi, setiap input yang masuk dalam neuron diistilahkan sebagai dendrit. Dendrit inilah yang menerima setiap impuls yang masuk. Sedangkan 1 nilai hasil penjumlahan setiap input dengan penimbang masing-masing berada pada bagian badan sel (nukleus).
Proses berikutnya terjadi konversi nilai pada badan sel tadi, kalau dalam biologi dikenal dengan neuron sensorik (neuron aferen). Proses konversi ini dalam ANN melibatkan sejumlah fungsi matematis untuk mengubah 1 nilai tadi sehingga menjadi nilai baru. Beberapa fungsi matematis ini kemudian dikenal sebagai fungsi aktivasi (activation function) sebagai berikut:
Beberapa jenis fungsi aktivasi ANN |
Dengan menggunakan fungsi aktivasi ini, Artificial Neural Network hakikatnya memiliki tujuan melakukan transformasi sejumlah input menjadi sebuah output yang memiliki makna dan manfaat dalam pengambilan keputusan, khususnya di bidang statistika.
Kalau berdasarkan pengalaman, sulit menerjemahkan ANN secara teoritis ke praktis, tetapi kita akan coba melakukannya dengan beberapa ilustrasi berikut:
Ilustrasi Artificial Neural Network paling sederhana |
Gambar di atas merupakan arsitektur ANN paling sederhana. Input yang masuk ke dalam sistem memiliki efek masing-masing sebagai penimbang (weigthed) pada layer 0. Proses berikutnya, informasi akan dikonversi menggunakan fungsi aktivasi dan di dalam proses ini sejumlah informasi mengandung bias. Setelah setiap input dikalikan dengan penimbang dan ditambahkan bias, kemudian masuk dalam fungsi aktivasi. Nilai yang dihasilkan dari proses ini kemudian menjadi input untuk kemudian dikonversi kembali dengan fungsi aktivasi sebelum menjadi nilai akhir (output).
Dalam praktiknya, visualisasi output ANN di R biasanya kita peroleh sebagai berikut:
Output Artificial Neural Network Model dengan R |
Awalnya, saya sendiri masih bingung bagaimana cara menerjemahkan atau menginterpretasikan output ANN R pada gambar di atas. Namun, setelah saya baca beragam referensi termasuk buku-buku tekstual, saya peroleh simpulan yang saya tuangkan pada gambar tersebut. Arsiterktur ANN tersebut terdiri atas 3 lapis (layer), 5 input, 1 hidden layer yang terdiri atas 3 nodes, dan garis warna biru itu menunjukkan bias di setiap lapis, bias pertama terjadi di dalam hidden layer dan bias kedua terjadi di output layer.
Lantas, bagaimana cara kita menentukan nilai output dalam Artificial Neural Network (ANN)? Agar lebih mudah, kita gunakan lagi ilustrasi ANN yang paling sederhana dengan 3 layer dan 1 hidden layer berikut:
Alur matematis arsitek ANN 3 layer |
#Instal dan aktivasi package
library(neuralnet)
library(MASS)
#Import Data Indeks Kualitas Udara 232 wilayah Jawa Timur
library(readxl)
dataiku2 <- read_excel("C:/Users/Joko Ade/Downloads/dataiku.xlsx")
head(dataiku2, 10)
## # A tibble: 10 x 7
## Konsentrasi Cuaca Suhu Kelembapan Kecangin Tekud IKU
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 46.2 5 28 0.75 5 1011 127
## 2 46.2 5 28 0.72 5.3 1011 127
## 3 46.2 5 27 0.73 6.2 1011 127
## 4 44.2 5 28 0.75 10.9 1010 122
## 5 40.2 5 28 0.74 14.4 1010 112
## 6 40.2 5 28 0.73 12.7 1010 112
## 7 40.2 5 28 0.74 13.1 1011 112
## 8 40.2 5 27 0.79 5.3 1011 112
## 9 40.2 5 28 0.7 7.8 1011 112
## 10 39.2 3 26 0.79 5.3 1011 110
#Melihat Sebara Data dengan Faset Histogram
library(tidyverse)
library(ggplot2)
dataiku2 %>%
gather(power, value, 1:7) %>%
ggplot(aes(x=value)) +
geom_histogram(fill = "steelblue", color = "black", bins = 30) +
facet_wrap(~power, scales = "free_x") +
labs(x = "Nilai", y = "Frekuensi")
Visualisasi sebaran data dengan facet ggplot2 |
#Membuat Matriks Korelasi antar Variabel
library(reshape2)
corrku <- cor(dataiku2)
melt_cor <- melt(corrku)
ggplot(data = melt_cor, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(aes(fill = value), color = "white") +
scale_fill_gradient(low = "white", high = "#ff8c00") +
geom_text(aes(Var1, Var2, label = round(value, 2)), size = 3)
Visualisasi matriks korelasi antar variabel dalam data |
#Menormalkan Data karena beda satuan
#Membuat fungsi normalisasi dengan minimal-maksimal
normal <- function(x){
(x - min(x))/(max(x) - min(x))
}
#Penerapan fungsi normalisasi dengan lapply()
skala <- as.data.frame(lapply(dataiku2[1:7], FUN = normal))
head(skala, 10)
## Konsentrasi Cuaca Suhu Kelembapan Kecangin Tekud IKU
## 1 0.6774194 1.0 0.9090909 0.24242424 0.2336449 0.5000000 0.8037975
## 2 0.6774194 1.0 0.9090909 0.15151515 0.2476636 0.5000000 0.8037975
## 3 0.6774194 1.0 0.8181818 0.18181818 0.2897196 0.5000000 0.8037975
## 4 0.6480938 1.0 0.9090909 0.24242424 0.5093458 0.3333333 0.7721519
## 5 0.5894428 1.0 0.9090909 0.21212121 0.6728972 0.3333333 0.7088608
## 6 0.5894428 1.0 0.9090909 0.18181818 0.5934579 0.3333333 0.7088608
## 7 0.5894428 1.0 0.9090909 0.21212121 0.6121495 0.5000000 0.7088608
## 8 0.5894428 1.0 0.8181818 0.36363636 0.2476636 0.5000000 0.7088608
## 9 0.5894428 1.0 0.9090909 0.09090909 0.3644860 0.5000000 0.7088608
## 10 0.5747801 0.5 0.7272727 0.36363636 0.2476636 0.5000000 0.6962025
#Memecah data dalam data training dan testing
indeks <- sample(1:nrow(dataiku2), round(0.75*nrow(dataiku2)))
train <- skala[indeks,]
head(train, 10)
## Konsentrasi Cuaca Suhu Kelembapan Kecangin Tekud IKU
## 838 0.2214076 0.50 0.54545455 0.4545455 0.2149533 0.8333333 0.3607595
## 1319 0.2214076 0.50 0.27272727 0.5151515 0.2196262 0.6666667 0.3607595
## 1023 0.5894428 0.50 0.36363636 0.4242424 0.1588785 0.5000000 0.7088608
## 1055 0.5307918 0.50 0.54545455 0.5151515 0.2242991 0.1666667 0.6518987
## 1074 0.4721408 0.50 0.27272727 0.3939394 0.1308411 0.6666667 0.5886076
## 962 0.6774194 0.50 0.45454545 0.6363636 0.1542056 0.3333333 0.8037975
## 1155 0.8240469 0.25 0.36363636 0.6969697 0.3971963 0.5000000 0.9556962
## 978 0.6334311 0.50 0.54545455 0.4242424 0.3831776 0.3333333 0.7594937
## 300 0.3533724 0.50 0.27272727 0.8181818 0.1308411 0.5000000 0.4810127
## 1188 0.5747801 0.25 0.09090909 0.5757576 0.2663551 0.6666667 0.6962025
test <- skala[-indeks,]
head(test, 10)
## Konsentrasi Cuaca Suhu Kelembapan Kecangin Tekud IKU
## 3 0.6774194 1.0 0.8181818 0.18181818 0.2897196 0.5000000 0.8037975
## 12 0.5601173 1.0 0.7272727 0.18181818 0.3831776 0.3333333 0.6835443
## 17 0.5307918 0.5 0.7272727 0.15151515 0.3971963 0.3333333 0.6518987
## 18 0.5307918 1.0 0.7272727 0.15151515 0.3411215 0.3333333 0.6518987
## 23 0.5161290 1.0 0.9090909 0.12121212 0.4065421 0.5000000 0.6265823
## 25 0.5161290 1.0 0.9090909 0.18181818 0.1915888 0.5000000 0.6265823
## 28 0.5161290 1.0 0.2727273 0.21212121 0.1121495 0.5000000 0.6265823
## 34 0.5014663 1.0 0.7272727 0.66666667 0.3457944 0.3333333 0.6139241
## 36 0.5014663 0.0 0.7272727 0.66666667 0.3457944 0.3333333 0.6139241
## 44 0.5014663 0.5 0.7272727 0.06060606 0.2663551 0.3333333 0.6139241
#Mengattach Data
attach(train)
## The following objects are masked from test:
##
## Cuaca, IKU, Kecangin, Kelembapan, Konsentrasi, Suhu, Tekud
## The following objects are masked from train (pos = 5):
##
## Cuaca, IKU, Kecangin, Kelembapan, Konsentrasi, Suhu, Tekud
attach(test)
## The following objects are masked from train (pos = 3):
##
## Cuaca, IKU, Kecangin, Kelembapan, Konsentrasi, Suhu, Tekud
## The following objects are masked from test (pos = 5):
##
## Cuaca, IKU, Kecangin, Kelembapan, Konsentrasi, Suhu, Tekud
## The following objects are masked from train (pos = 6):
##
## Cuaca, IKU, Kecangin, Kelembapan, Konsentrasi, Suhu, Tekud
#Membangun Model ANN untuk data train
nn <- neuralnet(IKU ~ Konsentrasi + Cuaca + Suhu + Kelembapan + Tekud, data = train,
hidden = c(5, 3),
linear.output = T)
#Visualisasi Model ANN Train
plot(nn)
Visalisasi model Artificial Neural Network yang terbentuk
#Membuat Confusion Matrix Train
temp_train <- subset(train, select = c("IKU", "Konsentrasi", "Cuaca", "Suhu", "Kelembapan",
"Tekud"))
nn.results_train <- neuralnet::compute(nn, temp_train)
results_train <- data.frame(actual = train$IKU, prediction = nn.results_train$net.result)
roundedresults_train <- sapply(results_train, FUN = round, digits = 0)
roundedresultsdf_train <- data.frame(roundedresults_train)
cm_train <- table(roundedresultsdf_train$actual, roundedresultsdf_train$prediction)
cm_train
##
## 0 1
## 0 555 0
## 1 7 477
#Akurasi Model
akurasi_train <- (sum(diag(cm_train)))/sum(cm_train)
akurasi_train
## [1] 0.9932628
#Memprediksi dengan menggunakan data test
pred_nn <- neuralnet::compute(nn, test)
#Mendapatkan Nilai Prediksi dan Aktual
results <- data.frame("aktual" = test, "prediksi" = pred_nn)
#Membuat Confusion Matriks dengan data test
temp_test <- subset(test, select = c("IKU", "Konsentrasi", "Cuaca", "Suhu", "Kelembapan",
"Tekud"))
nn.results <- neuralnet::compute(nn, temp_test)
results <- data.frame(actual = test$IKU, prediction = nn.results$net.result)
roundedresults<- sapply(results, FUN = round, digits = 0)
roundedresultsdf <- data.frame(roundedresults)
cm <- table(roundedresultsdf$actual, roundedresultsdf$prediction)
cm
##
## 0 1
## 0 181 0
## 1 4 161
#Akurasi Model data test
akurasi_test <- (sum(diag(cm)))/sum(cm)
akurasi_test
## [1] 0.9884393
#Menghitung MSE Model
pred_nn_ <- pred_nn$net.result * (max(dataiku2$IKU) - min(dataiku2$IKU)) + min(dataiku2$IKU)
test.r <- (test$IKU) * (max(dataiku2$IKU) - min(dataiku2$IKU)) + min(dataiku2$IKU)
MSE_nn <- sum((test.r - pred_nn_)^2) / nrow(test)
MSE_nn
## [1] 8.543266
#Visualisasi Nilai Prediksi dan Aktual
plot(results, col = c("blue", "red"))
legend("bottomright", legend = c("Nilai Aktual", "Nilai Prediksi ANN"), fill = c("blue", "red"),
bty = "n", cex = 0.8, title = "Keterangan")
Visualisasi plot antara hasil prediksi dengan nilai aktual data |