मुख्य सामग्री पर जाएं
मशीन लर्निंग

मशीन लर्निंग में पक्षपात का मापन: सांख्यिकीय पक्षपात परीक्षण

यह ट्यूटोरियल मशीन लर्निंग मॉडल में सांख्यिकीय पक्षपात की परिभाषा देगा और सिंथेटिक डेटा पर यह परीक्षण कैसे करें, इसका प्रदर्शन करेगा।
DataRobot Inc's photo
DataRobot Inc
अपडेट किया गया · 6 मि॰ पढ़ें

AI के साथ खोजें

ChatGPTClaudePerplexity

अपना निःशुल्क खाता बनाएँ

अभ्यास और ट्रैक अपनी प्रगति को।

Google के साथ जारी रखें
जारी रखने पर, आप हमारी उपयोग की शर्तें, हमारी गोपनीयता नीति को स्वीकार करते हैं और यह भी कि आपका डेटा संयुक्त राज्य अमेरिका में संग्रहीत किया जाता है।

यह लेख DataRobot की डेटा वैज्ञानिक Sarah Khatry और Haniyeh Mahmoudian ने लिखा है।

पिछले कुछ वर्षों में मशीन लर्निंग मॉडलों में पक्षपात का सवाल काफी ध्यान का विषय रहा है। मॉडलों के गलत परिणाम सुर्खियाँ बनते हैं, और मानवीय अधिकारों के वकील, राजनीतिज्ञ, और पत्रकार—सभी ने इस बातचीत में योगदान दिया है कि हम अपने बनाए मॉडलों में किन नैतिकताओं और मूल्यों का प्रतिबिंब देखना चाहते हैं।

जहाँ मानवीय पक्षपात जटिल और हमेशा स्पष्ट रूप से परिभाषित नहीं होता, वहीं मशीन लर्निंग में पक्षपात अंततः गणितीय होता है। अपने मॉडल की भविष्यवाणियों में विभिन्न प्रकार के पक्षपात की पहचान करने के लिए आप कई तरह के परीक्षण कर सकते हैं। कौन-सा परीक्षण करना है, यह मुख्यतः इस पर निर्भर करता है कि आपको किस बात की परवाह है और मॉडल किस संदर्भ में प्रयोग हो रहा है।

सबसे व्यापक रूप से लागू होने वाले परीक्षणों में से एक है सांख्यिकीय समानता (statistical parity), जिसका यह प्रायोगिक ट्यूटोरियल मार्गदर्शन करेगा। ध्यान रहे, पक्षपात का आकलन हमेशा आपके डेटा में किसी संरक्षित गुणधर्म—जैसे नस्ल, लिंग, आयु, यौनिकता, राष्ट्रीयता आदि—से पहचाने गए विभिन्न समूहों के संदर्भ में किया जाता है।

सांख्यिकीय समानता में आपका लक्ष्य यह मापना होता है कि क्या अलग-अलग समूहों के पास अनुकूल परिणाम प्राप्त करने की समान संभावना है। एक क्लासिक उदाहरण भर्ती का मॉडल है, जहाँ आप सुनिश्चित करना चाहेंगे कि पुरुष और महिला आवेदकों के नियुक्त होने की संभावना समान हो। एक पक्षपाती मॉडल में आप पाएँगे कि एक समूह के नियुक्त होने की संभावना अधिक है और दूसरा समूह वंचित है।

यह व्यावहारिक रूप से कैसे काम करता है, यह दिखाने के लिए हम पहले पूर्व-परिभाषित पक्षपात के साथ सिंथेटिक डेटा बनाएँगे, फिर विश्लेषण के जरिए पुष्टि करेंगे कि डेटा वैसा ही परिदृश्य दर्शा रहा है जैसा हमने चाहा था, और अंत में सांख्यिकीय समानता परीक्षण लागू करेंगे।

सिंथेटिक डेटा बनाना

इस ट्यूटोरियल में हम Python में pandas पैकेज का उपयोग करेंगे, लेकिन इस प्रक्रिया के हर चरण को R में भी दोहराया जा सकता है।

import pandas as pd

एक संरक्षित गुणधर्म और मॉडल की भविष्यवाणियों के साथ सिंथेटिक डेटा उत्पन्न करने के लिए, हमें पहले कुछ इनपुट निर्दिष्ट करने होंगे: कुल रिकॉर्डों की संख्या, स्वयं संरक्षित गुणधर्म (यहाँ दो सामान्य मान A और B), और वह मॉडल भविष्यवाणी जो अनुकूल परिणाम से संबद्ध है—इस उदाहरण में मान 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

