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:
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.
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.
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.
Klasifikasi: ANN dapat digunakan untuk mengklasifikasikan data ke dalam kategori yang berbeda. Misalnya, ANN dapat digunakan untuk mengklasifikasikan email sebagai spam atau bukan spam.
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.
Pemrosesan Sinyal: ANN dapat digunakan untuk memproses sinyal seperti suara atau gambar. Misalnya, ANN dapat digunakan untuk memfilter suara bising dalam sebuah rekaman.
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:
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
Inisiasi nilai synapse weights, bisa random ataupun dengan aturan tertentu.
Lewatkan input pada neuron, kemudian kita akan mendapatkan nilai output. Kegiatan ini disebut feedforward.
Nilai output (actual output) tersebut dibandingkan dengan desired output.
Apabila nilai output sesuai dengan desired output, tidak perlu mengubah apa-apa.
Apabila nilai output tidak sesuai dengan desired output, hitung nilai error (loss) kemudian lakukan perubahan terhadap learning parameter (synapse weight).
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)
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