STA1382 Artificial Neural Network

Cahya Alkahfi | Rizki Ananda

Pendahuluan

Artificial Neural Network (ANN), atau Jaringan Saraf Tiruan, adalah sebuah model komputasi yang terinspirasi dari cara kerja otak manusia dalam memproses informasi. ANN terdiri dari banyak unit pemrosesan (neuron) yang saling terhubung dan mampu belajar dari data masukan yang diberikan.

Setiap unit pemrosesan atau neuron dalam ANN memiliki fungsi matematika yang digunakan untuk menghitung keluaran berdasarkan masukan yang diterimanya. Koneksi antar-neuron dalam ANN memiliki bobot atau nilai yang mempengaruhi kontribusi setiap neuron pada proses pemrosesan data.

ANN terdiri dari beberapa layer atau lapisan. Layer pertama disebut layer masukan (input layer), layer terakhir disebut layer keluaran (output layer), dan layer di antaranya disebut hidden layer. Setiap layer terdiri dari beberapa neuron, dan setiap neuron pada layer tertentu terhubung dengan neuron pada layer sebelumnya dan layer sesudahnya. Koneksi antar-neuron ini memiliki bobot atau nilai tertentu yang menentukan kontribusi setiap neuron pada proses pemrosesan data.

ANN belajar dari data masukan dengan melakukan proses iteratif untuk menyesuaikan bobot koneksi antar-neuron, sehingga keluaran yang dihasilkan semakin mendekati keluaran yang diharapkan. Proses pembelajaran ini disebut training dan membutuhkan data masukan dan keluaran yang sudah diketahui sebagai acuan. Setelah dilakukan training, ANN dapat digunakan untuk memprediksi keluaran berdasarkan data masukan yang belum pernah dilihat sebelumnya.

Kegunaan

Berikut beberapa kegunaan ANN:

  1. Pengenalan Pola: ANN dapat digunakan untuk mengenali pola dari data seperti teks, gambar, suara, dan data lainnya. Misalnya, ANN dapat digunakan untuk mengenali tulisan tangan dan mereplikasi tulisan tersebut dalam bentuk digital.

  2. Prediksi: ANN dapat digunakan untuk memprediksi nilai yang akan muncul dari data yang diberikan. Contohnya, ANN dapat digunakan untuk memprediksi harga saham atau cuaca di suatu wilayah.

  3. Natural Language Processing: ANN dapat digunakan untuk memahami dan memproses bahasa manusia. Contohnya, ANN dapat digunakan untuk memproses teks dan mengenali makna di balik kalimat.

  4. Klasifikasi: ANN dapat digunakan untuk mengklasifikasikan data ke dalam kategori yang berbeda. Misalnya, ANN dapat digunakan untuk mengklasifikasikan email sebagai spam atau bukan spam.

  5. Pengenalan Wajah: ANN dapat digunakan untuk mengenali wajah seseorang dari gambar atau video. Contohnya, ANN dapat digunakan dalam sistem pengamanan untuk mengenali wajah seseorang dan memperbolehkan akses ke suatu area tertentu.

  6. Pemrosesan Sinyal: ANN dapat digunakan untuk memproses sinyal seperti suara atau gambar. Misalnya, ANN dapat digunakan untuk memfilter suara bising dalam sebuah rekaman.

  7. Kontrol dan Pengawasan: ANN dapat digunakan untuk mengontrol dan memantau sistem seperti robot dan kendaraan otonom.

Jenis Neural Network

Berikut adalah beberapa jenis NN yang umum digunakan:

  1. Feedforward Neural Network: Ini adalah jenis jaringan saraf paling sederhana yang memiliki satu arah aliran informasi dari input ke output. Feedforward NN digunakan untuk klasifikasi, regresi, dan pengenalan pola.

  2. Convolutional Neural Network (CNN): CNN digunakan untuk memproses data berupa gambar dan video. CNN memiliki layer khusus yang disebut Convolutional Layer yang digunakan untuk mengekstrak fitur-fitur penting dari data visual.

  3. Recurrent Neural Network (RNN): RNN digunakan untuk memproses data berurutan seperti teks, suara, dan musik. RNN memiliki sirkuit terhadap balik yang memungkinkan informasi yang dihasilkan pada saat sebelumnya dapat diteruskan ke sirkuit selanjutnya.

  4. Long Short-Term Memory (LSTM): LSTM adalah jenis RNN yang dirancang untuk mengatasi masalah vanishing gradient yang sering terjadi pada RNN biasa. LSTM memiliki kemampuan untuk mempertahankan informasi dalam waktu yang lama dan memperhitungkan informasi baru yang masuk.

  5. Autoencoder: Jenis NN yang digunakan untuk kompresi data dan rekonstruksi kembali data yang telah terkompresi. Autoencoder terdiri dari encoder yang mengubah input menjadi representasi ringkas dan decoder yang mengembalikan representasi tersebut ke bentuk awal.

  6. Generative Adversarial Network (GAN): GAN digunakan untuk menghasilkan data baru yang menyerupai data latihan. GAN terdiri dari dua NN, yaitu generator dan discriminator, yang saling bersaing untuk menghasilkan data baru yang paling realistis.

  7. Hopfield Network: Hopfield Network digunakan untuk memori asosiatif dan memori pola. Hopfield Network memiliki kemampuan untuk mengingat pola yang telah dipelajari dan mengeluarkan pola yang sama ketika diberikan input yang terdegradasi atau tidak sempurna.

Terminologi