वास्तविक जीवन की तरह, हमारे डेटा में समूह A और B समान रूप से वितरित नहीं भी हो सकते हैं। नीचे दिए गए कोड में, हमने तय किया है कि हमारे डेटा की 60% आबादी विशेषाधिकार प्राप्त समूह B से होगी, जिनके पास अनुकूल परिणाम पाने की 30% संभावना होगी। वंचित समूह A शेष 40% होगा और उनके पास अनुकूल परिणाम की केवल 15% संभावना होगी।

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

डेटा के प्रत्येक रिकॉर्ड के लिए, हम पहले से निर्दिष्ट पक्षपात को वज़नों के रूप में उपयोग करते हुए एक संरक्षित समूह और एक भविष्यवाणी को यादृच्छिक रूप से असाइन करते हैं, और फिर रिकॉर्डों की इस सूची से एक डेटा फ्रेम बनाते हैं।

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

डेटा की व्याख्या

अब जब हमारे पास सिंथेटिक डेटा है, तो आइए देखें कि हमने क्या बनाया है। प्रत्येक समूह—A बनाम B—के लिए, अनुकूल या प्रतिकूल परिणाम प्राप्त करने की उनकी श्रेणी-आधारित संभावना क्या है?

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

तालिका को देखकर यह समझना कठिन नहीं है कि समूह B के पास अनुकूल परिणाम प्राप्त करने की लगभग दोगुनी संभावना है, 28.6% की प्रायिकता के साथ। हमारा सिंथेटिक डेटा 30% की प्रायिकता के लिए डिज़ाइन किया गया था, तो हम काफ़ी नज़दीक हैं। इसके बाद हम इन प्रायिकताओं को एक डिक्शनरी में सहेजते हैं।

क्योंकि यह यादृच्छिक रूप से जनरेट होता है, आपके कोड का परिणाम थोड़ा भिन्न हो सकता है।

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

सांख्यिकीय समानता परीक्षण

प्रत्येक समूह के लिए, सांख्यिकीय समानता उनके अनुकूल परिणाम प्राप्त करने की प्रायिकता का अनुपात देती है, जिसे विशेषाधिकार प्राप्त समूह की अनुकूल परिणाम प्रायिकता से तुलना की जाती है। हम अनुकूल परिणाम की प्रायिकता वाली प्रत्येक संरक्षित समूह की डिक्शनरी पर इटरेट करके यह अनुपात बनाते हैं।

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

विशेषाधिकार प्राप्त समूह B के लिए सांख्यिकीय समानता स्कोर 1 आता है, जैसा कि होना चाहिए। दूसरे समूह A के लिए उनका स्कोर 0.526 है, जो संकेत करता है कि उनके पास समूह B की तुलना में अनुकूल परिणाम पाने की संभावना लगभग आधी है।

सांख्यिकीय पक्षपात परीक्षण आपके डेटा में चुने गए समूहों के लिए संभावित भविष्यवाणी परिणामों में अंतर का एक सरल आकलन प्रदान करता है। पक्षपात को मापने का उद्देश्य दोहरा है। एक ओर, यह परीक्षण एक पारदर्शी मेट्रिक देता है, जिससे संप्रेषण सरल और ठोस हो जाता है। पर आदर्श रूप से, पक्षपात की पहचान आपके मॉडल में उसे कम करने की शुरुआत का पहला कदम है। यह मशीन लर्निंग में अनुसंधान का एक सक्रिय क्षेत्र है, जहाँ विभिन्न प्रकार के पक्षपात और मॉडलिंग दृष्टिकोणों को समायोजित करने के लिए कई तकनीकें विकसित की जा रही हैं।

उचित परीक्षण और शमन तकनीकों के संयोजन के साथ, आप अपने मॉडल में क्रमिक रूप से सुधार कर सकते हैं, पक्षपात घटा सकते हैं, और सटीकता बनाए रख सकते हैं। आप ऐसे मशीन लर्निंग सिस्टम डिज़ाइन कर सकते हैं जो केवल ऐतिहासिक परिणामों से न सीखें, बल्कि भविष्य के निर्णय-निर्धारण में आपके मूल्यों का भी प्रतिबिंब करें।

DataRobot के साथ भरोसेमंद AI बनाना कैसे सीखें, जानें।

विषय
मशीन लर्निंग