Deep Learning Neural Network di Zalando’s fashion

Pendahuluan

Pada LBB Neural Network ini saya menggunakan dataset Zalando’s fashion yang berasal dari kaggle di url https://www.kaggle.com/zalando-research/fashionmnist , dataset tersebut berisikan informasi gambar dari zalando yang memang digunakan untuk machine learning model dalam pendeteksian gambar dari 10 kategori seperti tas, kaos, celana panjang, dan sebagainya. Gambar memiliki resolusi 28×28 dengan total 784 pixel dengan total gambar 60000 observasi untuk train dan 10000 untuk test. Untuk itu saya mencoba membuat model dari data train dan model tersebut diterapkan di data test.

Setup R dan Membuat Fungsi Tambahan

Konsep deep learning dengan neural network, saya menggunakan library keras dan neuralnet di R. Kemudian saya membuat 2 fungsi tambahan untuk melihat gambar dari dataset train dan test yang digunakan.

Preprocessing

Membaca dataset train dan test yang sudah tersedia.

train_fashion_all <-  read.csv("data_input/train.csv")
test_fashion_all <-  read.csv("data_input/test.csv")

Kemudian saya mencoba melihat 25 data dari dataset tersebut.

vizTrain(train_fashion_all[1:25,])

vizTest(test_fashion_all[1:25,])

Karena saya menggunakan metode Neural Network maka data yang sudah ada harus dalam bentuk matrix, maka saya rubah class nya menjadi data matrix.

train_fashion <- data.matrix(train_fashion_all)
test_fashion <- data.matrix(test_fashion_all)

Selanjutnya untuk pembuatan model saya pisahkan dulu antara label prediktor dan variabel pixel nya.

train_fashion_x <- train_fashion[,-1]
train_fashion_y <- train_fashion[,1]

test_fashion_x <- test_fashion[,-1] 

Kemudian saya ubah data menjadi Array dengan menggunakan fungsi array_reshape() untuk data train dan test.

train_fashion_x_keras <- array_reshape(train_fashion_x,c(nrow(train_fashion_x), ncol(train_fashion_x)))
test_fashion_x_keras <- array_reshape(test_fashion_x, c(nrow(test_fashion_x), ncol(test_fashion_x)))

Dari data variabel pixel saya scaling supaya menjadi grayscale.

train_fashion_x_keras <- train_fashion_x_keras/255
test_fashion_x_keras <- test_fashion_x_keras/255

Kemudian saya rubah prediktor label menjadi categorial, dimana ada 10 kategori.

train_fashion_y_keras <- to_categorical(train_fashion_y,10)

Membuat Arsitektur Neural Network

Dengan menggunakan library keras, saya membuat model pertama dengan layer input 784 dengan hidden layernya 64 dan 32 dan model kedua dengan hidden layernya 512, 256, 128, 64 dan 32, serta layer output 10. Saya menggunakan non linear activation relu untuk menentukan apakah neuron tersebut harus “aktif” atau tidak berdasarkan dari weighted sum dari input, serta softmax untuk output yang bersifat multikategori. Kemudian model saya compile dengan menggunakan optimizer_adam dengan value learning rate nya 0.0002 , loss dengan value categorial_crossentropy karena prediktor adalah multikategori, metrics yang ditampilkan adalah akurasinya.

model_nn1 <- keras_model_sequential()
model_nn1 %>% layer_dense(units = 64, activation = "relu", 
    input_shape = c(784)) %>% layer_dense(units = 32, 
    activation = "relu") %>% layer_dense(units = 10, 
    activation = "softmax")

model_nn1 %>% compile(loss = "categorical_crossentropy", 
    optimizer = optimizer_adam(lr=0.0002), metrics = c("accuracy"))

summary(model_nn1)
## ___________________________________________________________________________
## Layer (type)                     Output Shape                  Param #     
## ===========================================================================
## dense (Dense)                    (None, 64)                    50240       
## ___________________________________________________________________________
## dense_1 (Dense)                  (None, 32)                    2080        
## ___________________________________________________________________________
## dense_2 (Dense)                  (None, 10)                    330         
## ===========================================================================
## Total params: 52,650
## Trainable params: 52,650
## Non-trainable params: 0
## ___________________________________________________________________________
model_nn2 <- keras_model_sequential()
model_nn2 %>% layer_dense(units = 512, activation = "relu", 
    input_shape = c(784)) %>% layer_dense(units = 256, 
    activation = "relu") %>% layer_dense(units = 128, 
    activation = "relu") %>% layer_dense(units = 64, 
    activation = "relu") %>% layer_dense(units = 32, 
    activation = "relu") %>% layer_dense(units = 10, 
    activation = "softmax")

model_nn2 %>% compile(loss = "categorical_crossentropy", 
    optimizer = optimizer_adam(lr=0.0002), metrics = c("accuracy"))