Beberapa terminologi yang sering digunakan dalam ANN:

  1. Neuron: Unit pemrosesan dasar dalam jaringan saraf yang menerima input, menghitung output, dan mengirimkannya ke neuron lain. Setiap neuron dalam jaringan saraf buatan biasanya memiliki sejumlah bobot numerik dan bias yang masing-masing mewakili kekuatan koneksi antara neuron tersebut dan neuron lain atau input. Bobot dan bias diatur atau diubah selama proses pelatihan untuk meningkatkan kemampuan jaringan saraf dalam memproses informasi.

  2. Input Layer: Layer pertama dalam jaringan saraf yang menerima input dari luar dan memberikan output ke lapisan berikutnya dalam jaringan. Lapisan input terdiri dari beberapa neuron, tergantung pada jumlah atribut atau fitur dalam input. Setiap neuron pada input layer mewakili satu atribut atau fitur dari input dan menerima input numerik yang sesuai dengan nilai atribut.

  3. Hidden Layer: Layer di antara input layer dan output layer yang terdiri dari beberapa neuron yang saling terhubung dan masing-masing neuron melakukan pemrosesan terhadap input yang diterima dari lapisan sebelumnya dan memberikan output ke lapisan berikutnya. Fungsi utama dari hidden layer adalah untuk mengekstraksi fitur atau pola dari data input yang kompleks dan membuat jaringan saraf lebih fleksibel dalam memproses data. Pemilihan jumlah neuron pada setiap hidden layer dan jumlah hidden layer pada jaringan saraf adalah tugas yang penting dalam membangun model jaringan saraf yang efektif. Terlalu sedikit neuron atau hidden layer dapat menghasilkan model yang kurang akurat, sedangkan terlalu banyak dapat menyebabkan overfitting.

  4. Output Layer: Layer terakhir dalam jaringan saraf yang menghasilkan output. Bentuk dan fungsi dari output layer tergantung pada jenis masalah yang ingin diselesaikan. Pada masalah klasifikasi, output layer biasanya terdiri dari beberapa neuron, di mana setiap neuron mewakili kelas yang mungkin dari input. Pada masalah regresi, output layer biasanya terdiri dari satu neuron, yang menghasilkan nilai numerik yang merepresentasikan prediksi dari model terhadap input yang diberikan. Nilai output dari setiap neuron pada output layer dihitung dengan menggunakan fungsi aktivasi yang sesuai dengan jenis masalah yang ingin diselesaikan.

  5. Weight: Bobot numerik yang mewakili kekuatan koneksi antara dua neuron atau antara neuron dan input. Weight merupakan parameter penting pada ANN yang menentukan seberapa besar pengaruh setiap input pada output yang dihasilkan oleh neuron. Setiap input pada sebuah neuron dikalikan dengan bobot tertentu sebelum dijumlahkan dan diproses melalui fungsi aktivasi.

  6. Bias: Parameter tambahan pada setiap neuron dalam ANN yang berfungsi untuk menambahkan nilai tetap pada setiap input sebelum dihitung melalui fungsi aktivasi pada neuron tersebut. Bias pada setiap neuron memungkinkan jaringan saraf untuk dapat memodelkan relasi antara input dan output dengan lebih fleksibel, karena tanpa adanya bias, jaringan saraf hanya akan dapat menghasilkan garis lurus atau linear pada plot input-output. Setiap neuron pada jaringan saraf buatan memiliki satu parameter bias.

  7. Activation Function: Fungsi matematika yang diterapkan pada setiap neuron pada ANN untuk menghasilkan output dari nilai input yang diberikan. Fungsi ini memungkinkan jaringan saraf untuk mempelajari dan mengekspresikan relasi antara input dan output pada data. Terdapat berbagai jenis fungsi aktivasi yang umum digunakan pada jaringan saraf buatan, antara lain: Fungsi Sigmoid, ReLU (Rectified Linear Unit), Tanh (Tangent Hyperbolic), Softmax, dll.

  8. Feedforward: Proses mengalirkan input melalui jaringan saraf dari layer input ke layer output. Pada metode ini, informasi hanya mengalir maju (forward) dari input layer melalui hidden layer hingga output layer tanpa kembali lagi ke layer-layer sebelumnya. Proses ini terus berulang hingga data melewati semua hidden layer dan mencapai output layer. Metode feedforward pada jaringan saraf buatan memiliki keuntungan karena proses ini dapat dilakukan secara cepat dan efisien, serta memungkinkan jaringan saraf untuk mempelajari dan mengekspresikan pola-pola pada data input secara kompleks dan non-linear. Namun, metode ini juga memiliki kelemahan karena tidak dapat memperbarui bobot dan bias pada setiap neuron secara adaptif saat terjadi kesalahan pada output, sehingga proses pelatihan jaringan saraf buatan menggunakan metode backpropagation perlu dilakukan setelah proses feedforward selesai.

  9. Backpropagation: Proses memperbarui bobot dan bias di jaringan saraf dengan menghitung gradien kesalahan dan mengalirkan kesalahan ke belakang melalui jaringan untuk mengoptimalkan kinerja jaringan. Proses backpropagation ini dilakukan dengan mengalikan kesalahan pada output layer dengan turunan dari fungsi aktivasi pada setiap neuron pada hidden layer, kemudian nilai tersebut dikalikan dengan bobot yang terhubung dengan setiap neuron tersebut. Proses ini dilanjutkan hingga mencapai input layer, di mana bobot dan bias pada setiap neuron diperbarui menggunakan nilai kesalahan yang diperoleh dari proses backpropagation. Proses backpropagation dilakukan secara berulang hingga kesalahan pada output jaringan mencapai nilai yang diinginkan atau konvergen. Metode backpropagation memiliki keuntungan karena memungkinkan jaringan saraf buatan untuk mempelajari pola-pola kompleks dan menyesuaikan diri dengan data input yang berbeda secara adaptif, serta memperbaiki kesalahan pada output yang dihasilkan oleh jaringan. Namun, metode backpropagation juga memiliki beberapa kelemahan, di antaranya rentan terhadap overfitting pada data latih dan memerlukan waktu dan sumber daya komputasi yang cukup besar untuk melatih jaringan pada data yang besar dan kompleks.

  10. Epoch: Satu siklus pelatihan dimana seluruh data latih diberikan pada jaringan. Dalam satu epoch, setiap data latih diproses melalui proses feedforward dan backpropagation untuk memperbarui bobot dan bias pada setiap neuron dalam jaringan. Misalnya, jika terdapat 1000 data latih dan sebuah jaringan saraf buatan dilatih dengan menggunakan 10 epoch, maka seluruh data latih akan diproses sebanyak 10 kali dengan masing-masing epoch menghasilkan update bobot dan bias yang baru pada jaringan. Setelah setiap epoch selesai, kesalahan atau selisih antara output jaringan dengan target pada setiap data pelatihan akan dihitung dan digunakan untuk mengevaluasi kinerja jaringan, sehingga dapat dianalisis seberapa baik jaringan mempelajari pola pada data latih.

  11. Dropout: Teknik pencegahan overfitting dengan mengabaikan sejumlah neuron secara acak pada setiap epoch pelatihan. Neuron yang dihapus tidak berpartisipasi dalam perhitungan selama epoch tertentu, sehingga mengurangi ketergantungan antara neuron dan mencegah overfitting. Setiap neuron dihapus dengan probabilitas p selama pelatihan, di mana p adalah parameter dropout. Probabilitas ini biasanya diatur antara 0,2 dan 0,5, yang artinya setiap neuron memiliki kemungkinan antara 20% dan 50% untuk dihapus pada setiap epoch. Setelah pelatihan selesai, semua neuron dikembalikan ke jaringan saraf untuk memprediksi data uji.

  12. Gradient Descent: Metode optimisasi yang mencari bobot yang menghasilkan error terendah dengan menghitung gradien dari fungsi cost (loss function) dan mengubah bobot berdasarkan gradien yang dihitung. Algoritma Gradient Descent memanfaatkan gradien (turunan parsial) dari fungsi cost (biaya) terhadap setiap parameter (misalnya bobot dan bias) untuk menentukan arah penurunan fungsi cost. Algoritma ini memperbarui nilai setiap parameter secara iteratif dengan mengurangi gradien dari setiap parameter dikalikan dengan learning rate untuk mendapatkan bobot dan bias baru yang lebih optimal.

  13. Learning rate: Parameter yang menentukan seberapa besar bobot dan bias pada setiap neuron dalam jaringan diperbarui selama proses pelatihan. Learning rate mengontrol besarnya perubahan yang dilakukan pada setiap iterasi agar jaringan dapat belajar dan menyesuaikan diri dengan data latih dengan baik. Secara sederhana, learning rate dapat diartikan sebagai langkah yang diambil oleh jaringan untuk mencari solusi yang optimal. Pada saat pelatihan, learning rate digunakan untuk mengalikan gradien dari kesalahan dengan bobot pada setiap iterasi pelatihan. Hal ini dilakukan agar proses pelatihan dapat bergerak ke arah penurunan kesalahan pada setiap iterasi. Jika learning rate terlalu besar, maka gradien yang dihasilkan bisa melonjak naik atau turun secara acak, sehingga algoritma pelatihan tidak konvergen atau lambat.

  14. Loss function: Fungsi yang digunakan untuk mengukur seberapa baik jaringan saraf menghasilkan output yang sesuai dengan target yang diinginkan. Setelah melakukan feedforward, output yang dihasilkan oleh jaringan akan dibandingkan dengan nilai target menggunakan loss function. Jika output jaringan tidak sesuai dengan nilai target, loss function akan memberikan nilai kesalahan yang besar. Sebaliknya, jika output jaringan mendekati nilai target, maka nilai kesalahan pada loss function akan lebih kecil.

