Ketidakseimbangan Kelas

Kenyataan data yang tak seimbang dan alasan akurasi menjadi metrik yang menipu.

Daftar isi

Data nyata jarang terbagi rata antara kelasnya. Transaksi yang sah jauh lebih banyak daripada penipuan, dan peralatan yang berjalan normal jauh lebih banyak daripada yang rusak, dengan perbandingan yang mudah mencapai 95:5 atau bahkan 99:1. Topik ini menjelaskan mengapa akurasi menjadi metrik yang menipu pada kondisi tersebut, kemudian mempraktikkan pembacaan metrik per kelas pada dataset sintetis yang dibuat dengan make_classification dari scikit-learn.

Akurasi yang menipu#

Akurasi menghitung proporsi prediksi yang benar terhadap seluruh prediksi, sebagaimana dinyatakan rumus berikut.

akurasi=prediksi benarseluruh prediksi \text{akurasi} = \frac{\text{prediksi benar}}{\text{seluruh prediksi}}

Setiap prediksi diberi bobot yang sama, sehingga kelas dengan jumlah contoh terbanyak menentukan sebagian besar angkanya. Definisi itu menjadi jebakan pada data tak seimbang. Pada data dengan perbandingan 95:5, model yang selalu menebak kelas mayoritas tanpa mempelajari fitur apa pun sudah mencetak akurasi 0.95. Lima persen kesalahan tidak cukup menggeser angka akurasi secara terlihat, sehingga seluruh kelas minoritas boleh lolos tanpa terdeteksi. Kelas minoritas justru lazimnya kelas yang paling penting, misalnya transaksi penipuan atau peralatan yang rusak.

Ukuran pembanding yang wajar adalah model boneka (dummy classifier) yang selalu menebak kelas mayoritas tanpa mempelajari fitur. Model boneka berperan sebagai baseline, yaitu batas bawah mutu yang harus dilampaui. Angka model boneka menjadi patokan untuk memisahkan akurasi yang mudah dicapai dari kemampuan model yang sebenarnya. Model sungguhan dinilai layak bukan dari akurasi yang mirip dengan model boneka, melainkan dari keberhasilannya menangkap kelas minoritas.

Eksperimen: model boneka dan regresi logistik#

Dataset sintetis dibuat sebesar 2000 baris dengan weights=[0.95, 0.05], sehingga kelas 1 hanya berisi lima persen contoh. Parameter flip_y=0 menjaga label tetap bersih, sehingga jumlah contoh tiap kelas mengikuti proporsi tersebut secara persis. Pemecahan menggunakan stratify=y agar proporsi kelas tetap di kedua himpunan, kemudian DummyClassifier yang selalu menebak kelas mayoritas dibandingkan dengan LogisticRegression pada data uji. Kedua model dinilai dengan classification_report yang mencetak presisi, recall, dan F1 per kelas. Recall menyatakan porsi kejadian positif yang tertangkap, sedangkan F1 merangkum presisi dan recall dalam satu angka.

python bandingkan-metrik.py
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

X, y = make_classification(
    n_samples=2000, weights=[0.95, 0.05],
    flip_y=0, random_state=42,
)

# stratify=y menjaga proporsi kelas tetap sama di kedua himpunan
X_latih, X_uji, y_latih, y_uji = train_test_split(
    X, y, test_size=0.25, stratify=y, random_state=42
)

n0, n1 = np.bincount(y_latih)
print(f"Data latih : {n0} contoh kelas 0, {n1} contoh kelas 1 ({n1 / (n0 + n1):.1%} kelas 1)")
n0, n1 = np.bincount(y_uji)
print(f"Data uji   : {n0} contoh kelas 0, {n1} contoh kelas 1 ({n1 / (n0 + n1):.1%} kelas 1)")
print()

dummy = DummyClassifier(strategy="most_frequent").fit(X_latih, y_latih)
logreg = LogisticRegression(max_iter=1000).fit(X_latih, y_latih)

print("DummyClassifier, strategi selalu kelas mayoritas:")
print(classification_report(y_uji, dummy.predict(X_uji), zero_division=0))
print("LogisticRegression:")
print(classification_report(y_uji, logreg.predict(X_uji), zero_division=0))
text Keluaran
Data latih : 1425 contoh kelas 0, 75 contoh kelas 1 (5.0% kelas 1)
Data uji   : 475 contoh kelas 0, 25 contoh kelas 1 (5.0% kelas 1)

DummyClassifier, strategi selalu kelas mayoritas:
              precision    recall  f1-score   support

           0       0.95      1.00      0.97       475
           1       0.00      0.00      0.00        25

    accuracy                           0.95       500
   macro avg       0.47      0.50      0.49       500
weighted avg       0.90      0.95      0.93       500

