library(dplyr)
library(knitr)
library(caret)
library(tidyverse)
library(keras)
library(neuralnet)
library(rsample)

Background

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

Analysis Method

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.

Data Preparation

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")

Data wrangling

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)

Data Preparation

Terdapat beberapa pre-processing yang perlu dilakukan sebelum data dapat dimasukkan ke framework keras.

Ubah Data Menjadi Matrix

train <- data.matrix(fsh_train)
test <- data.matrix(fsh_test)

Pisah target dan prediktor:

# prediktor
train_x <- train[, -1]
test_x <- test[, -1]

# target
train_y <- train[, 1]
test_y <- test[, 1]

Processing X: Ubah Matrix menjadi Array

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)))
  • transformasi/scaling berdasarkan nilai maksimal dari variabel prediktor
# scaling min-max normalization
train_x_keras <- train_x_keras/255


# scaling min-max normalization
test_x_keras <- test_x_keras/255

Processing Y: One Hot Encoding

Ubah 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)

Define Architecture / modeling

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 model
total_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

Conclusion

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.