Wednesday, March 25, 2020

Apa bedanya training, validasi, development dan test set ?

Dalam sebuah seminar/konferensi ilmiah, saya bertanya kepada pemateri: Kenapa data yang dipakai untuk validasi dan test sama? Menurut beliau, istilah validasi dan test dalam machine learning sama. Menurut saya ini salah. Data validasi tidak boleh dipakai untuk test (karena tentu saja, hasilnya akan lebih bagus). Data validasi sama dengan data development, keduanya, validation dan development, merupakan istilah yang sama untuk "tuning model" dari hasil training.

Partisi data Training, Validasi, dan Test (sumber gambar: disini)

Merujuk pada StackOverflow:

Training Set: this data set is used to adjust the weights on the neural network.

Validation Set: this data set is used to minimize overfitting. You're not adjusting the weights of the network with this data set, you're just verifying that any increase in accuracy over the training data set actually yields an increase in accuracy over a data set that has not been shown to the network before, or at least the network hasn't trained on it (i.e. validation data set). If the accuracy over the training data set increases, but the accuracy over the validation data set stays the same or decreases, then you're overfitting your neural network and you should stop training.

Testing Set: this data set is used only for testing the final solution in order to confirm the actual predictive power of the network.

Kalau saya artikan bebas:
Training set: partisi data yang digunakan untuk memperoleh bobot jaringan syaraf tiruan (JST).
Validation/Development set: partisi data yang digunakan untuk menentukan bobot dari JST yang diperoleh dari Training Set sudah cukup atau belum.
Test set: partisi data untuk memprediksi output berdasarkan model yang telah dibangun pada training dan validasi.

Secara psudocode, definisi di atas dapat dituliskan sbb (lagi, dari StackOverlfow).
for each epoch
    for each training data instance
        propagate error through the network
        adjust the weights
        calculate the accuracy over training data
    for each validation data instance
        calculate the accuracy over the validation data
    if the threshold validation accuracy is met
        exit training
    else
        continue training

Biasanya saya memakai perbandingan 80:20 untuk Training+Validation:Test set. 80% data pada Training+Validation saya gunakan untuk training, sisanya 20% untuk validasi. Dengan kata lain, validation merupakan bagian dari Training set.

Pada Keras, data validasi bisa dideklarasikan dengan argumen`validation_split` dan `validation_data`. Pada opsi pertama, kita perlu memasukkan porsi data validasi (dari 0.0 sampai 0.9), sedangkan pada opsi kedua, `validation_data`, kita perlu memasukkan variabel data dengan format tuple (Input, label).

Data test disebut juga data "prediksi". Selain dengan model.evaluate (pada keras), kita juga bisa mendapatkan data tes/prediksi ini dengan `model.predict' (pada keras). Kemudian, output dari prediksi ini bandingkan dengan data/label sebenarnya. Ketemulah error (secara manual). Secara otomatis, error (misal MSE) sudah dihitung otomatis menggunakan model.evaluate. Perhatikan output dari perintah tersebut.

Bagaimana jika database/dataset-kecil?

Jika dataset kecil, kita tidak perlu membuat partisi test. Sebagai gantinya, kita "harus" menggunakan validasi silang (cross-validation) agar hasil yang kita klaim valid. Ukuran data kecil ini, menurut buku DeepLearning, di bawah 5000 samples. Validasi silang bisa dilakukan dengan bantuan perkakas scikit-learn, salah satunya dengan fungsi `StratifiedKFold`. Optimasi hyperparameter sudah  melibatkan validasi silang, contohnya pada tulisan saya ini: Menggunakan GridSearchCV Untuk Optimasi Hyperparameter.

Vadidasi Silang

Validasi silang adalah teknik yang umum digunakan untuk mendapatkan justifikasi umum dari partisi training dan validasi yang berbeda-beda. Hal ini dilakukan dengan membagi data training menjadi beberapa bagian, disebut fold. Jika menggunakan 5 fold, maka data training dibagi sama rata menjadi lima bagian, begitu juga jika menggunakan 10 fold, dibagi sepuluh bagian. Pada tiap set pelatihan (misal 100 epoch), data untuk validasi berubah-ubah, misal split pertama (fold ke 5) menjadi data validasi. Pada split kedua, fold keempat menjadi data validasi dst sampai pada split ke 5 data fold pertama menjadi data validasi. Urutannya tidak harus seperti itu, namun pada tiap split data validasi harus berubah. Untuk lebih jelasnya silahkan lihat gambar di bawah.


Validasi silang dengan 5 fold


Bacaan Tambahan

Artikel pada tautan berikut sangat bermanfaat untuk menambah pemahaman "kenapa kita harus memisahkan data menjadi training, validasi, dan tes: https://mlu-explain.github.io/train-test-validation/.

Related Posts Plugin for WordPress, Blogger...