Artificial Neural Network (ANN) dengan R
Asslamualaikum Wr.Wb
Kali ini kita akan mencoba melakukan klasifikasi dengan metode ANN, dimana sebelumnya pada artikel saya [disini ] sudah menjelaskan klasifikasi dengan menggunakan Naive Bayes Classification, data yang digunakan sama yaitu Heart Diseases UCI. Sebelumnnya mari kita mengenal lebih dekat ANN dengan melihat penjelasan berikut.
Artificial Neural Network (ANN)
Artificial Neural Network (ANN) atau Jaringan Saraf Tiruan (JST) merupakan suatu pendekatan metode AI lainnya. JST merupakan suatu model kecerdasan yang diilhami dari struktur otak manusia dan kemudian diimplementasikan menggunakan program computer yang mampu menyelesaikan sejumlah proses perhitungan selama proses pembelajaran berlangsung. JST salah satu representasi buatan otak manusia, hal ini dikarenakan pemrosesan informasi terletak pada suatu neuron yang memiliki sinyal. Jaringan neuron terdiri atas kumpulan grup neuron yang tersusun dalam lapisan antara lain:
- Lapisan input (Input Layer): berfungsi sebagai penghubung jaringan ke dunia luar (sumber data).
- Lapisan tersembunyi (hidden Layer): Suatu jaringan dapat memiliki lebih dari satu hidden layer atau bahkan bisa juga tidak memilikinya sama sekali.
- Lapisan Output (Output Layer): Prinsip kerja neuron — neuron pada lapisan ini sama dengan prinsip kerja neuron — neuron pada lapisan tersembunyi (hidden layer) dan di sini juga digunakan fungsi Sigmoid, tapi keluaran dari neuron pada lapisan ini sudah dianggap sebagai hasil dari proses
untuk penjelasan lebih lengkap bisa dipahami pada artikel [disini] .
Data:
Data yang digunakan adalah Heart Diseases UCI yaitu data pasien yang memiliki penyakit jantung atau tidak. Data dapat didownload link berikut:
https://www.kaggle.com/ronitf/heart-disease-uci
Keterangan variabel;
→age: umur (tahun)
→sex: jenis kelamin (1 = laki-laki; 0 = perempuan)
→cp: tipe nyeri dada
→trestbps: tekanan darah istirahat (dalam mm Hg saat masuk ke rumah sakit)
→kol: serum kolestoral dalam mg / dl
→fbs : gula darah puasa> 120 mg / dl → (1 = benar; 0 = salah)
→restecg: hasil elektrokardiografi istirahat
→thalach: detak jantung maksimum
→exang: angina yang diinduksi olahraga (1 = ya; 0 = tidak)
→oldpeak: ST depression induced by exercise relative to rest
→slope: the slope of the peak exercise ST segment
→ca: jumlah pembuluh darah utama (0–3) diwarnai dengan fluoroskopi
→thal: 3 = normal; 6 = fixed defect; 7 = reversible defect
→target: memiliki penyakit atau tidak (1 = ya, 0 = tidak)
Goals:
Membuat model untuk memprediksi apakah pasien masuk di kategori terkena penyakit jantung atau tidak?
Yuk langsung saja…
Langkah 1: Memasukkan Data
setelah data di download, masukkan data menggunakan read.csv atu bisa menggunakan cara lain. file = "D:\\KULIAH\\semester 5\\BIML\\uas\\heart.csv" merupakan alamat file direktori penyimpanan data.
heart<- read.csv(file = "D:\\KULIAH\\semester 5\\BIML\\uas\\heart.csv", sep="")
View(heart)
kemudian gunaan perintah berikut untuk melihat detile data.
dim(heart) #melihat dimensi data
class(heart) #melihat class data
head(heart,6) #melihat 6 data teratas
str(heart) #melihat struktur data
pada data awal, variabel target masih terbaca integer, maka kita ganti struktur varabel menjadi factor sebagai berikut.
heart<-transform(heart,target = as.factor(target))
str(heart)
Langkah 2: Statistika Deskriptif
Sebelum melakukan klasifikasi menggunakan naive bayes, mari kita lihat terlebih dahulu sekilas statistik deskriptif dari data penyakit jantung.
Kita akan melihat dari data berapa pasien yang mengidap penyakit jantung.
heart.target.value_counts()
Diketauhi pasien yang terkena penyakit jantung sebanyak 165 dari 303 pasien. ringkasan statistik data.
summary(heart)
OKE, langsung saja kita melakukan klasifikasi menggunakan ANN
Langkah 3: Memanggil packages nnet
jika packages belum terinstal, maka dapat menginstall terlebih dahulu menggunakan perintah install.packages(“nnet”)
library(nnet)
Langkah 4: membagi data train dan test
pada kasus ini data training dibagi dengan perbandingan 75:25 yaitu:
→ data training=25%
→ data testing=75%
disini saya menggunakan set.seed sebanyak 12. Nilai set.seed menunjukan berapa kali data dilakukan pengacakan. banyaknya pengacakan bebas tergantung peneliti. Tapi, untuk pelajaran kali ini disarankan untuk menggunakan 12 agar hasil random yang didapatkan sama.
n <- round(nrow(heart)*0.75);n
set.seed(12)
samp=sample(1:nrow(heart),n)
head(samp)
setelah itu pisahkan masing-masing data training dan testing. Dimana data training untuk membangun model, sedangkan data testing untuk menguji model atau mem-validasi.
heart.train = heart[samp,]
heart.test = heart[-samp,]
dim(heart.train)
dim(heart.test)
Langkah 5: Klasifikasi ANN
langkah selanjutnya yaitu membangun model klasifikasi dengan ANN.
#nnet
heart1<-nnet(target~., data = heart.train, size=2, decay=5e-4, maxit=200)
heart1
dari mesin heart1 diketahui 13-2-1 network → 13 variabel input-2 hidden layer - 1 variabel output dan 31 bobot.
Visualisasi jaringan syaraf tiruan(ANN) menggunakan website didalam GIS yang bisa digunakan membuat plot.
library(devtools)
library(reshape)
source_url('https://gist.githubusercontent.com/fawda123/7471137/raw/466c1474d0a505ff044412703516c34f1a4684a5/nnet_plot_ipdate.r')
plot.nnet(heart1)
dari visualisasi ANN diatas dapat diketahui kita memiliki 14 input yaitu variabel independen age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca,thal. Kemudian ada output yaitu variabel target sebagai variabel independen. jumlah layer hidden sebanyak 2 yaitu H1, H2. Didalam setiap layer ada node bias yaitu B1 dan B2.
Garis-garis penghubung merupakan bobot, terdapat 31 bobot. Pada ANN bobot selalu diupdate setiap proses, sehingga errornya kecil. berikut adalah nilai masing-masing bobot.
kemudian melakukan klasifikasi menggunakan data testing.
y<-heart.test$target
p<-predict(heart1, heart.test, type="class")
melihat hasil prediksi menggunakan data testing.
data.frame(y,p)
Confussion Matrix. Confusion matrix merupakan matrik yang berisi ketepatan prediksi.
tabelhasil<-table(y,p)
tabelhasil
Langkah 6: Melihat Akurasi Model
nilai 76 pada sintaks dibawah adalah jumlah data testing.
#akurasi
sum(diag(table(y,p)))/76
jumlaherror<-mean(y!=p)
jumlaherror
dari hasil akurasi diketahui mesin(heart1) dalam mengklasifikasi data testing mengasilkan akurasi sebesar 78% dan miss klasifikasi sebesar 21%, yang artinya mesin sudah baik dalam memprediksikan pasien penyakit jantung.
Langkah 7: Prdiksi Data Baru
Kemudian kita coba menggunakan mesin heart1 untuk mengklasifikasikan data baru. Digunakan nilai berikut.
### mencoba klasifikasi dengan mesin heart1 #####
data.baru<-data.frame(age=50, sex=0, cp=2, trestbps=145, chol=220,
fbs=0, restecg=1, thalach=140,exang=0,
oldpeak=1.4, slope=1, ca=0, thal=2)
data.baru
dilakukan klasifikasi menggunakan mesin heart1
prediksi<-predict(heart1, data.baru)
prediksi
didapatkan nilai probabilitas yaitu sebesar 0,9756 yang artinya lebih mendekati 1. Maka dapat disimpulkan pasien dengan ciri-ciri data baru diatas diprediksi mengidap penyakit jantung.
Langkah 8: Melihat Kesalahan Klasifikasi
Dibuat fungsi untuk melihat perbedaan dari masing-masing jumlah node pada hidden layer. Kesalahan prediksi adalah nilai dari target yang seharusnya tidak sama dengan hasil prediksinya.
#membuat fungsi untuk mesin heart1
errorklasifikasi<-function(jumlahhidden)
{
heart1<-nnet(target~.,data = heart.train,size=jumlahhidden,
decay=5e-4,trace=F)
y<-heart.test$target
p<-predict(heart1,heart.test,type = "class")
err<-mean(y!=p)
c(jumlahhidden,err)
}
errorklasifikasi(2)
errorklasifikasi(3)
errorklasifikasi(4)
errorklasifikasi(5)
hasilakhir<-t(sapply(2:10,FUN=errorklasifikasi))
hasilakhir
dicobakan node hiden layer sebanyak 2,3,4,5,6,7,8,9,10 menghasilkan nilai error klasifikasi sebagai berikut.
kemudian hasil akhir di tampilkan dengan plot.
plot(hasilakhir,type = "b", xlab = "jumlah hidden unit", ylab = "error", main = "plot jumlah hidden vs error")
ketika jumlah node pada hidden layernya sebanyak 2 terjadi error klasifikasi sebsedar 0,3421 dst.. Jadi dari plot diatas, dapat dilihat jumlah node pada hidden layer sebaiknya 6.
cukup sekian terimakasih :))