Supervised Learning: Artificial Neural Network (ANN) dengan R

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
 
Misalkan ada input bernilai 10, maka sebelum menuju fungsi aktivasi, ia akan dikalikan dengan penimbang w1 = 0,2 sehingga menjadi (10 x 0,2) = 2. Setelah itu, ditambah dengan bias sebagai efek dalam fungsi aktivasi, misalkan biasnya -2,5, maka (2 + (-2,5)) = -0,5. Nilai -0,5 inilah yang kemudian dimasukkan dalam fungsi aktivasi, dalam kasus kita ini misalkan fungsi aktivasinya adalah Sigmoid dengan rumus yang tertera pada gambar didapatkan hasil f(-0,5) = 0,38. Setelah itu, angka 0,38 ini masuk ke layer ke-3, yaitu layer output dengan cara dikalikan lagi dengan penimbang sebelum masuk fungsi aktivasi (0,38 x 0,3) = 0,114. Setelah itu, karena di dalam layer output juga terdapat bias maka nilainya menjadi (0,114 + 0,5) = 0,614. Pada kasus kita ini, fungsi aktivasi output menggunakan fungsi ReLU dengan f(x) = nilai maksimum dari (0, x) sehingga f(0,614) = max(0, 0,614) = 0,614. Maka, output akhir dari proses ANN sederhana ini sama dengan 0,614 dari input sebesar 10 tadi.
 
Lalu, apa saja tipe-tipe arsitektur dasar Artificial Neural Network (ANN) yang sering digunakan? Setidaknya ada 3 jenis arsitektur, yaitu single layer Feed-forward neural network, multilayer Feed-forward neural network, dan recurrent neural network. Sebenarnya, Feed-forward neural network sendiri merupakan bentuk dasar dari tipe perceptron neural network. Tipe ini juga mirip dengan radial basis network (RBF) yang kemudian dikembangkan menjadi beragam bentuk Artificial Neural Network (ANN) lebih kompleks, terlebih untuk keperluan deep learning. Misalnya, Long/Short Term Memory (LSTM), Gated recurrent Unit (GRU), Auto encoder (AE), Variational AE (VAE), Denoising AE (DAE), Sparse AE (SAE), Markov-Chain, Hopefield Network, Boltzman Network, Restricted BM, Deep Belief Network, Deep Convolutional Nertwork (DCN), Deconvolutional Network (DN), Deep Convolutional Graphics Network (DCGN), Generative Adversarial Network, Liquid State Machine, Extreme Learning Machine, Echo State Network, Deep Residual Network, Kohonen Network, Support Vector Machine (SVM), serta Neural Tuning Machine (NTM).

Baik, kita telah sedikit mengulas mengenai teori dan beberapa bentuk pengembangan Artificial neural Network (ANN). Selanjutnya, kita akan melakukan praktik bagaimana cara memodelkan ANN menggunakan R. Dalam praktikum kali ini, saya telah menyiapkan data mengenai Indeks Kualitas Udara (IKU) yang saya peroleh dari web scraping menggunakan R. Data ini merupakan data IKU beserta komponennya dari situs iqair.com. Teman-teman dapat mengunduhnya terlebih dahulu pada tautan berikut. Setelah diunduh, Artificial Neural Network (ANN) dapat mengikuti beberapa codei berikut:
#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")
plot of chunk unnamed-chunk-17
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)
plot of chunk unnamed-chunk-18
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")
plot of chunk unnamed-chunk-28
Visualisasi plot antara hasil prediksi dengan nilai aktual data

Demikian sedikit kebersamaan kita membahas pemodelan supervised learning: Artificial Neural Network (ANN) menggunakan R. Jangan lupa untuk terus mengikuti unggahan terbaru dari blog ini. Semoga bermanfaat dan selamat mempraktikkan!
Add Comments


EmoticonEmoticon