summary(model_nn2)
## ___________________________________________________________________________
## Layer (type)                     Output Shape                  Param #     
## ===========================================================================
## dense_3 (Dense)                  (None, 512)                   401920      
## ___________________________________________________________________________
## dense_4 (Dense)                  (None, 256)                   131328      
## ___________________________________________________________________________
## dense_5 (Dense)                  (None, 128)                   32896       
## ___________________________________________________________________________
## dense_6 (Dense)                  (None, 64)                    8256        
## ___________________________________________________________________________
## dense_7 (Dense)                  (None, 32)                    2080        
## ___________________________________________________________________________
## dense_8 (Dense)                  (None, 10)                    330         
## ===========================================================================
## Total params: 576,810
## Trainable params: 576,810
## Non-trainable params: 0
## ___________________________________________________________________________

Dari 2 model yang dibuat saya mencoba melakukan data training dengan menggunakan fungsi fit terhadap data train dengan epochs 30 dan batch_size 128.

history1 <-  model_nn1 %>% fit(train_fashion_x_keras, train_fashion_y_keras, epochs = 30, batch_size = 128)
history2 <-  model_nn2 %>% fit(train_fashion_x_keras, train_fashion_y_keras, epochs = 30, batch_size = 128)

Dari data training dari 2 model tersebut didapatkan nilai akurasi dari model 1 adalah 0.89 dan model ke 2 adalah 0.95. Sehingga untuk memprediksi di data test nya, saya menggunakan model ke 2 dimana nilai akurasinya lebih tinggi.

history1$metrics$acc[30]
## [1] 0.89775
history2$metrics$acc[30]
## [1] 0.9600333

Prediksi dan Evaluasi Model Neural Network ke Data Test

Saya melakukan prediksi model dengan fungsi predict_classes , dan melihat hasil evaluasinya dengan fungsi confusionMatrix dari library caret . Untuk keperluan tersebut, data harus diconvert menjadi factor.

prediction_fashion_test <- keras::predict_classes(object = model_nn2,  x = test_fashion_x_keras)

pred_x <- as.factor(prediction_fashion_test)
actual_x <- as.factor(test_fashion_all[,1])

caret::confusionMatrix(data = pred_x,reference = actual_x)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1   2   3   4   5   6   7   8   9
##          0 851   2  17  10   2   0 111   0   5   0
##          1   0 986   0  10   0   0   2   0   0   0
##          2  12   3 798   3  37   1  60   0   4   0
##          3  25   8  18 938  26   0  41   0   2   0
##          4   4   0 107  23 902   0  73   0   2   0
##          5   1   0   2   0   0 965   2  20   0   9
##          6  93   1  54  14  31   0 704   0   4   0
##          7   0   0   0   0   0  17   0 894   1  10
##          8  14   0   4   2   2   1   7   1 981   2
##          9   0   0   0   0   0  16   0  85   1 979
## 
## Overall Statistics
##                                           
##                Accuracy : 0.8998          
##                  95% CI : (0.8937, 0.9056)
##     No Information Rate : 0.1             
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8887          
##                                           
##  Mcnemar's Test P-Value : NA              
## 
## Statistics by Class:
## 
##                      Class: 0 Class: 1 Class: 2 Class: 3 Class: 4 Class: 5
## Sensitivity            0.8510   0.9860   0.7980   0.9380   0.9020   0.9650
## Specificity            0.9837   0.9987   0.9867   0.9867   0.9768   0.9962
## Pos Pred Value         0.8527   0.9880   0.8693   0.8866   0.8119   0.9660
## Neg Pred Value         0.9834   0.9984   0.9778   0.9931   0.9890   0.9961
## Prevalence             0.1000   0.1000   0.1000   0.1000   0.1000   0.1000
## Detection Rate         0.0851   0.0986   0.0798   0.0938   0.0902   0.0965
## Detection Prevalence   0.0998   0.0998   0.0918   0.1058   0.1111   0.0999
## Balanced Accuracy      0.9173   0.9923   0.8923   0.9623   0.9394   0.9806
##                      Class: 6 Class: 7 Class: 8 Class: 9
## Sensitivity            0.7040   0.8940   0.9810   0.9790
## Specificity            0.9781   0.9969   0.9963   0.9887
## Pos Pred Value         0.7814   0.9696   0.9675   0.9056
## Neg Pred Value         0.9675   0.9883   0.9979   0.9976
## Prevalence             0.1000   0.1000   0.1000   0.1000
## Detection Rate         0.0704   0.0894   0.0981   0.0979
## Detection Prevalence   0.0901   0.0922   0.1014   0.1081
## Balanced Accuracy      0.8411   0.9454   0.9887   0.9838

Kesimpulan

Dari hasil evaluasi menggunakan confusionMatrix didapatkan nilai akurasi 0.90 untuk data test, berbeda dengan hasil menggunakan data train yang mencapai 0.95, namun perbedaaan hasil ini masih bisa diabaikan dan tetap menggunakan model ke 2 untuk prediksi.