Proses Training pada ANN

  • Proses training (pemodelan) pada neural network dilakukan untuk mendapatkan bobot (\(w_i\)) terbaik.

  • Bobot (\(w_i\)) terbaik didapatkan dengan meminimumkan suatu loss function dengan algoritma optimisasi tertentu.

  • Banyaknya iterasi (ulangan) yang dilakukan untuk meng-update bobot menggunakan seluruh training data disebut epoch.

  • Proses update bobot dilakukan dengan algoritma backpropagation.

  • Kecepatan konvergensi proses train bisa diatur dengan learning rate yang nilainya antara 0 dan 1.

  • Semakin kecil learning rate, maka epoch yang dibutuhkan akan semakin banyak.

Langkah-langkah pada ANN:

  1. Inisiasi nilai synapse weights, bisa random ataupun dengan aturan tertentu.

  2. Lewatkan input pada neuron, kemudian kita akan mendapatkan nilai output. Kegiatan ini disebut feedforward.

  3. Nilai output (actual output) tersebut dibandingkan dengan desired output.

  4. Apabila nilai output sesuai dengan desired output, tidak perlu mengubah apa-apa.

  5. Apabila nilai output tidak sesuai dengan desired output, hitung nilai error (loss) kemudian lakukan perubahan terhadap learning parameter (synapse weight).

  6. Ulangi langkah-langkah ini sampai tidak ada perubahan nilai error, nilai error kurang dari atau sama dengan suatu threshold (biasanya mendekati 0), atau sudah mengulangi proses latihan sebanyak T kali (threshold).

Loss Function

Pendekatan generik untuk meminimumkan loss-function \(J(y_i, \hat{y_i})\) adalah dengan gradient descent yang disebut sebagai backpropagation.

Instalasi Keras dan TensorFlow pada R

Dalam konteks neural network, terdapat berbagai pustaka yang dapat digunakan untuk membuat model, salah satunya adalah Keras. Keras adalah pustaka open-source yang dapat digunakan untuk membuat model neural network pada berbagai bahasa pemrograman, termasuk R. Semua jenis neural network berdasarkan pemanfaatannya yang telah disebutkan di atas dapat diselesaikan dengan menggunakan Keras dan TensorFlow sebagai backend-nya.

Dalam tulisan ini, kita akan fokus pada pembuatan model neural network menggunakan Keras pada bahasa R. Tahapan yang akan dilakukan antara lain penyiapan data, pemodelan neural network, melatih model, mengevaluasi model, dan membuat grafik untuk melihat hasil pelatihan model.

Untuk menggunakan Keras pada R maka perlu menginstall package keras dan tensorflow (sebagai backend dari keras).

#install.packages("tensorflow")
#install.packages("keras")

TensorFlow dan Keras di R adalah wrapper yang memungkinkan pengguna R untuk menggunakan fungsi dan objek dari TensorFlow dan Keras yang ditulis dalam Python. Hal ini dapat dilakukan karena TensorFlow dan Keras memiliki API Python yang dapat digunakan dari R melalui paket reticulate yaitu package yang memungkinkan pengguna R berinteraksi dengan kode Python dan paket Python melalui R.

#library(reticulate)
#virtualenv_create("r-reticulate", python = install_python())

Selanjutnya untuk menginstall keras, tensorflow serta library pendukung lainnya pada virtual environment dapat dilakukan menggunakan kode berikut:

#tensorflow::install_tensorflow()
#keras::install_keras()

Neural Network (Contoh Model Klasifikasi)

Pada bagian pertama akan dibahas mengenai pemodelan neural network menggunakan Keras untuk permasalahan klasifikasi.

Penyiapan Data

Dataset yang digunakan yaitu data level obesitas yang tersedia di https://archive.ics.uci.edu/ dan dapat diunduh pada url berikut Obesity Level.

Data set ini terdiri dari 2.111 observasi dengan 17 peubah. Terdapat 9 peubah bertipe kategorik dan 8 peubah numerik. Peubah Nobeyesdad merupakan peubah respon bertipe kategorik dengan 7 kelas. Peubah ini menunjukkan kondisi berat badan seseorang mulai dari Insufficient_Weight hingga overweight_level_II. Peubah kategorik lainnya memiliki jumlah kategori bervariasi mulai dari 2 kategori hingga 5 kategori.

data <- read.csv("ObesityDataSet.csv", stringsAsFactors = T, )

