×

Cara Menangani Data Tidak Seimbang di Machine Learning

Meja kerja data scientist dengan laptop menampilkan grafik distribusi kelas tidak seimbang dan catatan

Cara Menangani Data Tidak Seimbang di Machine Learning

Model klasifikasi mendeteksi fraud dengan akurasi 99%. Setelah diperiksa, model itu memprediksi semua transaksi sebagai normal. Kasus fraud yang sebenarnya cuma 1% dari data jadi tidak pernah tertangkap. Inilah masalah data tidak seimbang: kelas mayoritas mendominasi, dan akurasi jadi angka kosong. Cara menangani data tidak seimbang butuh pendekatan sistematis, bukan sekadar ganti algoritma.

Panduan ini menyusun langkah demi langkah, mulai dari mengukur tingkat ketidakseimbangan, memilih teknik resampling, menyesuaikan bobot kelas, sampai mengevaluasi model dengan metrik yang jujur. Semua contoh memakai Python dan scikit-learn.

Ukur dulu rasio kelasnya

Sebelum menyentuh data, hitung distribusi kelas. Pada pandas, df['target'].value_counts(normalize=True) langsung memberi proporsi tiap kelas. Rasio 1:100 atau lebih ekstrem biasanya butuh penanganan khusus. Rasio 1:2 sampai 1:10 sering masih bisa ditangani dengan pengaturan bobot kelas saja.

Catat juga jumlah sampel absolut. Kelas minoritas dengan 50 baris berbeda perlakuan dengan kelas minoritas berisi 5.000 baris. Yang pertama rawan overfitting saat di-resample, yang kedua lebih aman.

Jangan resample sebelum split data

Kesalahan paling umum: melakukan oversampling atau undersampling pada seluruh dataset lalu baru membagi data latih dan uji. Akibatnya, data sintetis dari kelas minoritas bisa bocor ke data uji, dan skor evaluasi jadi terlalu optimistis. Lakukan split data latih dan data uji terlebih dahulu, baru resample hanya pada bagian data latih.

Urutan yang benar: pisahkan data latih dan uji, terapkan teknik penanganan pada data latih, lalu latih model dan evaluasi pada data uji yang masih asli. Jika memakai cross-validation, bungkus proses resampling di dalam pipeline agar tidak bocor antar fold.

Tiga pendekatan utama

Ada tiga jalur penanganan: mengubah distribusi data, mengubah bobot kesalahan, atau mengubah cara evaluasi. Ketiganya bisa dikombinasikan.

1. Random undersampling

Buang sebagian sampel kelas mayoritas sampai rasionya lebih seimbang. Cepat dan sederhana, tetapi membuang informasi. Cocok saat dataset sangat besar dan kelas mayoritas berlimpah. scikit-learn menyediakan RandomUnderSampler dari paket imbalanced-learn.

from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler(random_state=42)
X_train_res, y_train_res = rus.fit_resample(X_train, y_train)
print(y_train_res.value_counts())

2. Random oversampling dan SMOTE

Oversampling menggandakan sampel kelas minoritas. Cara paling naif adalah menduplikasi baris yang ada, tetapi ini membuat model mudah menghafal. SMOTE (Synthetic Minority Over-sampling Technique) membuat sampel sintetis dengan interpolasi antar tetangga terdekat di kelas minoritas. Hasilnya lebih bervariasi, meski tetap perlu hati-hati pada data berdimensi tinggi atau banyak fitur kategorikal.

from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state=42)
X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
print(y_train_res.value_counts())

Untuk data campuran numerik dan kategorikal, gunakan SMOTENC. Untuk data teks atau gambar, augmentasi lebih tepat daripada SMOTE.

3. Class weight

Alih-alih mengubah data, beri bobot lebih besar pada kesalahan di kelas minoritas. Banyak algoritma scikit-learn mendukung parameter class_weight='balanced'. Ini pilihan paling ringan karena tidak menambah baris data dan tidak mengubah distribusi asli.

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(class_weight='balanced', max_iter=1000)
model.fit(X_train, y_train)

Kelemahan class weight: pada rasio yang sangat ekstrem, bobot bisa jadi terlalu besar dan membuat model overfit ke kelas minoritas. Pantau performa di data validasi.

Gabungkan dengan normalisasi yang tepat

