Teknik Resampling untuk Data Tidak Seimbang
Apa dan Bagaimana Soal Menangani Data yang Tidak Seimbang.
Perkenalkan nama saya Ivan Ongko .S dari Universitas Komputer Indonesia. Pada artikel ini saya akan membahas mengenai salah satu masalah klasifikasi pada dunia nyata yaitu data yang tidak seimbang. Dimulai dari identifikasi masalahnya, konsep dasar teknik dan implementasinya dengan menggunakan python. Have fun!
Berikut bab yang akan dibahas di artikel ini :
- Perkenalan
- Apa itu data yang tidak seimbang ?
- Kenapa kita peduli ?
- Bagaimana mengatasinya ?
- Implementasi menggunakan library imblearn
Perkenalan
Di dunia machine learning, masalah klasifikasi merupakan salah satu masalah yang paling umum ditemukan. Apabila kalian masih baru dalam bidang machine learning, kemungkinan besar dataset yang kalian kerjakan tidak terlalu komplek dan sudah rapih.
Dataset yang disediakan oleh library dan website yang bertujuan untuk pembelajaran sudah dikelola sedemikian rupa sehingga mudah untuk dikerjakan. Salah satunya, ketika kalian hendak membuat model klasifikasi, data kelasnya telah seimbang yang artinya tiap kelas yang ada pada variabel target memiliki rasio yang hampir sama.
Alasannya karena pemula bisa fokus untuk mempelajari algoritma machine learning bukan merapihkan data. Dalam masalah dunia nyata kebanyakan data memiliki rasio kelas yang tidak seimbang yang mengakibatkan memberi tantangan baru bagi pemula yang hendak membuat model klasifikasi. Disini akan dibahas bagaimana identifikasinya, teknik konsep dasar resampling dan implementasinya.
Apa itu data yang tidak seimbang ?
Klasifikasi data yang tidak seimbang (imbalanced classification) adalah suatu masalah klasifikasi dimana distribusi kelas target memiliki rasio berbeda jauh.
Kelas yang mengampil proporsi terbesar pada data tersebut disebut dengan kelas mayoritas dan sebaliknya yang mengambil proporsi terkecil disebut dengan kelas minoritas.
Perbedaan rasio kelas target bisa saja berbeda minimal ataupun ekstrim, seperti yang dikategorikan oleh developer google berikut dibawah:
Adapun alasan kenapa data bisa tidak seimbang :
- Biased Sampling, ketika pengambilan data terdapat bias atau memberatkan sebelah pihak.
- Measurements Errors, ketika terdapat masalah pengukuran saat pengambilan data.
Beberapa contoh masalah data yang tidak seimbang bisa ditemukan di beberapa kasus berikut :
- Fraud detection
- Spam detection
- Loan approval detection, dan lain-lain.
Kenapa kita peduli ?
Alasan kenapa kita harus peduli apabila data kita tidak seimbang adalah karena metrik yang diberikan ketika kita mengukur performa model memberi interpretasi yang menyesatkan.
Seperti contohnya ketika kita menggunakan metrik akurasi untuk mengukur performa model. Metrik akurasi merupakan metrik yang meringkas performa model klasifikasi secara keseluruhan dengan cara menghitung total prediksi benar dibagi oleh total semua prediksi.
Metrik akurasi merupakan metrik yang sering digunakan karena mudah dipahami, tetapi metrik ini bisa menyesatkan kita apabila datanya tidak seimbang.
Kesalahan ini saking seringnya dilakukan oleh pemula sehingga ada nama spesial untuk kesalahan interpretasi ini, disebut “The Accuracy Paradox”.
The Accuracy Paradox
The accuracy paradox is the paradoxical finding that accuracy is not a good metric for predictive models when classifying in predictive analysis. This is because a simple model may have a high level of accuracy but be too crude to be useful -Wikipedia
Saya akan memberikan contoh kasusnya, pertama perhatikan confusion matrix berikut :
Dimisalkan ada masalah klasifikasi dengan data yang tidak seimbang dengan rasio kelas 1:99 dari total 100 baris data. Yang dimana artinya setiap 1 kelas minoritas mempunyai 99 kelas mayoritas.
Lalu dimisalkan, kelas minoritas adalah kelas-0 dan kelas mayoritas ada kelas-1.
Ketika kita menggunakan data tersebut sebagai training ke model machine learning, hasil laporan akan memberikan nilai akurasi tinggi. Sebenarnya nilai akurasi yang dilaporkan memanglah benar, tetapi dapat menyesatkan kita apabila kita berpikir bahwa model yang kita latih mampu membedakan kelas-0 dan kelas-1 dengan baik dari nilai metrik tersebut. Perhatikan contoh confusion matrix berikut dari evaluasi model dengan data yang tidak seimbang :
Dengan menggunakan persamaan akurasi, kita mendapatkan nilai 99% tetapi apabila kelas-0 adalah menjadi prioritas dari kasus ini maka akurasi tinggi dari model ini bukanlaha berarti apa-apa malah bisa menyesatkan bagi yang salah menafsirkannya.
Adapun metrik alternatif untuk mengukur performa model dengan data yang tidak seimbang :
Precision, Recall & F-score Metrics
Precision, Recall dan F-score merupakan metrik yang populer digunakan ketika data yang ditangani tidak seimbang.
- Precision, Memberikan ringkasan bahwa prediksi kelas positif sebenarnya kelas positif sesungguhnya.
- Recall, Memberikan ringkasan bahwa seberapa baik prediksi kelas positif oleh model.
- F-score, Merupakan metrik perpaduan antara Precision & Recall dan memberi nilai harmonis antara kedua nilai tersebut (Semakin tinggi, semakin baik).
Bagaimana mengatasinya ?
Sebenarnya terdapat beberapa metode untuk mengatasi data yang tidak seimbang untuk model klasifikasi seperti contohnya weighted parameter pada model, ensemble model dan cara yang terbaik adalah dengan membuat ulang pertanyaan dari masalah tersebut.
Tetapi pada artikel kali ini akan dibahas salah satu teknik populer untuk mengatasi data yang tidak seimbang, yaitu teknik Teknik Resampling.
Teknik Resampling merupakan suatu teknik atau metode untuk membuat sample baru dari sample atau populasi yang sudah ada pada data. Sederhananya, metode ini bisa dibagi jadi dua kategori : menghapus sampel dari kelas mayoritas sehingga rasio sama disebut Undersampling dan kedua, menambah sampel ke kelas minoritas sehingga rasio sama disebut Oversampling.
Dari kedua metode tersebut terbagi menjadi banyak metode, di artikel ini akan dijelaskan dan di-implementasi beberapa saja.
- Undersampling
- Random Undersampling, Menghapus sampel kelas mayoritas secara acak.
- Prototype Generation, Menghapus sampel dan menambah sampel berdasarkan metode clustering.
- Near Miss, Menghapus sampel kelas mayoritas yang dekat dengan kumpulan data kelas minoritas.
- Tomek’s Link, Menghapus sampel kelas mayoritas yang berpasangan dengan datapoin kelas minoritas.
2. Oversampling
- Random Oversampling, Menambah sampel kelas minoritas secara acak dari sampel yang sudah ada.
- SMOTE (Synthetic Minority Oversampling Technique), Menambah sampel kelas minoritas dengan cara mensintesis data baru berdasarkan metode k-nearest neighbour.
- ADASYN (Adaptive synthetic), Mensintesis data baru untuk kelas minoritas yang dimana mudah untuk dipelajari oleh model.
Mengenai metode atau teknik apa yang harus dipakai ketika mendapat masalah data tidak seimbang saat klasifikasi itu tergantung data yang kalian urusi masing-masing. Terkadang, menggunakan Random Sampling cukup menambah performa model tetapi terkadang juga tidak ada metode satupun yang bisa menambah performa model. Disaat inilah kalian harus menggunakan metode teknik lain selain resampling atau mungkin kalian bisa mempertanyakan ulang bagaimana cara kalian mem-framing masalahnya dan mengambil data baru yang memiliki rasio kelas yang cukup seimbang.
Implementasi
Pada artikel ini, implementasi teknik resampling untuk mengatasi data tidak seimbang akan menggunakan Python dan library imblearn. Alasannya karena bahasa pemrograman Python merupakan bahasa yang sangat mudah dipelajari dan dipahami yang dimana bagus untuk bekerja bersama tim dan alasan lainnya adalah bagus untuk melakukan riset akademik seperti untuk data science. Library imblearn merupakan library tambahan dari Python yang bisa di-install manual melalup package manager, library ini berguna untuk mengatasi data yang tidak seimbang sebelum di train untuk model.
Pada implementasi ini akan diberikan cara implementasi SMOTE untuk mengatasi data yang tidak seimbang, dan dalam pengerjaan implementasi ini juga akan diberi tahu cara mengukur performa model sebelum dan sesudah menggunakan teknik Resampling.
Pertama sebelum memulai kalian perlu menginstall beberapa package python :
Instalasi package yang diperlukan
- Menggunakan pip
pip install matplotlib sklearn seaborn imbalanced-learn
- Menggunakan Anaconda
conda install matplotlib sklearn seaborn imbalanced-learn
Penulis juga menggunakan Jupyter Notebook sebagai editornya.
Kode Implementasi
Pertama, import package yang diperlukan.
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from collections import Counter
Buat data blob fiktif menggunakan library sklearn lalu simpan ke X dan y.
X, y = make_classification(n_samples=1200, n_features=2, weights=[0.2, 0.8], n_redundant=0, n_informative=2, class_sep=0.25, n_clusters_per_class=1, random_state=13)
Output jumlah masing-masing kelas dan visualisasinya
print(Counter(y))
sns.countplot(x=y)
Visualisasi data X dan y pada scatter plot dengan warna dan opasitas kecil.
for i, color in enumerate(['1', '0']):
plt.scatter(X[:, 0], X[:, 1], c=['b' if p == i else 'r' for p in y], alpha=0.3, label=color)plt.legend()
plt.xlabel('X column 0')
plt.ylabel('X column 1')
Bagi data untuk train dan test lalu latih model tanpa teknik resampling untuk melihat performa model.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y, random_state=13)clf = LogisticRegression(random_state=13)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print('Accuracy is ', accuracy_score(y_test, y_pred))
Dari kode diatas, kita mendapat akurasi 78%, cukup lumayan tetapi hal ini berita bagus jikalau data kita seimbang, mari kita lihat confusion matrix dan classification reportnya.
print(classification_report(y_test, y_pred))cf_matrix = confusion_matrix(y_test, y_pred)
df_cm = pd.DataFrame(cf_matrix, columns=['0', '1'], index=['0', '1'])
df_cm.index.name = 'Actual'
df_cm.columns.name = 'Predicted'
sns.heatmap(df_cm, cmap='Blues', annot=True)
Seperti yang dilihat, jika seandainya prioritas kita adalah model mampu memprediksi kelas-0 berarti model ini gagal total. Dari 3data kelas-0 tak ada satupun prediksi yang benar dan model salah melabel 81 data kelas-0 yang asli menjadi kelas-1. Jika dilihat F-scorenya pun untuk kelas-0 adalah nol, ini artinya sangatlah buruk. Harus ada penanganan data untuk meningkat performa model.
Mari kita coba terapkan salah satu teknik Resampling yaitu teknik Over Sampling metode SMOTE.
sm = SMOTE(random_state=13)
X_res, y_res = sm.fit_resample(X_train, y_train)print('Original dataset shape is ', Counter(y_train))
print('Resample dataset shape is ', Counter(y_res))
Terlihat bahwa data yang jumlah kelas minoritasnya adalah 163 setelah diresample menjadi 641 yaitu karena mengikut jumlah kelas mayoritas.
Selanjutnya mari kita bagi data yang telah diresample menjadi train dan test lalu kita latih dan ukur model kita.
clf = LogisticRegression(random_state=13)
clf.fit(X_res, y_res)y_pred = clf.predict(X_test)
print('Accuracy is ', accuracy_score(y_test, y_pred))
Akurasi model kita sekarang adalah 66% dari data yang telah diresampel. Apabila dibandingkan dengan akurasi sebelumnya memang turun, tetapi apabila kita cek confusion matrix beserta classification reportnya akan terdapat peningkatan.
print(classification_report(y_test, y_pred))cf_matrix = confusion_matrix(y_test, y_pred)
df_cm = pd.DataFrame(cf_matrix, columns=['0', '1'], index=['0', '1'])
df_cm.index.name = 'Actual'
df_cm.columns.name = 'Predicted'
sns.heatmap(df_cm, cmap='Blues', annot=True)
Terlihat dari classification report bahwa F-score untuk kelas minoritas naik menjadi 0.49 yang berarti model lebih baik dari sebelumnya, hal ini dibuktikan juga dari grafik confusion matrix dari hasil prediksi data test. Model kita mampu memprediksi 64 kelas-0 dengan benar! bila dibandingan dengan sebelumnya (total nol) tanpa teknik Resampling ini tentu saja naik drastis.
Jadi, terbukti bahwa teknik Resampling dapat digunakan untuk kasus masalah klasifikasi seperti ini yaitu masalah klasifikasi dengan data yang tidak seimbang.
Kesimpulan
Sebagai pemula data scientist seringkali menemukan masalah ketika hendak membuat model baik itu dari data ataupun mengatur modelnya sendiri. Salah satu masalahnya adalah ketika menemukan data yang tidak seimbang. Dengan adanya teknik Resampling kita bisa menangani masalah klasifikasi data yang tidak seimbang dengan hasil yang lumayan baik. Ukuran untuk mengukur performa model ketika data yang dihadapi tidak seimbangpun tidak boleh sembarangan karena dapat mengakibatkan salah tafsir seperti contohnya akurasi tidak terlalu reliable untuk kasus ini, alternatifnya ada ukuran lain yang bisa kita andalkan seperti contohnya Precision, Recall, F-score. Untuk implementasi teknik Resampling di bahasa pemrograman Python kita bisa menggunakan library khusus yaitu imbalanced-learn, di library tersebut kita bisa memakai langsung metode yang sudah ada. Hasil dari teknik Resampling ini pun cukup baik seperti yang telah dibuktikan di bab atas walaupun dengan model yang sederhana.
Signature
10118137 — Ivan Ongko Sampurna
Program Studi Teknik Informatika
Referensi
Tom Fawcett. Agustus 2016. Learning from Imbalanced Classes, (https://www.kdnuggets.com/2016/08/learning-from-imbalanced-classes.html), diakses pada 2 Juni 2021.
Bhoomika Madhukar. 29 Oktober 2020. Using Near-Miss Algorithm for Imbalanced Datasets, (https://analyticsindiamag.com/using-near-miss-algorithm-for-imbalanced-datasets/), diakes pada 2 Juni 2021.
Jason Brownlee. 17 Januari 2020. SMOTE for Imbalanced Classification with Python, (https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/), diakses pada 2 Juni 2021.
Jason Brownlee. 1 Januari 2020. Failure of Classification Accuracy for Imbalanced Class Distributions, (https://machinelearningmastery.com/failure-of-accuracy-for-imbalanced-class-distributions/), diakses pada 2 Juni 2021.
Jason Brownlee. 14 Januari 2020. A Gentle Introduction to Imbalanced Classification, (https://machinelearningmastery.com/what-is-imbalanced-classification/), diakses pada 2 Juni 2021.