library(dplyr)
library(knitr)
library(caret)
library(tidyverse)
library(keras)
library(neuralnet)
library(rsample)Kali ini saya akan mengambail dataset Zalando’s fashion yang berasal dari kaggle di url https://www.kaggle.com/zalando-research/fashionmnist, dataset ini berisi gambar dari 10 kategori seperti tas, baju, celana panjang, dan sebagainya. Dataset ini akan digunakan dalam pemodelan machine learning neural network untuk mendeteksi gambar gambar yang ada didalam dataset
Dalam kasus ini kita akan menggunakan model deep learning yang merupakan bagian dari machine learning. Deep learning dirancang untuk menganalisa data dengan struktur logika yang mirip dengan bagaimana manusia mengambil keputusan. Untuk dapat mencapai kemampuan tersebut, deep learning menggunakan struktur algoritma yang disebut artificial neural network (ANN). Dan model ini dapat memproses banyak jumlah data: Data yang terstuktur maupun tidak terstruktur seperti gambar, teks, suara.
Kita akan membaca data test dan train terlebih dahulu dan menyimpan data tersebut kedalam fashion dan fashion_test.
fashion <- read.csv("data_input/train.csv")
fashion_test <- read.csv("data_input/test.csv")Kemudian kita akan membagi dateset fashion menjadi dua subset yaitu data train dan data test/data validasi. Dan kita akan memisahlan data dengan proporsi 80% untuk data train dan 20% untuk data test.
RNGkind(sample.kind = "Rounding")## Warning in RNGkind(sample.kind = "Rounding"): non-uniform 'Rounding' sampler
## used
set.seed(100)
index <- initial_split(data = fashion, prop = 0.8, strata = "label") # stratified random sampling
fsh_train <- training(index)
fsh_test <- testing(index)Kita akan mengecek isi dari kelas target yang kita miliki
unique(fsh_train$label)## [1] 2 9 6 0 3 4 5 8 7 1
Disini kita akan melihat 30 data yang ada didalam dataset, dan menampilkan kedalam bentuk gambar.
class_names <- c("zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine")vizTrain <- function(input, idx){
dimmax <- sqrt(ncol(fsh_train[,-1]))
dimn <- ceiling(sqrt(nrow(input)))
par(mfrow=c(dimn, dimn), mar=c(0, 0, 1.5, 0))
for (i in 1:nrow(input)){
m1 <- matrix(input[i,2:ncol(input)], nrow=dimmax, byrow=T)
m1 <- apply(m1, 2, as.numeric)
m1 <- t(apply(m1, 2, rev))
image(1:dimmax,
1:dimmax,
m1, col=gray((0:255)/255),
xaxt = 'n',
yaxt = 'n',
main = paste(class_names[fsh_train$label[idx + i - 1] + 1]))
}
}vizTrain(input = fsh_train[1:30,], idx = 1)Terdapat beberapa pre-processing yang perlu dilakukan sebelum data dapat dimasukkan ke framework keras.
train <- data.matrix(fsh_train)
test <- data.matrix(fsh_test)# prediktor
train_x <- train[, -1]
test_x <- test[, -1]
# target
train_y <- train[, 1]
test_y <- test[, 1]Framework keras menerima data dalam bentuk array. Maka kita akan merubah data prediktor yang berbentuk matrix kedalam bentuk array menggunakan array_reshape().
# reshape array data train
train_x_keras <- array_reshape(x = train_x, dim = c(nrow(train_x), ncol(train_x)))
# reshape array data test
test_x_keras <- array_reshape(x = test_x, dim = c(nrow(test_x), ncol(test_x)))# scaling min-max normalization
train_x_keras <- train_x_keras/255
# scaling min-max normalization
test_x_keras <- test_x_keras/255Ubah target (data kategorik) menjadi variable dummy menggunakan one hot encoding, bisa menggunakan fungsi to_categorical():
# data categorical
train_y_keras <- to_categorical(train_y, num_classes = 10)# data categorical
test_y_keras <- to_categorical(test_y, num_classes = 10)Pda tahap ini kita akan membanung arsitektur model, termasuk mendefinisikan layers & nodes serta activation function di dalamnya. Dengan menggunakan library keras, saya membuat model dengan layer input 128 dengan 2 hidden layer yang berisi 64 dan 32 serta layer output 10. Di sini kita akan menggunakan Activation Function relu didalam input layer dan hidden layer karena activation function relu biasa digunakan di hidden layer. bagus untuk kasus gambar (range 0 ~ inf). Serta menggunakan softmax didalam output layer karen softmax biasa digunakan di output layer untuk kasus klasifikasi (multiclass) (range 0 ~ 1) dan dapat menerima lebih dari 2 kelas (multiclass). Kemudian model saya compile dengan menggunakan optimizer_adam dan dikarenakan dataset ini memiliki lebih dari dua kelas kelas pada target variabel, maka error function yang digunakan adalah Categorical Cross-Entropy. Kita akan menggunakan model yang kita buat kedalam data fashion_test dan melihat apakah nilai akurasi yang kita dapatkan cukup tinggi
model <- keras_model_sequential() # membuat container/wadah modeltotal_kolom <- ncol(train_x_keras)
jumlah_kelas <- n_distinct(train_y)
model %>%
layer_dense(input_shape = total_kolom, units = 128, activation = "relu") %>%
layer_dense(units = 64, activation = "relu") %>%
layer_dense(units = 32, activation = "relu") %>%
layer_dense(units = jumlah_kelas, activation = "softmax")summary(model)## Model: "sequential"
## ________________________________________________________________________________
## Layer (type) Output Shape Param #
## ================================================================================
## dense (Dense) (None, 128) 100480
## ________________________________________________________________________________
## dense_1 (Dense) (None, 64) 8256
## ________________________________________________________________________________
## dense_2 (Dense) (None, 32) 2080
## ________________________________________________________________________________
## dense_3 (Dense) (None, 10) 330
## ================================================================================
## Total params: 111,146
## Trainable params: 111,146
## Non-trainable params: 0
## ________________________________________________________________________________
model %>%
compile(loss = "categorical_crossentropy", # cost function
optimizer = optimizer_adam(), # sthocastics gradient descent
metrics = "accuracy")history <- model %>%
fit(train_x_keras, train_y_keras,
epoch = 30,
batch_size = 128)plot(history)## `geom_smooth()` using formula 'y ~ x'
Dapat dilihat di atas pada epoch ke 10 peningkatan akurasi dan loss sudah tidak terlalu signifikan makan kita dapat menggunakan epoch 10 agar model tidak overfit
history$metrics$acc[30]## [1] 0.9403383
Lalu kita masukan model yang telah kita buat kedalam prediksi dan kita gunakan kedalam data_test yang telah kita buat dari data fashion.
prediction <- model %>% predict_classes(test_x_keras)confusionMatrix(as.factor(prediction), reference = as.factor(test_y))## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1 2 3 4 5 6 7 8 9
## 0 1013 4 29 44 3 0 181 0 14 0
## 1 3 1215 1 9 4 0 3 0 0 1
## 2 8 4 971 8 78 1 55 0 5 0
## 3 19 12 11 1096 45 0 23 0 5 0
## 4 3 1 98 30 967 0 59 0 1 0
## 5 0 0 0 0 0 1147 0 30 2 7
## 6 93 1 104 19 93 0 885 0 5 0
## 7 0 0 0 0 0 17 0 1124 1 28
## 8 5 1 2 1 2 2 10 4 1166 1
## 9 1 0 0 0 0 26 0 32 0 1163
##
## Overall Statistics
##
## Accuracy : 0.8959
## 95% CI : (0.8903, 0.9013)
## No Information Rate : 0.1032
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8843
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2 Class: 3 Class: 4 Class: 5
## Sensitivity 0.88472 0.9814 0.79852 0.90804 0.81124 0.96144
## Specificity 0.97466 0.9980 0.98525 0.98934 0.98223 0.99639
## Pos Pred Value 0.78649 0.9830 0.85929 0.90504 0.83434 0.96712
## Neg Pred Value 0.98767 0.9979 0.97745 0.98971 0.97924 0.99574
## Prevalence 0.09545 0.1032 0.10137 0.10062 0.09937 0.09945
## Detection Rate 0.08444 0.1013 0.08094 0.09136 0.08061 0.09562
## Detection Prevalence 0.10737 0.1030 0.09420 0.10095 0.09662 0.09887
## Balanced Accuracy 0.92969 0.9897 0.89189 0.94869 0.89674 0.97892
## Class: 6 Class: 7 Class: 8 Class: 9
## Sensitivity 0.72780 0.94454 0.97248 0.96917
## Specificity 0.97078 0.99574 0.99741 0.99454
## Pos Pred Value 0.73750 0.96068 0.97655 0.95172
## Neg Pred Value 0.96934 0.99390 0.99695 0.99657
## Prevalence 0.10137 0.09920 0.09995 0.10003
## Detection Rate 0.07377 0.09370 0.09720 0.09695
## Detection Prevalence 0.10003 0.09753 0.09953 0.10187
## Balanced Accuracy 0.84929 0.97014 0.98494 0.98185
Dapat dilihat model yang kita buat sangat baik karena memilki tingkat akurasi yang tinggi yaitu 89% Sekarang kita akan melalukan prediksi ke data test atau data fashion_test menggunakan model prediksi yang telah kita buat, dan melihat apakan nilai akurasi yang dimiliki cukup tinggi. Dan juga kita akan melakukan data preparation yang sama kedalam data fashion_test agar data dapat dipreksi dengan baik.
fashion_test <- testing(index)test2 <- data.matrix(fashion_test)fashion_test2 <- test2[, 1]confusionMatrix(as.factor(prediction), reference = as.factor(fashion_test2))## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1 2 3 4 5 6 7 8 9
## 0 1013 4 29 44 3 0 181 0 14 0
## 1 3 1215 1 9 4 0 3 0 0 1
## 2 8 4 971 8 78 1 55 0 5 0
## 3 19 12 11 1096 45 0 23 0 5 0
## 4 3 1 98 30 967 0 59 0 1 0
## 5 0 0 0 0 0 1147 0 30 2 7
## 6 93 1 104 19 93 0 885 0 5 0
## 7 0 0 0 0 0 17 0 1124 1 28
## 8 5 1 2 1 2 2 10 4 1166 1
## 9 1 0 0 0 0 26 0 32 0 1163
##
## Overall Statistics
##
## Accuracy : 0.8959
## 95% CI : (0.8903, 0.9013)
## No Information Rate : 0.1032
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8843
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 0 Class: 1 Class: 2 Class: 3 Class: 4 Class: 5
## Sensitivity 0.88472 0.9814 0.79852 0.90804 0.81124 0.96144
## Specificity 0.97466 0.9980 0.98525 0.98934 0.98223 0.99639
## Pos Pred Value 0.78649 0.9830 0.85929 0.90504 0.83434 0.96712
## Neg Pred Value 0.98767 0.9979 0.97745 0.98971 0.97924 0.99574
## Prevalence 0.09545 0.1032 0.10137 0.10062 0.09937 0.09945
## Detection Rate 0.08444 0.1013 0.08094 0.09136 0.08061 0.09562
## Detection Prevalence 0.10737 0.1030 0.09420 0.10095 0.09662 0.09887
## Balanced Accuracy 0.92969 0.9897 0.89189 0.94869 0.89674 0.97892
## Class: 6 Class: 7 Class: 8 Class: 9
## Sensitivity 0.72780 0.94454 0.97248 0.96917
## Specificity 0.97078 0.99574 0.99741 0.99454
## Pos Pred Value 0.73750 0.96068 0.97655 0.95172
## Neg Pred Value 0.96934 0.99390 0.99695 0.99657
## Prevalence 0.10137 0.09920 0.09995 0.10003
## Detection Rate 0.07377 0.09370 0.09720 0.09695
## Detection Prevalence 0.10003 0.09753 0.09953 0.10187
## Balanced Accuracy 0.84929 0.97014 0.98494 0.98185
Dapat dilihat bahwa model yang kita miliki mampu memprediksi data test dengan nilai akurasi yang cukup tinggi yaitu 89% dan model yang kita miliki tidak overfitt sehingga dapat dikatakan model dengan keterangan di atas bekerja cukup baik dalam memprediksi kategori gambar pada dataset Zalando’s fashion.