LogisticRegression:
              precision    recall  f1-score   support

           0       0.97      0.99      0.98       475
           1       0.73      0.44      0.55        25

    accuracy                           0.96       500
   macro avg       0.85      0.72      0.77       500
weighted avg       0.96      0.96      0.96       500

Angka akurasi kedua model nyaris tidak dapat dibedakan, yaitu 0.95 untuk model boneka dan 0.96 untuk regresi logistik. Baris kelas 1 memberi gambaran yang sebenarnya. Model boneka mencetak presisi 0.00 dan recall 0.00 karena tidak pernah memprediksi kelas 1 sama sekali, sedangkan regresi logistik mencetak presisi 0.73 dan recall 0.44. Recall 0.44 berarti sekitar 11 dari 25 contoh kelas 1 tertangkap, sedangkan model boneka tidak menangkap satu pun. Perbedaan mutu seluruhnya tersembunyi di balik selisih akurasi 0.01.

Baris rata-rata pada laporan juga perlu dibaca dengan hati-hati. Macro avg menghitung rata-rata tanpa bobot sehingga kelas kecil sama pentingnya dengan kelas besar, dan nilainya berpindah dari F1 0.49 pada model boneka menjadi 0.77 pada regresi logistik. Weighted avg memberi bobot sesuai jumlah contoh, sehingga didominasi kelas mayoritas dan nyaris tidak menunjukkan perbedaan. Pada data tak seimbang, baris per kelas dan macro avg menjadi bacaan utama, sedangkan weighted avg mudah terlihat baik tanpa membawa banyak makna.

Metrik yang dibaca pada data tak seimbang#

Presisi mengukur porsi benar dari seluruh prediksi positif, sedangkan recall mengukur porsi kejadian positif yang tertangkap. Kenaikan salah satunya biasanya menurunkan yang lain apabila ambang keputusan digeser, sehingga F1 sebagai rata-rata harmonik keduanya sering digunakan sebagai ringkasan satu angka. Confusion matrix melengkapi ketiganya dengan memuat empat kombinasi prediksi dan kenyataan secara utuh.

Metrik yang ditekankan mengikuti biaya tiap jenis kesalahan. Sistem deteksi penipuan mengutamakan recall karena penipuan yang lolos lebih merugikan daripada pemeriksaan manual yang salah sasaran, sedangkan sistem yang tindak lanjutnya mahal mengutamakan presisi. Akurasi tetap boleh dilaporkan, tetapi tidak pernah menjadi satu-satunya angka pada data tak seimbang.

Salah satu tuas yang paling murah untuk menyeimbangkan kedua metrik adalah menggeser ambang keputusan. Model yang mengeluarkan skor probabilitas dapat dibuat lebih agresif menangkap kelas minoritas dengan menurunkan ambangnya, dan efeknya terlihat langsung pada recall yang naik disertai presisi yang turun. Pemilihan ambang dilakukan dengan melihat data validasi, bukan data uji, agar penilaian akhirnya tetap jujur.

Kesalahan umum#

  • Melaporkan akurasi saja karena menjadi pilihan bawaan. Angka ini mudah diperoleh dan mudah dibaca, tetapi pada data tak seimbang angka tersebut menggambarkan kelas mayoritas dan menyembunyikan kegagalan pada kelas minoritas. Laporan per kelas wajib dibaca sebelum model dinyatakan layak, dan model boneka menjadi pembanding wajibnya.
  • Melakukan oversampling atau undersampling, yaitu menambah contoh kelas minoritas atau membuang sebagian contoh kelas mayoritas, sebelum pemecahan data. Kesalahan ini jarang memunculkan pesan error, tetapi contoh sintetis yang dibuat dari data uji dapat berpindah ke data latih dan menimbulkan kebocoran. Penyeimbangan diterapkan hanya pada data latih, yaitu setelah pemecahan selesai.
  • Mengabaikan kolom support pada laporan. Kolom ini memuat jumlah contoh nyata per kelas, dan angka di sebelahnya baru dapat dipercaya bila jumlahnya memadai. Kelas dengan hanya beberapa contoh menghasilkan metrik yang berfluktuasi besar, sehingga kenaikan kecil pada kelas tersebut tidak boleh dinilai sebagai perbaikan nyata.

Ringkasan#

  • Pada data 95:5, model yang selalu menebak kelas mayoritas sudah mencetak akurasi 0.95, sehingga akurasi tidak mengukur kemampuan mengenali kelas minoritas.
  • Baseline model boneka menetapkan batas bawah, dan model yang layak digunakan harus melampaui recall boneka itu pada kelas minoritas.
  • Presisi, recall, F1 per kelas, dan macro avg mengungkap kegagalan kelas kecil yang tersembunyi di balik akurasi dan weighted avg.
  • Penyeimbangan kelas diterapkan hanya pada data latih setelah pemecahan agar tidak menimbulkan kebocoran data.

Referensi#