Mau punya model bagus tapi datanya imbalanced? 😢🤷♂️
Catat 3 solusinya!
.
.
.
A thread
Suatu hari, kita diminta klien membangun model machine learning yang bisa mendeteksi tumor ganas pada lambung pasien. Kemudian, dengan memakai dataset berisi kumpulan CT-Scan perut, kita buat model yang memprediksi apakah seorang pasien menderita kanker lambung atau tidak.
Tapi masalahnya, ‘Gastric cancer’ atau kanker lambung ini tergolong sangat jarang temen-temen. Bahkan di Indonesia, resikonya itu cuma sekitar 0.0028%. Itu artinya, kalau kita sampling 100.000 orang, kemungkinannya kita cuma akan peroleh 3 sampel data penderita kanker lambung!
Dataset dengan 'ketimpangan' informasi kayak gini bisa jadi masalah. Kenapa? Karena model akan bias dengan kelas data mayoritas dan nggak akan ‘learned well’ tentang kelas minoritas akibat terlalu minimnya informasi. Kasus seperti ini disebut juga dengan kasus data imbalanced.
Umumnya data sudah dikatakan ‘imbalanced’ jika kelas minoritas hanya sekitar 20%. Tapi pada realitanya, dataset bisa JAUH lebih imbalanced. Kasus credit card fraud misalnya, cuma 2% kasus per tahun, kasus cacat produksi pabrik cuma 0.1%, dan kasus kanker lambung? Cuma 0.0028%!
Semakin ‘rare’ kasus nya, semakin imbalanced data nya, dan semakin sulit pula membangun model yang optimal. Dan lucunya, padahal alasan utama kenapa kita implementasiin machine learning dalam kasus 'rare events' ya justru karena kasusnya itu 'rare' dan sulit dideteksi manual!
Terus gimana dong min? Nah, di sini mimin akan bahas berbagai cara yang bisa temen-temen apply untuk ‘menangani’ dataset yang imbalanced. Apa aja min? Yuk simak satu persatu!
1) Kita mulai dulu dengan cara yang ‘ya iyalah jelas’ -- Cari data lagi. Jika MUNGKIN, coba cari data tambahan dengan kelas minoritas yang lebih banyak sehingga data lebih proporsional. Bisa dibilang ini cara yang paling ‘natural’ untuk mengurangi ‘imbalanceness’ dari data.
Tapi, harus diakui nyari data lagi nggak selalu feasible, bisa karena masalah waktu, biaya, atau memang kasus yang diprediksi ‘intrinsically’ jarang banget terjadi sehingga mau sebanyak apapun datanya akan tetap imbalanced. Kalau gitu gimana dong min? Okay, let's move on!
2) Cara selanjutnya adalah kita ‘paksa’ data menjadi lebih proporsional dengan melakukan resampling, yaitu melakukan sampling ulang data dari dataset sedemikian rupa sehingga diperoleh dataset baru yang lebih balanced. Secara umum ada dua teknik: undersampling dan oversampling.
Dalam undersampling, data dari kelas mayoritas di 'downsample' secara random sehingga jumlah data kelas mayoritas menjadi lebih sedikit. Sedangkan dalam oversampling, data dari kelas minoritas kita replikasi sehingga menjadi lebih banyak dan membuat dataset lebih proporsional.
Untuk implementasinya, temen-temen bisa menggunakan imbalanced-learn (imblearn), sebuah library Python yang berguna untuk handling data imbalanced, termasuk melakukan undersampling dan oversampling. Contoh, misalnya kita punya dataset yang imbalanced seperti ini.
Terlihat bahwa kelas ‘0’ jumlah datanya jauh lebih banyak dibandingkan dengan kelas ‘1’. Jika kita ingin mengimplementasikan undersampling, kita bisa menggunakan RandomUnderSampler() untuk secara random melakukan downsampling pada data kelas ‘0’. Kelihatan bedanya?
Kalau teknik undersampling dengan RandomUnderSampler() akan secara ‘naive’ membuang sebagian data dari kelas mayoritas -- kelas ‘0’ -- secara random, ada juga teknik undersampling lain yang bekerja dengan prinsip berbeda, salah satunya adalah Tomek links.
Teknik undersampling ciptaan Tomek (1976) ini bekerja dengan membuat pasangan-pasangan 'Tomek links', antara data kelas minoritas dengan ‘nearest neighbour’ nya dari kelas mayoritas. Kemudian, data kelas mayoritas pada setiap pasangan Tomek link ini kemudian ‘dibuang’.
Data yang di downsample dengan Tomek Links mungkin lebih sedikit. Tapi, dengan membuang data kelas mayoritas yang ‘dekat’ dengan data kelas minoritas, maka kelas minoritas akan jadi semakin ‘distinct’. Nah, ini akan turut membantu model mengklasifikasi dan memilah kedua kelas.
Okay sekarang sebaliknya, alih-alih mengurangi data kelas ‘0’, kita ingin melakukan replikasi dan memperbanyak data kelas ‘1’ untuk menyeimbangkan dataset. Kita bisa gunakan class RandomOverSampler() untuk membuat duplikat dari data kelas ‘1’ secara random.
'Naive oversampling' dengan RandomOverSampler() itu simply hanya memilih data dari kelas minoritas secara random, lalu data-data tersebut ‘dicopy-paste’ sehingga hasilnya akan ada banyak data duplikat. Nah, ada pula teknik oversampling lain, salah satunya adalah SMOTE.
SMOTE (Synthetic Minority Oversampling Technique) adalah teknik oversampling yang bekerja dengan menentukan K-nearest neighbours dari setiap titik data kelas minoritas, lalu mensintesis data baru yang berada di antara titik data dengan ‘tetangga’ terdekat nya.
Berbeda dengan RandomOverSampler() yang menghasilkan duplikat, oversampling dengan SMOTE akan menghasilkan titik-titik data baru di sekitar setiap titik data pada kelas minoritas.
‘Undersampling vs oversampling, bagusan mana min?’ Nah, keduanya punya plus-minus masing-masing dan mana yang lebih baik digunakan pun tiap dataset bisa berbeda. Jika dataset nya kecil misalnya, undersampling mungkin bukan pilihan yang bijak karena data akan semakin minim.
Tapi apakah oversampling pasti lebih baik karena bisa menambah jumlah data? Belum tentu. Mereplikasi data bukan berarti tanpa konsekuensi. Jika model salah menebak satu data kelas minoritas, dan data direplikasi 5 kali, maka error akan meningkat menjadi 6 kali pada dataset baru.
Dan inget temen-temen, undersampling dan oversampling itu pada dasarnya ‘memaksa’ dataset lebih proporsional. Dan dalam prosesnya akan turut mengubah distribusi dari dataset dan bisa membuatnya kurang representatif terhadap realita dunia nyata. Terus ada cara lain min? Next!
3) Alternatif lainnya adalah menyesuaikan modeling dengan use case nya, salah satunya dengan mengatur ‘decision threshold’ model. Umumnya, model classifier memakai ‘threshold’ tertentu (biasanya 0.5) untuk menentukan apakah suatu data termasuk kelas ‘positif’ atau ‘negatif’.
Anggap jumlah data penderita penyakit jantung JAUH lebih sedikit daripada data orang sehat dalam dataset kita. Nah, dengan menurunkan threshold, model akan jadi lebih sensitif dalam memprediksi kelas minoritas (‘Has Heart Disease’) meskipun dataset masih imbalanced! Kebayang?
Seberapa rendah min threshold nya? Nah, dari sini kita bisa gunakan kurva ROC untuk memandu pemilihan threshold yang optimal untuk model kita. Untuk mengevaluasinya, kita hitung luas area di bawah kurva ROC untuk memperoleh nilai AUC dari model!
Dan yang harus diinget terkait evaluasi model, JANGAN memakai accuracy sebagai metrics untuk mengukur performa model yang dibangun menggunakan data imbalanced. Model yang selalu salah menebak kelas ‘minoritas’ pun, jika proporsi dataset nya 90:10, maka accuracy nya bisa 90%!
Karena 'accuracy-only' itu bisa misleading, artinya kita juga harus melihat gimana performa model terhadap metrics turunan confusion matrix lain, seperti precision, recall, F1 Score, ROC-AUC, dan lain-lain, cek disini ya:
Nah, insight apa nih yang bisa kita ambil?
Real-world data itu messy dan nggak jarang sangat imbalanced, beda dengan yang mungkin biasa ditemui di kelas atau course di mana dataset yang dipakai sudah ‘bersih’, balanced, dan perfect. Ini juga menjadi tugas kita sebagai DS untuk bisa menangani hal seperti ini dengan baik.
Teknik menangani imbalanced data itu macem-macem. Nggak ada cara yang ‘one-size-fits-all’. Bahkan, nggak menutup kemungkinan dibutuhkan kombinasi berbagai cara untuk mendapat hasil yang optimal. Nah, ini jadi ladang kita buat explore and know much better data yang kita miliki!
Untuk bisa membuat data menjadi lebih ‘cleaned’ dan proporsional, tentu kita harus bisa mengenal data dengan baik. Dan untuk bisa memahami data dengan baik, dasar pemahaman statistika yang kuat itu menjadi syaratnya.
Nah, kalau kalian pengen jago memahami data dan statistik, serta ingin belajar menjadi Data Scientist, yuk gabung di non degree program Data Scientist Pacmann.AI! Kalian akan belajar dari basic loh, cek kurikulumnya di bit.ly/brosurpacmannai yaa. See you!
Share this Scrolly Tale with your friends.
A Scrolly Tale is a new way to read Twitter threads with a more visually immersive experience.
Discover more beautiful Scrolly Tales like this.