Banyak teknik resampling, terutama SMOTE, menghitung jarak antar sampel. Fitur dengan skala besar akan mendominasi perhitungan jarak dan menghasilkan sampel sintetis yang aneh. Lakukan normalisasi data untuk machine learning sebelum resampling. Tempatkan scaler di dalam pipeline agar parameternya dihitung hanya dari data latih.

Evaluasi dengan metrik yang jujur

Akurasi tidak lagi bisa diandalkan. Gunakan precision, recall, F1-score, dan AUC-PR. Untuk kasus di mana menangkap kasus positif jauh lebih penting, misalnya deteksi penyakit, prioritaskan recall. Jika false positive mahal, misalnya sistem anti-fraud yang memblokir transaksi sah, perhatikan precision.

Confusion matrix membantu melihat trade-off ini secara konkret. Pelajari cara membacanya di panduan membaca confusion matrix, lalu sesuaikan threshold probabilitas jika perlu. Threshold default 0.5 tidak selalu optimal untuk data tidak seimbang.

Pemilihan metrik yang salah bisa membuat model tampak bagus padahal tidak. Ulas kembali cara memilih metrik evaluasi model klasifikasi agar keputusan threshold dan resampling punya dasar yang jelas.

Alur kerja yang disarankan

  1. Hitung distribusi kelas dan tentukan tingkat ketidakseimbangan.
  2. Split data latih dan uji secara stratifikasi (stratify=y).
  3. Bangun pipeline: scaler, lalu sampler (jika perlu), lalu model.
  4. Latih dengan class_weight='balanced' sebagai baseline.
  5. Bandingkan dengan SMOTE atau undersampling lewat cross-validation.
  6. Evaluasi memakai F1, recall, AUC-PR, dan confusion matrix pada data uji asli.
  7. Sesuaikan threshold probabilitas sesuai biaya kesalahan.

Jika data harus ditampilkan ke pengguna akhir, misalnya hasil prediksi yang diambil dari API, menyajikannya dalam tabel HTML bisa memudahkan pengecekan manual. Contoh penerapannya ada di cara menampilkan data API ke tabel HTML dengan jQuery, dan untuk merapikan tampilan dashboard-nya kamu bisa mengikuti 7 langkah belajar CSS Flexbox untuk layout web.

Kapan tidak perlu resampling

Jika rasio kelas masih wajar, misalnya 40:60, resampling justru menambah kompleksitas tanpa manfaat. Cukup gunakan metrik yang sesuai dan pertahankan distribusi asli. Model yang dilatih pada distribusi nyata lebih mudah diprediksi perilakunya saat production.

Untuk data yang sangat sedikit di kelas minoritas, pertimbangkan pendekatan anomaly detection daripada klasifikasi biner. Teknik seperti isolation forest atau one-class SVM tidak memerlukan sampel kelas minoritas yang banyak.

Ringkasan

Data tidak seimbang tidak selesai dengan satu trik. Mulai dari mengukur rasio kelas, split data dengan stratifikasi, coba class weight sebagai baseline, lalu bandingkan dengan SMOTE atau undersampling. Evaluasi selalu memakai metrik yang peka terhadap kelas minoritas. Dengan urutan ini, model tidak lagi terjebak pada akurasi semu.

Pertanyaan yang Sering Diajukan

Apakah SMOTE selalu lebih baik dari oversampling biasa?

Tidak selalu. SMOTE membuat sampel sintetis yang bisa memperkaya variasi, tetapi pada data berdimensi tinggi atau banyak fitur kategorikal, hasilnya bisa menyesatkan. Oversampling acak kadang cukup, terutama jika kelas minoritas sudah cukup beragam. Uji keduanya lewat validasi silang dan bandingkan performanya di data uji asli.

Berapa rasio kelas yang dianggap tidak seimbang?

Tidak ada ambang baku. Rasio 1:10 masih sering ditangani dengan class weight saja. Rasio 1:100 atau lebih biasanya butuh kombinasi resampling dan penyesuaian threshold. Yang lebih penting adalah melihat dampaknya terhadap metrik evaluasi, bukan sekadar angkanya.

Apakah data uji juga perlu di-resample?

Tidak. Data uji harus mencerminkan distribusi nyata saat model dipakai. Jika data uji ikut di-resample, skor evaluasi tidak lagi menggambarkan performa sebenarnya. Resampling hanya dilakukan pada data latih, dan sebaiknya dibungkus dalam pipeline agar tidak bocor ke fold validasi.

You May Have Missed