Lewati ke konten utama

Mengukur Bias dalam Machine Learning: Uji Bias Statistik

Tutorial ini akan mendefinisikan bias statistik dalam model machine learning dan menunjukkan cara melakukan uji tersebut pada data sintetis.
DataRobot Inc
DataRobot Inc

Buat Akun Gratis Anda

Berlatih dan lacak kemajuan Anda.

Lanjutkan dengan GoogleDengan melanjutkan, Anda menyetujui Ketentuan Penggunaan, Kebijakan Privasi dan bahwa data Anda disimpan di AS.

Artikel ini ditulis oleh Sarah Khatry dan Haniyeh Mahmoudian, data scientist di DataRobot.

Pertanyaan tentang bias dalam model machine learning mendapat banyak perhatian dalam beberapa tahun terakhir. Kisah tentang model yang melenceng menjadi berita utama, dan para pengacara kemanusiaan, politisi, serta jurnalis turut berkontribusi dalam percakapan mengenai etika dan nilai apa yang ingin kita cerminkan dalam model yang kita bangun.

Meski bias manusia adalah isu yang pelik dan tidak selalu mudah didefinisikan, bias dalam machine learning pada akhirnya bersifat matematis. Ada banyak jenis uji yang dapat Anda lakukan pada model untuk mengidentifikasi berbagai jenis bias dalam prediksinya. Uji mana yang dilakukan terutama bergantung pada hal yang Anda prioritaskan dan konteks penggunaan model.

Salah satu uji yang paling luas penerapannya adalah parity statistik, yang akan dibahas langkah demi langkah dalam tutorial ini. Perlu diingat, bias selalu dinilai relatif terhadap kelompok-kelompok berbeda yang diidentifikasi oleh atribut terlindungi dalam data Anda, misalnya ras, gender, usia, orientasi seksual, kewarganegaraan, dan sebagainya.

Dengan parity statistik, tujuan Anda adalah mengukur apakah kelompok-kelompok berbeda memiliki probabilitas yang sama untuk mencapai hasil yang menguntungkan. Contoh klasik adalah model perekrutan, di mana Anda ingin memastikan pelamar laki-laki dan perempuan memiliki probabilitas yang sama untuk diterima kerja. Dalam model yang bias, Anda justru akan melihat satu kelompok diistimewakan dengan probabilitas lebih tinggi untuk diterima, sementara kelompok lain kurang diuntungkan.

Untuk menunjukkan cara kerjanya dalam praktik, kita akan terlebih dulu membangun data sintetis dengan bias yang sudah kita tentukan, lalu mengonfirmasi melalui analisis bahwa data mencerminkan situasi yang kita maksudkan, dan akhirnya menerapkan uji parity statistik.

Membuat Data Sintetis

Dalam tutorial ini, kita akan menggunakan paket pandas di Python, tetapi setiap langkah dalam proses ini juga dapat direproduksi di R.

import pandas as pd

Untuk menghasilkan data sintetis dengan satu atribut terlindungi dan prediksi model, kita terlebih dahulu perlu menentukan beberapa masukan: jumlah total rekaman, atribut terlindungi itu sendiri (di sini dua nilai generik, A dan B), dan prediksi model yang terkait dengan hasil yang menguntungkan, dalam contoh ini nilai 1.

num_row = 1000 # number of rows in the data
prot_att = 'prot_att' # column name for protected attribute
model_pred_bin = 'prediction' # column name for predictions
pos_label = 1 # prediction value associated to positive/favorable outcome
prot_group = ['A','B'] # two groups in our protected attribute

Seperti di kehidupan nyata, kelompok A dan B mungkin tidak terdistribusi merata dalam data kita. Pada kode di bawah, kita memutuskan bahwa 60% populasi dalam data berasal dari kelompok istimewa B, yang memiliki peluang 30% untuk menerima hasil yang menguntungkan. Kelompok A yang kurang diuntungkan akan membentuk 40% sisanya dan hanya memiliki probabilitas 15% untuk hasil yang menguntungkan.

priv_g = 'B'  # privileged group
priv_g_rate = 60 # 60% of the population is from group B
priv_p_rate = 30 # 30% of the predictions for group B was for favorable outcome 1
unpriv_p_rate = 15 # 15% of the predictions for group A was for favorable outcome 1
biased_list_priv = [prot_group[0]] * (100 - priv_g_rate) + [prot_group[1]] * priv_g_rate
biased_list_pos_priv = [0] * (100 - priv_p_rate) + [1] * priv_p_rate
biased_list_pos_unpriv = [0] * (100 - unpriv_p_rate) + [1] * unpriv_p_rate