head(data)

Menampilkan struktur data:

str(data)
## 'data.frame':    2111 obs. of  17 variables:
##  $ Gender                        : Factor w/ 2 levels "Female","Male": 1 1 2 2 2 2 1 2 2 2 ...
##  $ Age                           : num  21 21 23 27 22 29 23 22 24 22 ...
##  $ Height                        : num  1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
##  $ Weight                        : num  64 56 77 87 89.8 53 55 53 64 68 ...
##  $ family_history_with_overweight: Factor w/ 2 levels "no","yes": 2 2 2 1 1 1 2 1 2 2 ...
##  $ FAVC                          : Factor w/ 2 levels "no","yes": 1 1 1 1 1 2 2 1 2 2 ...
##  $ FCVC                          : num  2 3 2 3 2 2 3 2 3 2 ...
##  $ NCP                           : num  3 3 3 3 1 3 3 3 3 3 ...
##  $ CAEC                          : Factor w/ 4 levels "Always","Frequently",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ SMOKE                         : Factor w/ 2 levels "no","yes": 1 2 1 1 1 1 1 1 1 1 ...
##  $ CH2O                          : num  2 3 2 2 2 2 2 2 2 2 ...
##  $ SCC                           : Factor w/ 2 levels "no","yes": 1 2 1 1 1 1 1 1 1 1 ...
##  $ FAF                           : num  0 3 2 2 0 0 1 3 1 1 ...
##  $ TUE                           : num  1 0 1 0 0 0 0 0 1 1 ...
##  $ CALC                          : Factor w/ 4 levels "Always","Frequently",..: 3 4 2 2 4 4 4 4 2 3 ...
##  $ MTRANS                        : Factor w/ 5 levels "Automobile","Bike",..: 4 4 4 5 4 1 3 4 4 4 ...
##  $ NObeyesdad                    : Factor w/ 7 levels "Insufficient_Weight",..: 2 2 2 6 7 2 2 2 2 2 ...

Menampilkan ringkasan data:

summary(data)
##     Gender          Age            Height          Weight      
##  Female:1043   Min.   :14.00   Min.   :1.450   Min.   : 39.00  
##  Male  :1068   1st Qu.:19.95   1st Qu.:1.630   1st Qu.: 65.47  
##                Median :22.78   Median :1.700   Median : 83.00  
##                Mean   :24.31   Mean   :1.702   Mean   : 86.59  
##                3rd Qu.:26.00   3rd Qu.:1.768   3rd Qu.:107.43  
##                Max.   :61.00   Max.   :1.980   Max.   :173.00  
##                                                                
##  family_history_with_overweight  FAVC           FCVC            NCP       
##  no : 385                       no : 245   Min.   :1.000   Min.   :1.000  
##  yes:1726                       yes:1866   1st Qu.:2.000   1st Qu.:2.659  
##                                            Median :2.386   Median :3.000  
##                                            Mean   :2.419   Mean   :2.686  
##                                            3rd Qu.:3.000   3rd Qu.:3.000  
##                                            Max.   :3.000   Max.   :4.000  
##                                                                           
##          CAEC      SMOKE           CH2O        SCC            FAF        
##  Always    :  53   no :2067   Min.   :1.000   no :2015   Min.   :0.0000  
##  Frequently: 242   yes:  44   1st Qu.:1.585   yes:  96   1st Qu.:0.1245  
##  no        :  51              Median :2.000              Median :1.0000  
##  Sometimes :1765              Mean   :2.008              Mean   :1.0103  
##                               3rd Qu.:2.477              3rd Qu.:1.6667  
##                               Max.   :3.000              Max.   :3.0000  
##                                                                          
##       TUE                 CALC                        MTRANS    
##  Min.   :0.0000   Always    :   1   Automobile           : 457  
##  1st Qu.:0.0000   Frequently:  70   Bike                 :   7  
##  Median :0.6253   no        : 639   Motorbike            :  11  
##  Mean   :0.6579   Sometimes :1401   Public_Transportation:1580  
##  3rd Qu.:1.0000                     Walking              :  56  
##  Max.   :2.0000                                                 
##                                                                 
##                NObeyesdad 
##  Insufficient_Weight:272  
##  Normal_Weight      :287  
##  Obesity_Type_I     :351  
##  Obesity_Type_II    :297  
##  Obesity_Type_III   :324  
##  Overweight_Level_I :290  
##  Overweight_Level_II:290

Pengecekan missing value

Pada dataset tidak terdapat data hilang untuk semua peubah, sehingga tidak perlu penanganan.

colSums(is.na(data))
##                         Gender                            Age 
##                              0                              0 
##                         Height                         Weight 
##                              0                              0 
## family_history_with_overweight                           FAVC 
##                              0                              0 
##                           FCVC                            NCP 
##                              0                              0 
##                           CAEC                          SMOKE 
##                              0                              0 
##                           CH2O                            SCC 
##                              0                              0 
##                            FAF                            TUE 
##                              0                              0 
##                           CALC                         MTRANS 
##                              0                              0 
##                     NObeyesdad 
##                              0

Encoding Peubah Kategorik

Library yang diperlukan adalah keras dan caret. Libray keras digunakan untuk pemodelan neural network dan caret digunakan untuk proses encoding, partisi data serta menampilkan metrics evaluasi.

library(keras)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice

Library keras tidak dapat memproses secara langsung fitur kategorik dalam pemodelan Neural Network, sehingga perlu dilakukan encoding terlebih dahulu. Terdapat dua tipe yang biasa digunakan yaitu LabelEncoder dan OneHotEncoder (Peubah Dummy).
Proses OneHotEncoding pada keras dapat dilakukan menggunakan fungsi to_categorical. Proses ini akan merubah jumlah kolom peubah kategorik menjadi sebanyak kategori pada kolom tersebut.

Fungsi to_categorical akan mengonversi vektor kelas menjadi matriks dengan tipe data biner. Sebagai contoh, jika terdapat 3 kelas, maka matriks output akan memiliki 3 kolom dengan nilai 0 atau 1 pada setiap kolomnya. Saat menggunakan fungsi ini, kita biasanya mengurangi nilai vektor kelas dengan 1, hal ini dilakukan karena indeks pada matriks dimulai dari 0, sedangkan nilai kelas pada data biasanya dimulai dari 1.

