Ana içeriğe geç

Makine Öğreniminde Önyargıyı Ölçme: İstatistiksel Önyargı Testi

Bu eğitim, bir makine öğrenimi modelinde istatistiksel önyargıyı tanımlayacak ve testi sentetik veriler üzerinde nasıl uygulayacağınızı gösterecektir.
DataRobot Inc
DataRobot Inc

Ücretsiz Hesabınızı Oluşturun

Alıştırma and program your progress.

Google ile devam edinDevam ederek, Kullanım Koşullarımızı ve Gizlilik Politikamızı kabul etmiş ve verilerinizin ABD'de saklandığını onaylamış olursunuz.

Bu makale, DataRobot’ta veri bilimci olan Sarah Khatry ve Haniyeh Mahmoudian tarafından yazılmıştır.

Makine öğrenimi modellerinde önyargı sorusu, son yıllarda epey dikkat çekti. Yanlış sonuçlar üreten modellere dair hikâyeler manşetlere çıktıkça, insancıl hukukçular, politikacılar ve gazeteciler de inşa ettiğimiz modellerde hangi etikler ve değerlerin yansımasını istediğimize dair tartışmaya katkıda bulundu.

İnsani önyargı karmaşık ve her zaman kolayca tanımlanabilir olmasa da, makine öğrenimindeki önyargı nihayetinde matematikseldir. Modelinizde, tahminlerdeki farklı türde önyargıları tespit etmek için uygulayabileceğiniz pek çok farklı test vardır. Hangi testin uygulanacağı çoğunlukla neye önem verdiğinize ve modelin hangi bağlamda kullanıldığına bağlıdır.

En yaygın uygulanabilir testlerden biri istatistiksel paritedir; bu uygulamalı eğitimde adım adım ele alacağız. Önyargı, her zaman verinizde korunan bir öznitelikle tanımlanan farklı insan gruplarına göre değerlendirilir; örneğin ırk, cinsiyet, yaş, cinsel yönelim, milliyet vb.

İstatistiksel paritede amacınız, farklı grupların elverişli bir sonuca ulaşma olasılıklarının eşit olup olmadığını ölçmektir. Klasik bir örnek işe alım modelidir; erkek ve kadın adayların işe alınma olasılıklarının eşit olmasını istersiniz. Önyargılı bir modelde ise, bir grubun işe alınma olasılığı daha yüksek olacak şekilde ayrıcalıklı, diğer grubun ise dezavantajlı olduğunu görürsünüz.

Bunun pratikte nasıl işlediğini göstermek için önce önceden tanımladığımız bir önyargıya sahip sentetik veri oluşturacağız, ardından analiz yoluyla verilerin hedeflediğimiz durumu yansıttığını doğrulayacak ve son olarak istatistiksel parite testini uygulayacağız.

Sentetik Veri Oluşturma

Bu eğitimde Python’da pandas paketini kullanacağız; ancak bu sürecin her adımı R’da da çoğaltılabilir.

import pandas as pd

Korunan bir öznitelik ve model tahminleri içeren sentetik veri üretmek için önce birkaç girdiyi belirtmemiz gerekir: toplam kayıt sayısı, korunan öznitelik (burada iki genel değer, A ve B) ve elverişli sonuçla ilişkilendirilen model tahmini; bu örnekte değer 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

Gerçek hayatta olduğu gibi, A ve B grupları verimizde eşit dağılmayabilir. Aşağıdaki kodda, verimizdeki nüfusun %60’ının, elverişli sonuca ulaşma olasılığı %30 olan ayrıcalıklı B grubundan olmasına karar verdik. Ayrıcalıklı olmayan A grubu ise verinin kalan %40’ını oluşturacak ve elverişli sonuç için yalnızca %15 olasılığa sahip olacaktır.

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

Verideki her kayıt için, daha önce belirlediğimiz önyargıları ağırlık olarak kullanarak rastgele bir korunan grup ve bir tahmin atarız ve ardından kayıtlardan bir liste oluşturup bir veri çerçevesine dönüştürürüz.

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'])

Veriyi Yorumlama

Artık sentetik verimiz olduğuna göre, neler oluşturduğumuzu analiz edelim. Her bir grup için, A’ya karşı B, elverişli veya elverişsiz sonuca ulaşma sınıf olasılıkları nedir?

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

Tabloya baktığımızda, B grubunun elverişli sonuca ulaşma olasılığının neredeyse iki kat olduğunu, yani %28,6 olduğunu görmek zor değil. Sentetik verimiz %30 olasılığa sahip olacak şekilde tasarlanmıştı; dolayısıyla hedefe yakınız. Ardından bu olasılıkları bir sözlükte saklarız.

Rastgele üretildiği için, kodunuz biraz farklı bir sonuç verebilir.

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

İstatistiksel Parite Testi

Her bir grup için istatistiksel parite, elverişli sonuca ulaşma olasılıklarının, ayrıcalıklı grubun elverişli sonuca ulaşma olasılığına oranını verir. Elverişli sonuç olasılığına sahip her korunan grubu içeren sözlük üzerinde yineleme yaparak oranları oluştururuz.

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

Ayrıcalıklı grup B için istatistiksel parite skoru olması gerektiği gibi 1’dir. Diğer grup A için skor 0,526 olup, bu da B grubuna kıyasla elverişli sonuca ulaşma olasılıklarının kabaca yarısı olduğunu gösterir.

İstatistiksel önyargı testi, verinizdeki belirli gruplar için tahmin edilen sonuçların ne kadar farklı olabileceğine dair basit bir değerlendirme sunar. Önyargıyı ölçmenin iki yönlü bir amacı vardır. Bir yandan, bu test şeffaf bir metrik sunarak iletişimi daha kolay ve somut hâle getirir. Ancak ideal olarak, önyargıyı tespit etmek modelinizde onu azaltmaya başlamanın ilk adımıdır. Bu konu, farklı önyargı türlerini ve modelleme yaklaşımlarını ele almak üzere pek çok tekniğin geliştirildiği makine öğrenimi alanında sıcak bir araştırma konusudur.

Doğru test ve azaltma tekniklerinin birleşimiyle, modelinizi yinelemeli olarak iyileştirmek, önyargıyı azaltmak ve doğruluğu korumak mümkün olur. Makine öğrenimi sistemlerini yalnızca geçmiş sonuçlardan öğrenen değil, gelecekteki karar verme süreçlerinde değerlerinizi de yansıtan şekilde tasarlayabilirsiniz.

Güvenebileceğiniz yapay zekâyı nasıl geliştirebileceğinizi DataRobot ile keşfedin.

Konular

İlgili