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!

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Follow us on instagram: @pacmannai

Follow us on instagram: @pacmannai Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @pacmannai

30 Apr
Enam alasan kenapa project DS sering gagal. 🥲🤦
Jangan sampai terjerumus ke 6 penyebab ini!
.
.
.
A thread
Pernah gak sih udah cape-cape begadang berminggu-minggu bikin model tapi kok ga selesai-selesai? Atau mungkin modelnya udah jadi tapi ternyata ga memberikan insight sesuai yang diminta atasan? 🥲🥲🥲
Yaa, kita semua setuju lah ya hal-hal di atas jadi nightmare banget, dan sebisa mungkin kita mau menghindari project menjadi gagal. Nah, makanya di thread kali ini, mimin mau bahas beberapa alasan yang bisa menyebabkan project kita fail. Langsung aja ke alasan yang pertama
Read 31 tweets
30 Apr
Butuh kedewasaan untuk mengakui pekerjaan kita gak perlu pakai model/tool yang paling canggih.

Butuh kedewasaan untuk mengakui model yang dibutuhkan gak njlimet pakai Deep Learning Transformers, tapi pakai Logistic Regression aja bisa.
Menurut gue ini penyakit semua orang yang baru masuk ke industry ya, terlepas industry nya apa aja.

Gue juga dulu pas kerja pertama jadi DS di 2015, semua model mau gue deeplearning-kan-saja-semua.
Namun ya gue ke sini mikirnya adalah bikin model yang:

1. Mudah
2. Sederhana
3. Cepat
4. Gampang lo debug
5. Gampang di-tuning, yang ini adalah hasil diskusi dengan teman kemarin di suatu kantor berita.
Read 8 tweets
29 Apr
Udah buat program tapi bingung evaluasinya gimana?🧐🤔
Pakai Difference in Difference aja!
.
.
.
A thread
Mimin yakin tempat kerja kalian pasti pernah membuat program baru / keputusan krusial. Setelah membuat program baru ini, tentunya ada outcome yang diharapkan dong, kalau ga ya ngapain repot-repot bikin program?
Yang menjadi pertanyaan adalah, gimana caranya kita tau kalau program ini memiliki dampak yang signifikan?
Read 32 tweets
29 Apr
Katanya mau jadi Data Scientist, tapi masih takut statisik? 🤨😱
Kenalan sama basicnya dulu yuk!
.
.
.
A thread
Hayoo siapa yang disini lagi mau banting setir buat ngerambah dunia perdataan dan jadi Data Scientist?
Kalau kamu udah mau menyelami profesi ini, ada baiknya nih tau dulu kira kira kamu bakal berurusan sama apa sih ketika jadi DS nanti? Biar kebayang, kamu bisa liat diagram venn dibawah ini nih:
Read 8 tweets
28 Apr
Central Limit Theorem: kenyataan pahit yang ga semua orang tahu📊
Introduction to Cauchy Distribution
.
.
.
A thread
Central limit theorem? Hmm.. udah sering banget ga sih denger teorema ini? Tapi kalo Cauchy Distribution, udah pada tau belum, nih?
Central Limit Theorem itu kan bunyinya gini: distribusi dari rata-rata sampel variabel acak yang gak di-generate dari dist Gaussian biasanya akan jadi Gaussian kalo misalnya ukuran sampelnya cukup besar. Image
Read 29 tweets
28 Apr
Mau jadi Data Scientist dengan gaji diatas 2 digit?🤑📈
Nih, ikutin tips nya!
.

.

A Thread
(image credit: unsplash.com/@jpvalery) Image
Coba tebak-tebakan dulu: Berapa sih gaji Data Scientist di Indonesia?
Sebenernya, ketiga opsi itu nggak ada yang salah guys HEHE. Soalnya, penentuan gaji seseorang bakal dipengaruhi oleh banyak hal, meski punya titel sama sebagai ‘Data Scientist’.
Read 34 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!