# Merubah features kategorik menjadi OHE
data$Gender <- to_categorical(as.integer(data$Gender)-1)
data$family_history_with_overweight <- to_categorical(as.integer(data$family_history_with_overweight)-1)
data$FAVC <- to_categorical(as.integer(data$FAVC)-1)
data$CAEC <- to_categorical(as.integer(data$CAEC)-1)
data$SMOKE <- to_categorical(as.integer(data$SMOKE)-1)
data$SCC <- to_categorical(as.integer(data$SCC)-1)
data$CALC <- to_categorical(as.integer(data$CALC)-1)
data$MTRANS <- to_categorical(as.integer(data$MTRANS)-1)

# Contoh hasil OHE pada kolom MTRANS
head(data$MTRANS)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    0    0    0    1    0
## [2,]    0    0    0    1    0
## [3,]    0    0    0    1    0
## [4,]    0    0    0    0    1
## [5,]    0    0    0    1    0
## [6,]    1    0    0    0    0

Partisi Data dan Features Scaling.

Pembagian data latih dan data uji dapat menggunakan fungsi createDataPartition. Dataset akan dibagi menjadi 70% data latih dan 30% data uji.

Setiap fitur pada data latih dan data uji selanjutnya dilakukan scaling. Metode scaling yang kita gunakan adalah normalize (minmax scaling) dimana setiap peubah hasil scaling akan memiliki nilai pada interval 0-1. Proses ini dapat dilakukan menggunakan fungsi preProcess dengan mengatur parameter method=c("range"). Kita dapat juga melakukannya secara manual menggunakan formula sebagai berikut:

\[x_{i\;scaled}=\frac{x_i - min(x)}{max(x)-min(x)}\]

Kita juga perlu dilakukan encoding menggunakan fungsi to_categorica1. Untuk peubah respon pada model klasifikasi multikelas juga perlu kita lakukan one-hot encoding. Hal ini diperlukan karena output layer dari model memiliki jumlah neuron yang sama dengan jumlah kelas pada peubah respon tersebut. Misalnya, pada dataset ini memiliki 7 kelas, maka output layer akan memiliki 7 neuron. Setiap neuron pada output layer akan merepresentasikan probabilitas suatu observasi masuk ke masing-masing kelas tersebut.

# Membagi data menjadi data latih dan data uji dengan createDataPartition
set.seed(123)

train.index <- createDataPartition(data$NObeyesdad, p = 0.7, list = FALSE)
train <- data[train.index, ]
test <- data[-train.index, ]

# Melakukan Feature Scaling min max (0, 1)
preprocessParams <- preProcess(train[, -17], method=c("range"))
train_X <- as.matrix(predict(preprocessParams, train[, -17]))
test_X <- as.matrix(predict(preprocessParams, test[, -17]))

# OHE pada peubah target
train_y <- to_categorical(as.integer(train[, 17])-1)
test_y <- to_categorical(as.integer(test[, 17])-1)

Pemodelan dengan 1 Hidden Layer

Fungsi yang digunakan untuk membuat model neural network menggunakan keras adalah fungsi keras_model_sequential().

Pada keras, kita tidak menentukan secara khusus untuk input layer. Jumlah neuron pada input layer ditentukan melalui parameter input_shape pada hidden layer pertama. Nilai untuk parameter input_shape tersebut adalah sebanyak peubah penjelas atau features pada data yang digunakan.

Langkah selanjuutnya kita menambahkan 1 hidden layer pada model. Penambahan layer dilakukan menggunakan fungsi layer_dense. Sebagai contoh, hidden layer kita set memiliki 64 neuron berdasarkan nilai parameter units . Adapun fungsi aktivasi yang digunakan pada hidden layer ini adalah fungsi Rectified Linier Unit (ReLU).

Layer selanjutnya adalah output layer. Seperti yang dijelaskan pada bagian sebelumnya, untuk pemodelan klasifikasi jumlah neuron pada output layer ditentukan sebanyak jumlah kategori dari outputnya (dalam hal ini 7 kategori). Fungsi aktivasi yang dapat digunakan dalam klasifikasi multi kelas adalah fungsi aktivasi softmax.

Sebagai tambahan, pada klasifikasi biner juga dapat menggunakan softmax atau sigmoid. Adapun pada model regresi dapat menggunakan fungsi aktivasi linier atau ReLU. Selain itu terdapat beberapa fungsi aktivasi lainnya yang dapat digunakan sesuai domain output yang diharapkan. (Daftar Fungsi Aktivasi yang didukung Keras).

Proses selanjutnya, kita perlu memanggil fungsi compile untuk menentukan beberapa kriteria pelatihan model seperti loss function yang digunakan, optimizer, metrics serta beberapa kriteria lainnya. Beberapa kriteria yang kita atur pada model ini adalah sebagai berikut:

  1. Loss Function yang dapat digunakan pada kasus multikelas adalah categorical_crossentropy atau sparse_categorical_crossentropy. Pada contoh ini kita menggunakan categorical_crossentropy. (Daftar Loss Function yang didukung Keras).

  2. Optimizer : algoritma yang digunakan dalam penentuan nilai bobot dan bias selama proses pelatihan. Beberapa optimizer yang dapat digunakan adalah Stochastic Gradient Descent (SGD), Adam, RMSprop, dan Adagrad. (Daftar Optimizer yang didukung Keras).

  3. Parameter metrics digunakan untuk menentukan metrik evaluasi yang digunakan untuk mengukur performa model saat pelatihan dan pengujian. Metrik evaluasi yang umum digunakan pada model klasifikasi adalah accuracy.

# Membuat model neural network dengan 1 hidden layer
model <- keras_model_sequential() %>%
  layer_dense(units = 64, activation = "relu", input_shape = ncol(train_X)) %>% # Hidden Layer 1
  layer_dense(units = ncol(train_y), activation = "softmax")                    # Output Layer

# Mengkompilasi model
model %>% compile(
  loss = "categorical_crossentropy",
  optimizer = "adam",
  metrics = c("accuracy")
)

print(model)
## Model: "sequential"
## ________________________________________________________________________________
##  Layer (type)                       Output Shape                    Param #     
## ================================================================================
##  dense_1 (Dense)                    (None, 64)                      2048        
##  dense (Dense)                      (None, 7)                       455         
## ================================================================================
## Total params: 2,503
## Trainable params: 2,503
## Non-trainable params: 0
## ________________________________________________________________________________

