Model dengan akurasi rata-rata yang tinggi masih bisa berpihak terhadap sebagian kelompok data. Topik ini membahas tiga praktik machine learning yang bertanggung jawab, yaitu mengenali bias yang masuk bersama dataset, mengukur ketimpangan antarkelompok dengan metrik keadilan (fairness), dan mendokumentasikan model secara jujur melalui model card. Praktiknya memakai data sintetis dua kelompok yang dilatih dengan regresi logistik, lalu selisih metriknya diukur per kelompok.
Bias masuk bersama data#
Model belajar dari contoh, sehingga contoh yang tidak mewakili seluruh populasi menghasilkan model yang berpihak. Bias itu masuk melalui tiga pintu yang sering terjadi. Pintu pertama adalah pencuplikan, yaitu kelompok tertentu jarang muncul dalam data sehingga modelnya kurang terlatih pada kelompok itu. Pintu kedua adalah label, karena label yang ditetapkan manusia dapat membawa penilaian yang tidak setara antar kelompok. Pintu ketiga adalah pengukuran, misalnya dua alat ukur dengan kualitas berbeda yang dipakai untuk kelompok yang berbeda.
Contoh konkret membantu menemukan pintu yang terbuka pada data nyata. Data pemeriksaan kesehatan yang berasal dari satu laboratorium saja membawa bias pencuplikan terhadap wilayah lain, sedangkan label tingkat keparahan yang ditetapkan satu pembaca membawa bias penilaiannya sendiri. Pengukuran yang bias juga tidak selalu terlihat, misalnya alat ukur yang dikalibrasi untuk kelompok tertentu saja. Akibatnya, perbedaan antar kelompok pada data bisa jadi buatan alatnya dan bukan perbedaan yang sesungguhnya. Pertanyaan penyelidikannya sederhana, yaitu dari mana setiap kelompok dalam data diperoleh dan siapa yang menetapkan labelnya.
Bias ini paling sulit terlihat pada metrik agregat. Skor keseluruhan yang tampak sehat dapat menyembunyikan kelompok kecil yang selalu dinilai keliru, karena sumbangannya kecil terhadap rata-rata. Karena itu langkah pertama yang bertanggung jawab bukan memperbaiki model, melainkan memecah evaluasi per kelompok sejak awal, sebagaimana pemecahan data latih dan data uji dijaga sejak awal pada topik data.
Mengukur keadilan per kelompok#
Dua ukuran yang sering dipakai adalah laju seleksi dan recall per kelompok. Laju seleksi adalah porsi contoh yang diprediksi positif, dan selisih antarkelompoknya dikenal sebagai demographic parity difference. Recall adalah porsi contoh positif yang berhasil ditemukan, dan selisih antarkelompoknya dikenal sebagai equal opportunity difference. Skrip berikut membuat 600 contoh sintetis dua kelompok, dengan kelompok B hanya berisi 30 persen contoh dan alat ukurnya bergeser 0.8, lalu mengukur kedua metrik tersebut pada model regresi logistik.
"""Mengukur keadilan model pada dua kelompok data sintetis."""
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import recall_score
from sklearn.model_selection import train_test_split
# data sintetis dua kelompok: kelompok B memakai alat ukur yang bergeser
rng = np.random.default_rng(42)
n = 600
kelompok = np.array(["A"] * 420 + ["B"] * 180)
rng.shuffle(kelompok)
X = rng.normal(0.0, 1.0, size=(n, 3))
X[kelompok == "B"] += 0.8 # pergeseran skala alat ukur kelompok B
# label: gabungan fitur dengan ambang, ditambah derau pengukuran
skor_sejati = X[:, 0] + 0.5 * X[:, 1] - 0.3 * X[:, 2]
y = (skor_sejati + rng.normal(0.0, 0.4, n) > 0.4).astype(int)
X_latih, X_uji, y_latih, y_uji, g_latih, g_uji = train_test_split(
X, y, kelompok, test_size=0.30, random_state=42, stratify=y
)
model = LogisticRegression(max_iter=5000).fit(X_latih, y_latih)
prediksi = model.predict(X_uji)
mask_A, mask_B = g_uji == "A", g_uji == "B"
print("Metrik per kelompok pada data uji:")
for nama, mask in [("A", mask_A), ("B", mask_B)]:
laju_seleksi = prediksi[mask].mean()
recall = recall_score(y_uji[mask], prediksi[mask])
print(f" Kelompok {nama}: n={mask.sum()}, laju seleksi={laju_seleksi:.3f}, recall={recall:.3f}")
# dua ukuran ketimpangan: selisih laju seleksi dan selisih recall
selisih_seleksi = prediksi[mask_A].mean() - prediksi[mask_B].mean()
recall_A = recall_score(y_uji[mask_A], prediksi[mask_A])
recall_B = recall_score(y_uji[mask_B], prediksi[mask_B])
selisih_recall = recall_A - recall_B
print(f"Recall keseluruhan (agregat): {recall_score(y_uji, prediksi):.3f}")
print(f"Selisih laju seleksi (A-B) : {selisih_seleksi:+.3f}")
print(f"Selisih recall (A-B) : {selisih_recall:+.3f}")Metrik per kelompok pada data uji:
Kelompok A: n=124, laju seleksi=0.403, recall=0.939
Kelompok B: n=56, laju seleksi=0.714, recall=0.973
Recall keseluruhan (agregat): 0.953
Selisih laju seleksi (A-B) : -0.311
Selisih recall (A-B) : -0.034Recall keseluruhan terbaca 0.953 dan tampak sehat, tetapi laju seleksi kedua kelompok terpisah jauh, yaitu 0.403 untuk kelompok A dan 0.714 untuk kelompok B dengan selisih 0.311. Sumbernya sudah diketahui karena datanya buatan, yaitu pergeseran alat ukur kelompok B yang membuat fiturnya tampak lebih tinggi bagi model. Pada data nyata, selisih semacam ini adalah pertanyaan yang harus diselidiki, bukan vonis. Laju seleksi yang berbeda bisa berasal dari prevalensi yang memang berbeda ataupun dari pengukuran yang bias. Kedua penyebab itu menuntut tindak lanjut yang berbeda.
Perbandingan kedua selisih juga menunjukkan mengapa metrik keadilan tidak boleh berhenti pada satu angka. Selisih recall hanya 0.034, sehingga dari sisi kesempatan menemukan contoh positif kedua kelompok tampak setara. Selisih laju seleksi 0.311, sehingga dari sisi seberapa sering model menandai positif, kedua kelompok diperlakukan sangat berbeda. Metrik mana yang menjadi ukuran utama ditentukan oleh konsekuensi keputusannya, dan penentuannya membutuhkan konteks domain, bukan sekadar angka pada tabel.
Model card yang jujur#
Model card adalah dokumen ringkas yang menyertai model dan menjawab pertanyaan dasar pemakainya, yaitu untuk apa model ini dibuat, dari data apa ia belajar, seberapa baik kinerjanya, dan apa batas-batasnya. Dokumen ini ditulis bersama evaluasi, bukan sesudah model disajikan, karena kinerja per kelompok dan keterbatasannya lebih mudah dinyatakan jujur ketika hasil evaluasinya baru diperoleh. Kerangka berikut mengambil angka dari skrip di atas.
Model card: prioritas pemeriksaan lanjutan
Tujuan : membantu prioritas pemeriksaan lanjutan dari tiga pengukuran
Data latih : 600 contoh sintetis dua kelompok, seed 42, sidik jari tercatat
Kinerja : recall keseluruhan 0.953
Per kelompok : laju seleksi A 0.403, B 0.714, selisih 0.311
Batasan : data sintetis, bukan data pemeriksaan sesungguhnya, kelompok B
hanya 30 persen contoh, tidak untuk keputusan akhir tanpa
penilaian tenaga pemeriksaPembaca model card bukan hanya pembuatnya. Anggota tim yang baru bergabung membacanya untuk memahami batas model, tim lain yang memakai modelnya membacanya untuk mengetahui kapan model boleh dipercaya, dan pembaruan versi model menuntut pembaruan dokumennya pada saat yang sama. Dokumen yang menyertai setiap versi artefak membuat pertanyaan versi mana yang dipakai dan angka apa yang menyertainya dapat dijawab tanpa menggali ulang catatan pelatihan.
Isi model card juga saling mengunci dengan pemberian versi artefak. Apabila setiap berkas model disertai dokumennya, pertanyaan tentang versi yang sedang disajikan tinggal dibalas dengan membaca berkas yang bersanding dengannya. Kebiasaan ini melanjutkan pencatatan metadata artefak pada topik persistensi, yaitu dataset, skor uji, dan versi pustaka, dengan tambahan kinerja per kelompok dan batasan pemakaiannya.
Kesalahan umum#
- Menilai model hanya dari metrik agregat. Kelompok kecil yang selalu dinilai keliru tersembunyi di balik rata-ratanya. Hitung metrik per kelompok sejak evaluasi pertama, bukan setelah aduan muncul.
- Mencocokkan seluruh kelompok secara paksa. Selisih laju seleksi bukan otomatis bias, karena prevalensi yang memang berbeda juga menghasilkan selisih. Selidiki penyebabnya dengan konteks data sebelum mengubah model.
- Menulis model card setelah model disajikan. Dokumen yang menyusul biasanya hanya menyalin angka terbaiknya. Susun bersama evaluasi dan perbarui pada setiap versi model baru.
- Menghapus kelompok yang terlalu kecil dari evaluasi. Kelompok kecil justru paling rentan dinilai keliru dan paling mudah tersembunyi di balik rata-rata. Laporkan metriknya meski ukuran sampelnya kecil, lengkap dengan jumlah contohnya, agar ketidakpastian pembacaannya terbuka.
- Menggunakan data latih untuk menilai keadilan. Metrik pada data latih mengukur hafalan model, bukan perilakunya pada contoh baru, sehingga selisihnya bisa tampak bagus tanpa dasar. Ukur selisih antar kelompok pada data uji yang sama dengan evaluasi utama.
Ringkasan#
- Bias masuk bersama data melalui pencuplikan, label, dan pengukuran yang tidak setara antar kelompok.
- Metrik keadilan membandingkan laju seleksi dan recall antar kelompok, sedangkan agregatnya menyembunyikan ketimpangan.
- Selisih metrik memicu penyelidikan penyebab, karena perbedaan prevalensi yang sejati dan bias pengukuran menuntut tindak lanjut yang berbeda.
- Model card yang jujur mencantumkan tujuan, data, kinerja per kelompok, dan batasan pemakaian sejak evaluasi pertama.
Referensi#
- Model Cards — Hugging Face — Panduan model card yang merinci isi dokumentasi model beserta alasan tiap bagiannya.
- Fairlearn — Fairlearn project — Pustaka terbuka untuk menilai dan mengukur ketimpangan model antar kelompok.
- sklearn.metrics.recall_score — scikit-learn — Dokumentasi recall yang dipakai skrip untuk mengukur kinerja per kelompok.