Bagaimana Data Engineer Mengelola Dataset? Tulisan ini berdasarkan pengalaman kami dalam menangani beberapa dataset yang berukuran sangat besar sehingga butuh mekanisme khsusus agar pada data engineer dapat bekerja lebih efisien. Dataset adalah kumpulan data yang mempunyai properties yang seragam. Dataset mempunyai banyak bentuk seperti file CSV, Gambar, atau dalam Database. Didalam dataset terdiri dari banyak record / jumlah data yang biasa terdiri dari ratusan / ribuan. Dataset ada yang sudah jadi dalam bentuk angka tabel ataupun harus mengolah terlebih dahulu.
Properties Dataset
Contents
Setiap dataset yang terdiri dari record harus mempunyai 2 hal yaitu ciri fitur dan kelas. Saya berikan contoh dataset yang sudah jadi seperti Iris – https://www.kaggle.com/uciml/iris yang terdiri dari 6 column yaitu
- Id
- SepalLengthCm
- SepalWidthCm
- PetalLengthCm
- PetalWidthCm
- Species
Ciri Fitur
Ciri fitur merupakan sebuah nilai/rentang angka yang menjadi pembeda antar kelas. Contoh mudahnya yaitu ciri fitur jenis kelamin laki-laki dan perempuan. Ada tidak nya kumis merupakan sebuah ciri fitur. Pada contoh data iris, maka ciri fitur pada dataset tersebut yaitu pada kolom no 2 sampai 5 yang merupakan ciri fitur dari species iris yang diukur panjang sepal dan petalnya dalam satuan cm
- SepalLengthCm
- SepalWidthCm
- PetalLengthCm
- PetalWidthCm
Tidak semua ciri fitur menggunakan nilai diatas, tapi juga bisa menggunakan rentang nilai / kategori seperti https://softscients.com/2020/04/29/buku-belajar-dasar-statistika-dengan-r-analisis-regresi-logistik/#gsc.tab=0
Kelas / Target
Kelas/target merupakan tujuan/goal yang harus dicapai, berdasarkan ciri fitur. Pada dataset iris maka kelas/target yaitu pada kolom Species dengan jenis data kategorikal yaitu
- Iris-setosa,
- Iris-versicolor,
- Iris-virginica
tidak semua kelas/target bersifat kategorikal, biasanya menggunakan skala ordinal/numeric, misalkan saja
- Iris-setosa diubah menjadi angka 1
- Iris-versicolor diubah menjadi angka 2
- Iris-virginica diubah menjadi angka 3
ataupun dalam machine learning menggunakan teknik One Hot Encoding Seperti berikut
Bagaimana dengan dataset yang harus diolah terlebih dahulu?
Dataset yang berbentuk gambar biasanya harus diolah terlebih dahulu untuk mendapatkan ciri fitur, misalkan saja Mean RGB, GLCM, dan yang lainnya ataubahkan tidak bisa disimpan karena dalam bentuk tabular seperti teknik CNN – Convolution Neural Network (kalian bisa menggunakan hDF5). Cara mudahnya untuk mengelola dataset yaitu dengan menyimpan dalam folder tersendiri sesuai dengan kelas/target. Contohnya sebagai berikut
Hal ini diatas akan sangat membantu kita dalam mempersiapkan dataset tanpa perlu melakukan labelling secara manual. Sehingga bila ada record terbaru, bisa langsung ditambahkan sesuai dengan folder masing-masing.
Penamaan file yang baik
Saya sangat merekomendasikan kepada kalian untuk membuat nama file yang mudah dibaca dan ditelusuri, seperti menggunakan tahun-bulan-tanggal-waktu sehingga akan ter sort secara otomatis di File Explorer
Cara Scanning Folder
Scanning folder digunakan untuk membaca folder tertentu berdasarkan extension file, Caranya bagaimana? yaitu dengan cara melakukan scanning folder / batch folder. Anggap saja saya mempunyai folder dengan susunan sebagai berikut
Membaca isi folder dataset fruit\\data latih\\ data tabular berikut ini bisa disimpan dalam bentuk csv. Kalian bisa melihat
- ciri fitur yaitu RED, GREEN, dan BLUE sedangkan
- target/kelas yaitu KELAS dengan kategorikal
- Apple Braeburn
- Apple Crimson Snow
- Apple Golden 1
- Apple Golden 2
Semuanya serba otomatis, algoritma sambil menghitung/mencari ciri fitur serta juga menyimpan kelas/targetnya! Kalian bisa menggunakan WEKA untuk mengolah data minning. Udah tahu donk sekarang tugas data engineer yaitu menghimpun dan mencari dataset sedangkan data science yaitu mengolah dataset untuk mendapatkan kesimpulan hubungan ataupun object functionnya.
Perhitungan RGB NO | FILE | RED | GREEN | BLUE | KELAS | ------------------------------------------------------------------------ 1 | 321_100.jpg | 189 | 114 | 241 | Apple Braeburn | 2 | 322_100.jpg | 199 | 8 | 98 | Apple Braeburn | 3 | 323_100.jpg | 9 | 163 | 198 | Apple Braeburn | 4 | 324_100.jpg | 244 | 197 | 74 | Apple Braeburn | 5 | 100_100.jpg | 34 | 226 | 252 | Apple Crimson Snow | 6 | 101_100.jpg | 165 | 97 | 29 | Apple Crimson Snow | 7 | 102_100.jpg | 147 | 114 | 167 | Apple Crimson Snow | 8 | 103_100.jpg | 119 | 103 | 206 | Apple Crimson Snow | 9 | 100_100.jpg | 34 | 4 | 101 | Apple Golden 1 | 10 | 101_100.jpg | 101 | 255 | 108 | Apple Golden 1 | 11 | 102_100.jpg | 171 | 82 | 38 | Apple Golden 1 | 12 | 103_100.jpg | 189 | 110 | 201 | Apple Golden 1 | 13 | 321_100.jpg | 231 | 193 | 92 | Apple Golden 2 | 14 | 322_100.jpg | 180 | 26 | 73 | Apple Golden 2 | 15 | 323_100.jpg | 169 | 130 | 174 | Apple Golden 2 | 16 | 324_100.jpg | 77 | 128 | 114 | Apple Golden 2 |
Bila kalian menggunakan bahasa java, bisa gunakan kode berikut
final String parent_path = "dataset fruit\\data latih\\"; final String [] folder_target = new String []{"Apple Braeburn", "Apple Crimson Snow", "Apple Golden 1", "Apple Golden 2"}; for(int i=0;i<folder_target.length;i++){ File f = new File(parent_path+folder_target[i]); File [] fs = f.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getName().endsWith(".jpg"); } }); System.out.println(folder_target[i]); for(int j=0;j<fs.length;j++){ System.out.println("\t"+fs[j].getName()); } }
Kode diatas hanya sekedar contoh saja, kalian bisa menggunakan library tabular seperti table saw, serta mendapatkan ciri fitur dengan teknik ROI.
Tentu cara diatas menurut saya adalah cara terbaik dalam mengelola dataset! karena kan nggak lucu donk, kalian mengolah file gambar satu-persatu untuk mendapatkan nilai ciri fitur! kurang kerjaan
Mengelola ribuan Record dan belasan kelas/target
Saya sudah pernah pengalaman mengolah data gambar dengan ukuran 27 GB bila ditotal ada ribuan file dengan belasan kelas/target sehingga butuh waktu scanning folder untuk mendapatkan nilai fitur sekitar 6 jam bahkan sampai 18 jam. Tentu menyimpan record walau hanya dalam bentuk array di memory akan sangat riskan bila tiba-tiba terjadi error/bahkan mati lampu!
Masa mau ngulang lagi dari awal! tentu hal sangat boros waktu, sehingga saya akan membuat database khusus berbasis server untuk menyimpan setiap kali scanning file. Saya lebih suka menggunakan database mysql / postgres karena didesain khusus untuk multi user dibandingkan dengan sqlite. Mengapa demikian? karena sambil komputer melakukan perhitungan dan menyimpan kedalam database, kita bisa melihat hasil perhitungan tersebut tanpa takut terjadi bentrok connection pada saat semuanya berjalan!
Kemudahan dalam tambah record baru didalam dataset
Selain keuntungan diatas, menggunakan mysql akan sangat membantu dalam mengelola record, misalkan saja bilamana ada record baru yang akan dimasukan kedalam sebuah folder, maka kita bisa melakukan check file tersebut didatabase! sehingga file-file yang lama didalam folder tersebut diabaikan dan hanya akan memproses file baru saja ditambahkan!
Misalkan ketika sebelumnya ada 9 file dalam 1 folder kemudian ditambah 2 file menjadi 11 file dalam 1 folder. Aplikasi akan melakukan scanning dan melakukan perhitungan hanya pada 2 file tersebut dan memasukan nya kedalam database.
Hal ini bisa saja dilakukan karena pada saat sebelum perhitungan ciri fitur dilakukan checking file exist didatabase terlebih dahulu, jika file tersebut sudah ada maka diabaikan. Bila tidak ada maka lakukan proses dan insert ke dalam database!
Melalui mekanisme diatas, user tidak perlu kuatir bila menambah file/record terbaru kedalam folder tersebut. Dalam skala besar riset itu butuh records yang banyak serta harus uptodate ataupun malah menambah class/target baru.
Bila hal tersebut kurang akurat!, misalkan saja bisa juga user memberikan nama file yang sama tanpa sengaja tapi isinya beda, ya kalian bisa desain dengan checksum, jadi pada saat scanning folder selain hitung ciri fitur juga hitung checksum file untuk dimasukan bersama-sama didalam database!
Pembagian Dataset
Secara umum dataset untuk kebutuhan machine learning terdiri dari 2 yaitu dataset training dan testing untuk keperluan tuning model. Ada banyak ratio yang digunakan yaitu 0.9 sampai 0.7. Misalkan menggunakan ratio 0.9 artinya jika kita punya 150 record dataset, maka 90% x 150 = 135 records nya dimasukan dalam dataset training sisanya dataset testing. Bagaimana jika dataset tersebut mempunyai beberapa kelas? Misalkan terdapat 3 kelas dengan jumlah record masing-masing sebagai berikut
- Iris-setosa : 150 record
- Iris-versicolor: 250 record
- Iris-virginica: 60 record
Jika 0.9 ratio yang digunakan, maka dataset training menjadi
- Iris-setosa : 135 record
- Iris-versicolor: 225 record
- Iris-virginica: 54 record
sisanya menjadi dataset testing. Adapun cara splitnya bisa menggunakan random atau urut sequence Misalkan dari Iris-setosa : 150 record, maka no urut 1 sampai dengan 135 menjadi dataset traning dan no urut 136 sampai dengan 150 menjadi dataset testing.
Selanjutnya
Selanjutnya adalah melakukan tuning model yang merupakan kerjaan dari data science, pada kasus diatas sebagai contoh kita telah menghitung ciri fitur dan disimpan dalam bentuk CSV, kalian bisa menggunakan WEKA untuk mengolah dataset tersebut. Sebagai informasi dataset diatas diambil dari https://www.kaggle.com/moltean/fruits, kemudian case yang saya berikan adalah dengan menggunakan computer vision / digital image processing akan dihitung mean RGB dengan teknik ROI-Segmentasi Gambar sebagai ciri fitur dengan kelas kategorikal 4 kelas. Saya perjelas menjadi berikut
- ciri fitur yaitu RED, GREEN, dan BLUE sedangkan
- target/kelas yaitu KELAS dengan kategorikal
- Apple Braeburn
- Apple Crimson Snow
- Apple Golden 1
- Apple Golden 2
Rancangan GUI
GUI merupakan antarmuka yang menjembatani interaksi antara komputer dengan user, tidak semuanya user suka menggunakan aplikasi berbasis CLI, oleh karena hal tersebut untuk mempermudah pekerjaan dibuatlah GUI yang didalamnya ada user akan menekan sebuah tombol saja. Agar mudah dalam tuning dataset, saya menyarankan membuat dedicated folder bila harus mengolah dataset berupa ciri fitur! Misalkan dataset tersebut disimpan di dataset fruit/
Bila user memilih pengolahan dataset training, maka aplikasi akan memilih folder dataset fruit/data latih begitu juga untuk dataset testing maka aplikasi akan memilih folder dataset fruit/testing. Hal ini untuk mempermudah saja! ingat bahwa dataset itu digunakan untuk tuning model sehingga wajib diketahui ciri fitur dan target/kelas! kecuali aplikasi tersebut akan post production khusus untuk melakukan klasifikasi, maka kita tidak perlu membuat dedicated folder.
Desain GUI sangat simple, yaitu user hanya klik tombol Proses Dataset dengan memilih terlebih dahulu dataset training atau testing, hasil perhitungan ciri fitur akan ditampilkan dalam tabel serta secara otomatis akan menyimpan hasil. Karena ini hanya percobaan saja, saya menggunakan format CSV untuk menyimpan hasil perhitungan ciri fitur dengan nama fruit training.csv dan fruit testing.csv tapi dalam prakteknya bila dataset tersebut terdiri dari ribuan file, maka saya lebih suka menggunakan mysql server.
Bilamana jika user ingin menambahkan data baru? sebenarnya ini cukup mudah,
- bisa lakukan copy paste secara manual file gambar tersebut sesuai dengan tujuan kelasnya (copy paste di dedicated folder) atau
- data enginner membuat GUI Khusus untuk melakukan copy paste by programming kedalam folder dedicated tapi harus hati-hati ya, aplikasi wajib melakukan chek nama file agar tidak terjadi overwrite
Contohnya GUI bisa seperti berikut, langkahnya yaitu
- user akan diberikan cari gambar untuk menampilkan kotak dialog cari file, bila sudah file dipilih
- aplikasi akan memberikan pertanyaan, mau dimasukan kemana? Ingat ya ini adalah dataset untuk tuning model! sehingga harus didefinikasikan kelas/target terlebih dahulu
Tentu GUI diatas kurang efisien karena user harus satu-persatu melakukan proses, bilamana yang dipilih harus ratusan file?
- Copy paste kan saja file tersebut ke dedicated folder secara manual! atau
- buat GUI baru lagi khusus untuk dapat memproses ratusan file yang dipilih oleh user
Untuk GUI Tambah File banyak, maka user wajib melakukan pengelompokan file-file tersebut pada folder khusus (dikumpulin jadi satu dulu menjadi kelas yang sama, misalkan ada 10 file dengan 2 kelas ya buat dulu 2 folder)
langkahnya yaitu
- user akan diberikan cari folder untuk menampilkan kotak dialog cari folder yang berisikan file-file
- user akan diberikan pertanyaan terlebih dahulu sebelum lakukan upload
GUI dari Data Engineer
Setelah membuat GUI diatas, GUI tersebut dikumpulkan jadi 1 agar mudah dipanggil oleh GUI Dataset, user diberikan 3 opsi yaitu
- tambah 1 file
- tambah banyak file
- lakukan perhitungan ciri fitur
Selesai sudah tugas data engineer mulai dari
- menyiapkan struktur dataset
- memilih format penyimpanan dataset dan mekanisme bila terjadi duplikasi data
- melakukan perhitungan ciri fitur
- membuat GUI untuk mempermudah kegiatan yang berkenaan dengan dataset
Hemm, tapi ada 1 lagi yang belum dibuat yaitu mekanisme delete record pada dataset! ntar dibahas tersendiri menggunakan CRUID Mysql Database
Hasil perhitungan Dataset Fruit
Berikut hasil perhitungan ciri fitur yang telah dilakukan oleh data engineer