Langkah selanjutnya adalah melakukan pelatihan model menggunakan fungsi fit. Beberapa parameter yang dapat diataur adalah epochs, batch_size dan validation_split.

  1. Epoch: mengacu pada satu putaran pelatihan pada seluruh data latih yang ada. Dalam setiap epoch, model dijalankan melalui seluruh data pelatihan sebanyak satu kali. Dimana pada setiap iterasi, parameter model diperbarui dengan menggunakan algoritma optimasi yang tentukan.

  2. Batch: Jumlah sampel data yang dihitung dalam satu iterasi pada saat pelatihan. Jumlah sampel data dalam batch ini akan mempengaruhi waktu komputasi dan memori yang dibutuhkan dalam proses pelatihan model. Semakin besar batch size, semakin sedikit iterasi yang dibutuhkan untuk menyelesaikan satu epoch, namun membutuhkan memori yang lebih besar.

Kita dapat juga menampilkan plot yang menunjukkan hasil pelatihan pada setiap epoch menggunakan fungsi plot.

# Melatih model
history <- model %>% fit(
  train_X, train_y,
  shuffle = T,
  epochs = 100,          
  batch_size = 32,       
  validation_split = 0.2
)

# Menampilkan plot pembelajaran model pada setiap epoch
plot(history)

Model yang sudah dilatih selanjutnya perlu dievaluasi menggunakan data uji. Proses evaluasi ini dapat dilakukan menggunakan fungsi evaluate.

# Mengevaluasi model menggunakan data uji
scores <- model %>% evaluate(test_X, test_y)
print(scores)
##      loss  accuracy 
## 0.4556510 0.8560126

Pemodelan dengan 2 Hidden Layer dan Dropout

Untuk membuat model Neural Network dengan 2 hidden layer dapat dilakukan dengan menambahkan lagi fungsi layer_dense pada model sebelum output layer. Contoh di bawah ini, menunjukkan model dengan 2 hidden layer. Hidden Layer pertama memiliki 128 neuron dengan fungsi aktivasi ReLU sementara hidden layer kedua memiliki neuron sebanyak 64 unit dengan fungsi aktivasi ReLU.

Selain itu, pada layer pertama juga ditambahkan layer_dropout dengan nilai rate sebesar 0.2. Fungsi layer_dropout merupakan salah satu bentuk regularisasi pada model neural network untuk menghindari masalah overfitting. Fungsi ini secara acak akan mengabaikan sebagian unit (neuron) pada layer sebelumnya dalam proses pelatihan. Pada contoh ini setiap neuron pada hidden layer pertama memiliki peluang 20% untuk diabaikan dalam setiap iterasi. Hal yang sama juga kita lakukan pada hidden layer ke-2. Proses ini bertujuan membuat model untuk belajar dengan cara yang lebih robust dan mengurangi ketergantungan pada unit-unit tertentu, dengan harapan menghasilkan model yang lebih tergeneralisasi.

# Membuat model neural network dengan 2 hidden layer
model <- keras_model_sequential() %>%
  layer_dense(units = 128, activation = "relu", input_shape = ncol(train_X)) %>%
  layer_dropout(0.2) %>%
  layer_dense(units = 64, activation = "relu") %>%
  layer_dropout(0.2) %>%
  layer_dense(units = ncol(train_y), activation = "softmax")

# Mengkompilasi model
model %>% compile(
  loss = "categorical_crossentropy",
  optimizer = "adam",
  metrics = c("accuracy")
)

# Melakukan tahapan pelatihan model
history <- model %>% fit(
  train_X, train_y,
  shuffle = T,
  epochs = 100,
  batch_size = 32,
  validation_split = 0.2, 
  verbose = F       # tidak menampilkan teks ouput pada setiap epoch
)

print(model)
## Model: "sequential_1"
## ________________________________________________________________________________
##  Layer (type)                       Output Shape                    Param #     
## ================================================================================
##  dense_4 (Dense)                    (None, 128)                     4096        
##  dropout_1 (Dropout)                (None, 128)                     0           
##  dense_3 (Dense)                    (None, 64)                      8256        
##  dropout (Dropout)                  (None, 64)                      0           
##  dense_2 (Dense)                    (None, 7)                       455         
## ================================================================================
## Total params: 12,807
## Trainable params: 12,807
## Non-trainable params: 0
## ________________________________________________________________________________
# Menampilkan plot pembelajaran model pada setiap epoch
plot(history)

# Mengevaluasi model menggunakan data uji
scores <- model %>% evaluate(test_X, test_y)
print(scores)
##     loss accuracy 
## 0.213617 0.931962

Melakukan Prediksi

Prediksi dapat dilakukan denngan memanggil fungsi predict. Pada model dengan output multikelas menggunakan fungsi aktivasi softmax, hasil prediksi yang diberikan berupa matriks dengan jumlah kolom sebanyak jumlah kategori outputnya. Setiap kolom menunjukkan nilai peluang suatu observasi masuk ke dalam kategori kolom tersebut.

prediksi <- predict(model, test_X)
head(prediksi)
##              [,1]         [,2]         [,3]         [,4]         [,5]
## [1,] 8.492378e-08 4.888855e-02 2.868772e-06 2.838536e-12 3.499116e-10
## [2,] 7.730869e-17 2.214916e-08 9.404699e-01 8.131683e-04 1.040632e-02
## [3,] 9.079191e-16 9.549339e-06 8.970548e-05 1.664102e-07 1.817597e-10
## [4,] 3.409130e-17 3.879310e-09 9.925724e-01 5.138301e-05 9.300961e-05
## [5,] 7.046352e-04 9.988641e-01 3.972410e-13 2.157903e-18 2.114133e-17
## [6,] 3.195990e-08 1.534196e-02 1.331936e-08 3.123061e-16 3.846373e-16
##              [,6]         [,7]
## [1,] 3.172117e-02 9.193873e-01
## [2,] 7.064972e-05 4.823997e-02
## [3,] 3.168720e-03 9.967319e-01
## [4,] 2.268970e-04 7.056444e-03
## [5,] 4.298771e-04 1.398158e-06
## [6,] 9.796723e-01 4.985585e-03

Untuk menentukan kategori dengan peluang terbesar kita dapat menggunakan fungsi which.max yang dikombinasikan dengan fungsi apply.

