Penanganan Ketidakseimbangan Kelas

class_weight dan kesadaran resampling.

Daftar isi

Ketidakseimbangan kelas membuat pelatihan dan evaluasi sama-sama menyesatkan bila dibiarkan, tetapi penanganannya memiliki urutan yang benar. Topik ini menempatkan pemilihan metrik sebagai langkah pertama, lalu membahas class_weight="balanced" pada estimator, kesadaran resampling berupa undersampling dan oversampling, serta larangan menyentuh data uji dengan resampling. Perbandingan nyata menggunakan LogisticRegression pada data 95:5 dan membaca hasilnya melalui classification_report.

Metrik dahulu, penanganan kemudian#

Langkah pertama menangani ketidakseimbangan bukan mengubah data, melainkan menetapkan metrik yang jujur untuk kasusnya. Accuracy pada data 95:5 menyesatkan, sehingga recall kelas minoritas, F1, atau AUC menjadi calon metrik yang lebih layak. Tanpa kesepakatan metrik, keberhasilan penanganan tidak dapat dinilai, karena accuracy justru dapat turun ketika model mulai menangani kelas minoritas secara sungguh-sungguh, dan penurunan itu bukan tanda kegagalan.

Setelah metrik disepakati, teknik penanganan dipilih dari dua jalur besar. Jalur pertama menaikkan bobot kelas minoritas di dalam fungsi biaya model melalui argumen class_weight, sehingga data tidak diubah sama sekali. Jalur kedua mengubah komposisi data latih melalui resampling. Keduanya menyasar tujuan yang sama, yaitu membuat error pada kelas minoritas terasa lebih mahal, tetapi mekanismenya berbeda dan tidak otomatis perlu digabung.

Pertimbangan metrik selalu kembali pada harga kesalahan pada domainnya. Pemeriksaan penyakit menempatkan FN sebagai kesalahan termahal, sehingga recall kelas positif menjadi metrik utama, sedangkan pada filter pesan, FP lebih merugikan sehingga precision yang dipandang. Metrik yang dipilih itulah yang digunakan untuk menilai setiap teknik penanganan berupa class_weight dan resampling, termasuk memantau berapa harga yang dibayar pada metrik pasangannya.

class_weight balanced#

Argumen class_weight="balanced" tersedia pada banyak estimator scikit-learn, di antaranya LogisticRegression dan RandomForestClassifier. Mode ini menetapkan bobot tiap kelas berbanding balik dengan frekuensinya, sehingga pada data latih 95:5 kesalahan terhadap kelas minoritas dihukum sekitar 19 kali lebih berat daripada kesalahan terhadap kelas mayoritas. Selama pelatihan, model yang mengabaikan kelas minoritas menerima penalti jauh lebih besar, dan hasilnya model memprediksi kelas tersebut lebih sering.

python perbandingan-class-weight.py
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

X, y = make_classification(
    n_samples=600, n_features=6, n_informative=3, n_redundant=0,
    weights=[0.95, 0.05], random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
pred = model.predict(X_test)
print("=== Tanpa class_weight ===")
print(classification_report(y_test, pred))

model_bal = LogisticRegression(max_iter=1000, class_weight="balanced")
model_bal.fit(X_train, y_train)
pred_bal = model_bal.predict(X_test)
print('=== Dengan class_weight="balanced" ===')
print(classification_report(y_test, pred_bal))
text Keluaran
=== Tanpa class_weight ===
              precision    recall  f1-score   support

           0       0.96      1.00      0.98       114
           1       1.00      0.17      0.29         6

    accuracy                           0.96       120
   macro avg       0.98      0.58      0.63       120
weighted avg       0.96      0.96      0.94       120

=== Dengan class_weight="balanced" ===
              precision    recall  f1-score   support

           0       1.00      0.75      0.85       114
           1       0.17      1.00      0.29         6

    accuracy                           0.76       120
   macro avg       0.59      0.87      0.57       120
weighted avg       0.96      0.76      0.83       120

Keluaran memperlihatkan perubahan yang tegas pada kelas 1. Tanpa bobot, recall kelas 1 hanya 0.17 dengan precision sempurna 1.00, artinya model sangat selektif dan melewatkan lima dari enam sampel minoritas. Dengan class_weight="balanced", recall kelas 1 naik ke 1.00 sehingga seluruh sampel minoritas tertangkap, tetapi precision turun ke 0.17 karena banyak sampel mayoritas ikut disangka minoritas. Accuracy keseluruhan turun dari 0.96 menjadi 0.76, dan penurunan itu bukan kegagalan, melainkan konsekuensi penilaian yang menempatkan kesalahan terhadap kelas minoritas sebagai kesalahan yang lebih mahal.

Perlu dicatat bahwa bobot hanya bekerja pada saat pelatihan. Data uji tidak tersentuh sama sekali, sehingga angka pada classification_report tetap menggambarkan performa atas distribusi aslinya. Sifat inilah yang membuat penanganan berbasis bobot relatif aman dari kebocoran data dibandingkan penanganan yang mengubah data.

Kesadaran resampling#

Jalur kedua mengubah komposisi data latih. Undersampling membuang sebagian sampel kelas mayoritas sehingga kedua kelas lebih seimbang, sedangkan oversampling menduplikasi atau menginterpolasi sampel kelas minoritas. SMOTE adalah teknik oversampling yang populer karena membuat sampel sintetis di antara tetangga terdekat kelas minoritas, dan teknik itu tersedia melalui paket imbalanced-learn yang dipasang terpisah dari scikit-learn. Paket tersebut tidak dibahas di sini, tetapi menjadi arah lanjutan yang tepat bila class_weight saja tidak cukup.

Resampling hanya boleh menyentuh data latih. Data uji wajib tetap pada distribusi aslinya, karena evaluasi harus menjawab pertanyaan tentang performa pada data nyata yang memang tidak seimbang. Menyalin sampel minoritas pada data uji atau mengubah komposisinya menghasilkan angka yang tidak mewakili pemakaian nyata, sekaligus menjadi bentuk kebocoran data yang membuat penilaian terlalu optimis. Skor yang tampak membaik pada laporan seperti itu tidak akan terulang ketika model bertemu data nyata.

Kesalahan umum#

Tiga kesalahan berikut sering muncul saat menangani ketidakseimbangan kelas.

  • Menilai keberhasilan class_weight dari accuracy yang turun, padahal penurunan itu memang diharapkan saat recall minoritas naik. Perbaikannya, bacalah metrik per kelas pada classification_report.
  • Menggabungkan class_weight dan oversampling sekaligus sejak awal, sehingga efek masing-masing tidak terukur. Perbaikannya, terapkan satu penanganan dalam satu waktu, ukur hasilnya, baru putuskan langkah berikutnya.
  • Melakukan resampling sebelum pemecahan data sehingga data uji terkontaminasi. Perbaikannya, pisahkan data uji terlebih dahulu dan lakukan resampling hanya pada data latih.

Ringkasan#

  • Penanganan ketidakseimbangan dimulai dari pemilihan metrik yang jujur, bukan dari perubahan data.
  • class_weight="balanced" menaikkan bobot kelas minoritas berbanding balik dengan frekuensinya tanpa mengubah data.
  • Pada data 95:5, class_weight="balanced" mengangkat recall kelas minoritas dari 0.17 menjadi 1.00 dengan harga precision dan accuracy yang turun.
  • Resampling hanya diterapkan pada data latih, sedangkan data uji tetap menggunakan distribusi aslinya.

Referensi#