Untuk setiap rekaman data, kita secara acak menetapkan kelompok terlindungi dan prediksi, menggunakan bias yang telah kita tentukan sebelumnya sebagai bobot, lalu membuat dataframe dari daftar rekaman tersebut.

list_df = [] # empty list to store the synthetic records
for i in range(0, num_row):
   # generating random value representing protected groups with bias towards B
   prot_rand = random.choices(biased_list_priv)[0]
   if prot_rand == priv_g:
       prot_g = priv_g
       # generating random binary value representing prediction with bias towards 0
       pred = random.choices(biased_list_pos_priv)[0]
       # adding the new record to the list
       list_df.append([prot_g,pred])
   else:
       prot_g = prot_group[0]
       pred = random.choices(biased_list_pos_unpriv)[0]
       list_df.append([prot_g,pred])
# create a dataframe from the list
df = pd.DataFrame(list_df,columns=['prot_att','prediction'])

Menafsirkan Data

Sekarang kita sudah memiliki data sintetis, mari kita analisis apa yang telah kita bangun. Untuk setiap kelompok, A versus B, berapa probabilitas kelas mereka untuk mencapai hasil yang menguntungkan atau tidak menguntungkan?

df_group = (df.groupby([prot_att])[model_pred_bin].value_counts() / df.groupby([prot_att])[
   model_pred_bin].count()).reset_index(name='probability')
print(df_group)
  prot_att  prediction  probability
0        A           0     0.849490
1        A           1     0.150510
2        B           0     0.713816
3        B           1     0.286184

Dengan memeriksa tabel, mudah terlihat bahwa kelompok B memiliki peluang hampir dua kali lipat untuk mencapai hasil yang menguntungkan, dengan probabilitas 28,6%. Data sintetis kita dirancang memiliki probabilitas 30%, jadi hasilnya cukup mendekati. Kemudian kita simpan probabilitas tersebut dalam sebuah kamus.

Karena dihasilkan secara acak, kode Anda mungkin memberikan hasil yang sedikit berbeda.

prot_att_dic = {}
for att in prot_group:
   temp = df_group[(df_group[prot_att] == att) & (df_group[model_pred_bin] == pos_label)]
   prob = float(temp['probability'])
   prot_att_dic[att] = prob

Uji Paritas Statistik

Untuk setiap kelompok, parity statistik menghasilkan rasio probabilitas mereka mencapai hasil yang menguntungkan dibandingkan dengan probabilitas kelompok istimewa mencapai hasil yang menguntungkan. Kita iterasikan kamus setiap kelompok terlindungi beserta probabilitas hasil menguntungkannya untuk membentuk rasio.

prot_test_res = {}
for k in prot_att_dic.keys():
   res = float(prot_att_dic[k] / prot_att_dic[priv_g])
   prot_test_res[k] = res
for key in prot_test_res.keys():
   value = prot_test_res[key]
   print(key, ' : ', value)
A  :  0.5259207131128314
B  :  1.0

Untuk kelompok istimewa, B, skor parity statistik adalah 1, sebagaimana mestinya. Untuk kelompok lainnya, A, skor mereka adalah 0,526, yang menunjukkan bahwa mereka memiliki peluang kira-kira setengah untuk mencapai hasil yang menguntungkan dibandingkan kelompok B.

Uji bias statistik memberikan penilaian sederhana tentang seberapa berbeda hasil prediksi bagi kelompok-kelompok tertentu dalam data Anda. Tujuan mengukur bias bersifat dua arah. Di satu sisi, uji ini menghasilkan metrik yang transparan, sehingga lebih mudah dan konkret untuk dikomunikasikan. Namun idealnya, mengidentifikasi bias adalah langkah awal untuk mulai menguranginya dalam model Anda. Ini adalah area riset yang marak dalam machine learning, dengan banyak teknik yang dikembangkan untuk mengakomodasi berbagai jenis bias dan pendekatan pemodelan.

Dengan kombinasi teknik pengujian dan mitigasi yang tepat, Anda dapat secara iteratif memperbaiki model, mengurangi bias, dan tetap menjaga akurasi. Anda dapat merancang sistem machine learning yang tidak hanya belajar dari hasil historis, tetapi juga mencerminkan nilai-nilai Anda dalam pengambilan keputusan di masa depan.

Temukan cara membangun AI yang dapat Anda percaya dengan DataRobot.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Spaghetti Plot dan Jalur Badai