label_pred <- apply(prediksi, 1, which.max)
label_pred
##   [1] 7 3 7 3 2 6 6 6 7 2 7 2 2 2 2 2 2 1 3 2 3 2 2 1 2 7 2 6 2 2 6 3 2 2 2 1 2
##  [38] 6 7 6 2 2 6 3 6 2 2 2 2 2 6 6 4 2 7 6 2 6 3 6 2 4 7 3 2 2 6 2 7 4 6 6 2 2
##  [75] 2 2 2 2 2 7 3 6 1 2 2 3 2 1 3 2 2 2 2 2 7 2 2 2 2 6 2 3 2 2 2 2 2 2 6 2 2
## [112] 7 2 7 7 2 2 1 3 1 2 6 2 2 2 2 6 7 3 1 2 2 7 2 2 6 2 2 1 2 2 2 6 2 2 6 2 2
## [149] 2 7 6 2 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [186] 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [223] 1 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
## [260] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
## [297] 7 7 7 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
## [334] 7 7 7 7 7 7 7 7 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3
## [371] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 7 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [408] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [445] 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [482] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [519] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [556] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [593] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [630] 5 5 5
label_true <- as.integer(test$NObeyesdad)
label_true
##   [1] 2 3 7 3 2 2 6 7 7 2 7 2 2 2 2 2 2 2 4 2 7 1 2 1 2 7 2 6 2 2 2 3 2 6 2 2 2
##  [38] 7 7 7 2 2 2 3 3 2 2 2 2 2 6 7 4 2 7 7 2 2 3 6 2 5 3 3 2 2 6 2 7 4 2 7 2 2
##  [75] 2 2 1 2 6 7 3 6 1 2 2 3 2 2 3 2 2 1 2 1 6 2 2 2 2 6 2 3 2 2 2 2 2 2 6 6 2
## [112] 7 6 7 7 2 2 2 3 1 2 7 1 2 2 2 2 3 3 1 2 2 3 2 2 2 2 2 1 2 2 2 7 2 2 6 2 2
## [149] 6 7 2 2 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [186] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [223] 1 1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
## [260] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
## [297] 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
## [334] 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3
## [371] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [408] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [445] 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [482] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
## [519] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [556] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [593] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## [630] 5 5 5

Evaluasi Model

Kita juga dapat menampilkan confussion matrix menggunakan fungsi confusionMatrix untuk membandingkan hasil prediksi dengan kategori sebenarnya.

confusionMatrix(as.factor(label_true), as.factor(label_pred))
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2   3   4   5   6   7
##          1  75   6   0   0   0   0   0
##          2   4  73   0   0   0   8   1
##          3   0   0 100   0   0   1   4
##          4   0   0   1  88   0   0   0
##          5   0   0   0   1  96   0   0
##          6   0   5   0   0   0  81   1
##          7   0   0   3   0   0   8  76
## 
## Overall Statistics
##                                           
##                Accuracy : 0.932           
##                  95% CI : (0.9094, 0.9503)
##     No Information Rate : 0.1646          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9205          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3 Class: 4 Class: 5 Class: 6
## Sensitivity            0.9494   0.8690   0.9615   0.9888   1.0000   0.8265
## Specificity            0.9892   0.9763   0.9905   0.9982   0.9981   0.9888
## Pos Pred Value         0.9259   0.8488   0.9524   0.9888   0.9897   0.9310
## Neg Pred Value         0.9927   0.9799   0.9924   0.9982   1.0000   0.9688
## Prevalence             0.1250   0.1329   0.1646   0.1408   0.1519   0.1551
## Detection Rate         0.1187   0.1155   0.1582   0.1392   0.1519   0.1282
## Detection Prevalence   0.1282   0.1361   0.1661   0.1408   0.1535   0.1377
## Balanced Accuracy      0.9693   0.9227   0.9760   0.9935   0.9991   0.9076
##                      Class: 7
## Sensitivity            0.9268
## Specificity            0.9800
## Pos Pred Value         0.8736
## Neg Pred Value         0.9890
## Prevalence             0.1297
## Detection Rate         0.1203
## Detection Prevalence   0.1377
## Balanced Accuracy      0.9534

Menyimpan dan Memuat Model

Model yang telah dibuat, dapat disimpan ke dalam format HDF5 menggunakan fungsi save_model_hdf5. Selanjutnya untuk memuat model dapat menggunakan fungsi load_model_hdf5. Model yang sudah dimuat, dapat digunakan untuk memprediksi data baru menggunakan fungsi predict ataupun dapat juga melakukan proses re-train model dengan data baru menggunakan fungsi fit.

# Menyimpan model dalam format HDF5
model %>% save_model_hdf5("model_nn.h5")

# Memuat model dari file HDF5
model <- load_model_hdf5("model_nn.h5")

print(model)
## Model: "sequential_1"
## ________________________________________________________________________________
##  Layer (type)                       Output Shape                    Param #     
## ================================================================================
##  dense_4 (Dense)                    (None, 128)                     4096        
##  dropout_1 (Dropout)                (None, 128)                     0           
##  dense_3 (Dense)                    (None, 64)                      8256        
##  dropout (Dropout)                  (None, 64)                      0           
##  dense_2 (Dense)                    (None, 7)                       455         
## ================================================================================
## Total params: 12,807
## Trainable params: 12,807
## Non-trainable params: 0
## ________________________________________________________________________________

Neural Network (Contoh Model Regresi)

Penerapan neural network untuk model regresi hampir sama dengan pemodelan klasifikasi. Perbedaannya hanya pada pengaturan output layer serta loss function dan metrics yang digunakan. Pada pemodelan regresi dimana peubah respon bertipe numerik maka jumlah units pada output layer cukup dibuat sebanyak 1 unit. Adapun untuk fungsi aktivasinya dapat menggunakan fungsi aktivasi linear.

Berikut contoh pemodelan neural network pada data dengan respon numerik.

Penyiapan data

Dataset yang digunakan untuk contoh adalah dataset abalone dan dapat diunduh di sini. Tujuan dari pemodelan ini adalah memprediksi umur dari abalone berdasarkan beberapa karakteristik pada hewan tersebut.

Beradasarkan hasil penelitian, umur abalone dapat ditentukan dengan menghitung jumlah ring di dalam tubuh abalone dan menambahkannya dengan 1.5. Namun demikian, untuk menentukan jumlah ring tersebut merupakan pekerjaan yang sulit karena harus melakukan pembedahan pada abalone. Oleh karena itu, dengan memanfaatkan karakteristik lainnya kita akan membangun model prediksi untuk menentukan Umur dari abalone.

Memuat package:

library(keras)
library(caret)

Memuat data:

data.ab <- read.csv('abalone.csv', stringsAsFactors = T)
head(data.ab)
str(data.ab)
## 'data.frame':    4177 obs. of  9 variables:
##  $ Sex           : Factor w/ 3 levels "F","I","M": 3 3 1 3 2 2 1 1 3 1 ...
##  $ Length        : num  0.455 0.35 0.53 0.44 0.33 0.425 0.53 0.545 0.475 0.55 ...
##  $ Diameter      : num  0.365 0.265 0.42 0.365 0.255 0.3 0.415 0.425 0.37 0.44 ...
##  $ Height        : num  0.095 0.09 0.135 0.125 0.08 0.095 0.15 0.125 0.125 0.15 ...
##  $ Whole.weight  : num  0.514 0.226 0.677 0.516 0.205 ...
##  $ Shucked.weight: num  0.2245 0.0995 0.2565 0.2155 0.0895 ...
##  $ Viscera.weight: num  0.101 0.0485 0.1415 0.114 0.0395 ...
##  $ Shell.weight  : num  0.15 0.07 0.21 0.155 0.055 0.12 0.33 0.26 0.165 0.32 ...
##  $ Rings         : int  15 7 9 10 7 8 20 16 9 19 ...

Pengecekan Missing Value

colSums(is.na(data.ab))
##            Sex         Length       Diameter         Height   Whole.weight 
##              0              0              0              0              0 
## Shucked.weight Viscera.weight   Shell.weight          Rings 
##              0              0              0              0

Menambah kolom Age dan menghapus kolom Rings:

Berdasarkan jurnal rujukan pada dataset ini, umur dari abalone dapat ditentukan dengan menambahkan nilai 1.5 dari peubah Rings. Oleh karena itu, untuk contoh ini kita akan membuat peubah baru dengan nama Age serta menghapus peubah Rings.

# Menambah kolom `Age`
data.ab$Age <- data.ab$Rings + 1.5
# Menghapus kolom `Rings`
data.ab$Rings <- NULL

head(data.ab)

One-Hot Encoding Kolom Sex:

Seperti sebelumnya, kita perlu melakukan encoding pada peubah kategorik. Terdapat 1 peubah kategorik pada dataset yaitu peubah Sex yang terdirid ari 3 kategori (Male, Female, dan Infant).

data.ab$Sex <- to_categorical(as.integer(data.ab$Sex)-1)

head(data.ab$Sex)
##      [,1] [,2] [,3]
## [1,]    0    0    1
## [2,]    0    0    1
## [3,]    1    0    0
## [4,]    0    0    1
## [5,]    0    1    0
## [6,]    0    1    0

Partisi Data dan Features Scaling

# Membagi data menjadi data latih dan data uji dengan createDataPartition
set.seed(123)

train.index <- createDataPartition(data.ab$Age, p = 0.7, list = FALSE)
train <- data.ab[train.index, ]
test <- data.ab[-train.index, ]

# Melakukan Feature Scaling min max (0, 1)
preprocessParams <- preProcess(train[, -9], method=c("range"))
train_X <- as.matrix(predict(preprocessParams, train[, -9]))
test_X <- as.matrix(predict(preprocessParams, test[, -9]))

train_y <- train[, 9]
test_y <- test[, 9]

Pemodelan Neural Network

Pengaturan model yang akan digunakan adalah menggunakan 2 hidden layer dimana masing-masing layer memiliki 64 neuron. Selain itu, untuk menghindari overfitting, kita tambahkan dropout pada masing-masing layer dengan rate=0.3. Adapun untuk output layer menggunakan fungsi aktivasi linear dengan 1 neuron.

Pengaturan lainnya untuk proses kompilasi model yaitu loss menggunakan nilai mean_squared_error, optimizer menggunakan adam serta untuk metrics menggunakan mean_squared_error dan mean_absolute_error.

# Membuat model neural network dengan 2 hidden layer
model <- keras_model_sequential() %>%
  layer_dense(units = 64, activation = "relu", input_shape = ncol(train_X)) %>%
  layer_dropout(0.3) %>%
  layer_dense(units = 64, activation = "relu") %>%
  layer_dropout(0.3) %>%
  layer_dense(units = 1, activation = "linear")

# Mengkompilasi model
model %>% compile(
  loss = "mean_squared_error",
  optimizer = "adam",
  metrics = list("mean_squared_error", "mean_absolute_error")
)

# Melakukan tahapan pelatihan model
history <- model %>% fit(
  train_X, train_y,
  shuffle = T,
  epochs = 50,
  batch_size = 32,
  validation_split = 0.2
)

print(model)
## Model: "sequential_2"
## ________________________________________________________________________________
##  Layer (type)                       Output Shape                    Param #     
## ================================================================================
##  dense_7 (Dense)                    (None, 64)                      704         
##  dropout_3 (Dropout)                (None, 64)                      0           
##  dense_6 (Dense)                    (None, 64)                      4160        
##  dropout_2 (Dropout)                (None, 64)                      0           
##  dense_5 (Dense)                    (None, 1)                       65          
## ================================================================================
## Total params: 4,929
## Trainable params: 4,929
## Non-trainable params: 0
## ________________________________________________________________________________
# Menampilkan plot pembelajaran model pada setiap epoch
plot(history)

Melakukan Prediksi

# Melakukan prediksi
prediksi <- predict(model, test_X)
head(prediksi)
##           [,1]
## [1,]  9.484716
## [2,]  9.253199
## [3,] 15.301865
## [4,] 12.660007
## [5,] 10.981904
## [6,]  9.433583

Evaluasi Model

# Mengevaluasi model menggunakan data uji
scores <- model %>% evaluate(test_X, test_y)
print(scores)
##                loss  mean_squared_error mean_absolute_error 
##            5.632185            5.632185            1.556304

Kita juga dapat melihat performa model menggunakan fungsi postResample dari caret.

keras_train <- model %>% predict(train_X)
keras_test <- model %>% predict(test_X)

postResample(keras_train[,1], train$Age)
##      RMSE  Rsquared       MAE 
## 2.1497876 0.5596344 1.4919604
postResample(keras_test[,1], test$Age)
##      RMSE  Rsquared       MAE 
## 2.3732227 0.4833375 1.5563045

Referensi

Alkahfi, C. (Feb 19, 2023). Model Neural Network pada R Menggunakan Library Keras. Retrieved from: https://sainsdata.id/uncategorized/2630/model-neural-network-pada-r-menggunakan-library-keras/

Keras R Documentation : https://www.rdocumentation.org/packages/keras/versions/2.11.0

Pichler, M. (June 6, 2018). An Introduction to machine learning with Keras in R. Retrieved from: https://www.r-bloggers.com/2018/06/an-introduction-to-machine-learning-with-keras-in-r/

Sadik, K. (2022). Artificial Neural Network [Slide Kuliah STA1582 Pembelajaran Mesin Statistika IPB University]

Sallan, J. M. (May 17, 2020). Neural networks. Retrieved from: https://rpubs.com/jmsallan/nn_intro