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.