পাঠ ১৮ · ৫৭-এর মধ্যে · মডিউল ৪
Home / Courses / Ethics in Computing & AI Safety / অ্যালগরিদমিক বায়াস ও ফেয়ারনেস

বায়াস মিটিগেশন টেকনিক

Bias mitigation techniques
১১ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • প্রি-প্রসেসিং, ইন-প্রসেসিং, ও পোস্ট-প্রসেসিং মিটিগেশনের সংজ্ঞা ও পার্থক্য
  • কেন প্রতিটি কৌশলের প্রয়োগযোগ্যতা ও সীমাবদ্ধতা ভিন্ন
  • Python দিয়ে একটি সত্যিকারের পোস্ট-প্রসেসিং থ্রেশহোল্ড সমন্বয় — আগে ও পরের মেট্রিক্স তুলনা
  • একটি মেট্রিক্স উন্নত করলে আরেকটি কীভাবে সততার সাথে খারাপ হতে দেখা যায়

১ · তিনটি মিটিগেশন পরিবার

L15-এ দেখা গেছে বায়াস তিনটি ভিন্ন ধাপে ঢুকতে পারে। স্বাভাবিকভাবেই, মিটিগেশন কৌশলও পাইপলাইনের তিনটি ভিন্ন বিন্দুতে প্রয়োগ করা যায় — ট্রেনিংয়ের আগে, ট্রেনিংয়ের সময়, অথবা ট্রেনিংয়ের পরে।

প্রি-প্রসেসিং ট্রেনিং ডেটা রিওয়েট/রিস্যাম্পল ইন-প্রসেসিং ট্রেনিংয়ে ফেয়ারনেস কনস্ট্রেইন্ট পোস্ট-প্রসেসিং গোষ্ঠীভিত্তিক থ্রেশহোল্ড
তিনটি কৌশলই একই লক্ষ্যে কাজ করে, কিন্তু ভিন্ন বিন্দুতে হস্তক্ষেপ করে — নিচের কোড সেল তৃতীয়টি (পোস্ট-প্রসেসিং) প্রয়োগ করে দেখাবে।
প্রি-প্রসেসিং
ট্রেনিং ডেটাকে রিওয়েট (কম-প্রতিনিধিত্বপ্রাপ্ত উদাহরণকে বেশি গুরুত্ব দেওয়া) বা রিস্যাম্পল (গোষ্ঠীগুলোকে সমান অনুপাতে আনা) করে — মডেল ট্রেনিং শুরুর আগেই। L15-এর স্যাম্পলিং বায়াসের সরাসরি প্রতিকার।
ইন-প্রসেসিং
মডেলের অপ্টিমাইজেশন উদ্দেশ্যেই একটি ফেয়ারনেস কনস্ট্রেইন্ট বা পেনাল্টি টার্ম যোগ করা হয় (যেমন "নির্ভুলতা সর্বোচ্চ করো, কিন্তু গোষ্ঠীর মধ্যে FPR-এর পার্থক্য একটি সীমার মধ্যে রাখো") — মডেল ট্রেনিংয়ের সময়েই।
পোস্ট-প্রসেসিং
মডেল ইতিমধ্যে ট্রেইন হয়ে গেছে, পরিবর্তন করা হয় না — শুধু সিদ্ধান্ত নেওয়ার থ্রেশহোল্ড প্রতিটি গোষ্ঠীর জন্য আলাদাভাবে সমন্বয় করা হয়। বাস্তবায়ন করা সবচেয়ে সহজ, কিন্তু গোষ্ঠীভিত্তিক ভিন্ন থ্রেশহোল্ড ব্যবহারের নিজস্ব নৈতিক ও আইনি প্রশ্ন আছে।

২ · পোস্ট-প্রসেসিং: একটি সত্যিকারের হিসাব

নিচের কোড সেলে দুটি সিন্থেটিক গোষ্ঠীর প্রতিটি সদস্যের একটি ঝুঁকি-স্কোর (0-1) ও প্রকৃত লেবেল আছে (এই ডেটাসেট L16/L17-এর থেকে সম্পূর্ণ আলাদা, নতুন করে তৈরি)। একই থ্রেশহোল্ড (0.5) উভয় গোষ্ঠীতে প্রয়োগ করলে Group B-এর FPR অনেক বেশি দেখা যায়। পোস্ট-প্রসেসিং হিসেবে শুধু Group B-এর থ্রেশহোল্ড বাড়ানো হবে — এবং ফলাফল সততার সাথে দেখানো হবে, ভালো ও খারাপ দুই দিকই।

Python
# সিন্থেটিক, ইলাস্ট্রেটিভ উদাহরণ (L16/L17-এর থেকে ভিন্ন, এই পাঠের জন্য নতুন তৈরি) --
# প্রতিটি ব্যক্তির একটি ঝুঁকি-স্কোর (0-1) ও প্রকৃত label; predicted_positive = score >= threshold

group_a = [
    (0.90, 1), (0.85, 1), (0.80, 1), (0.75, 1), (0.70, 1), (0.45, 1),
    (0.60, 0), (0.40, 0), (0.35, 0), (0.30, 0), (0.20, 0), (0.10, 0),
]
group_b = [
    (0.95, 1), (0.90, 1), (0.85, 1), (0.80, 1), (0.60, 1), (0.55, 1),
    (0.75, 0), (0.70, 0), (0.65, 0), (0.55, 0), (0.30, 0), (0.20, 0),
]

def metrics_at_threshold(data, threshold):
    tp = fp = fn = tn = 0
    for score, actual in data:
        predicted = 1 if score >= threshold else 0
        if predicted == 1 and actual == 1:
            tp += 1
        elif predicted == 1 and actual == 0:
            fp += 1
        elif predicted == 0 and actual == 1:
            fn += 1
        else:
            tn += 1
    fpr = fp / (fp + tn) if (fp + tn) else 0.0
    fnr = fn / (fn + tp) if (fn + tp) else 0.0
    return {"tp": tp, "fp": fp, "fn": fn, "tn": tn, "fpr": fpr, "fnr": fnr}

# --- মিটিগেশনের আগে: উভয় গ্রুপে একই থ্রেশহোল্ড (0.5) ---
before_a = metrics_at_threshold(group_a, 0.5)
before_b = metrics_at_threshold(group_b, 0.5)

print("মিটিগেশনের আগে (উভয় গ্রুপে থ্রেশহোল্ড = 0.5)")
print(f"  Group A -- FPR: {before_a['fpr']*100:.1f}%  FNR: {before_a['fnr']*100:.1f}%")
print(f"  Group B -- FPR: {before_b['fpr']*100:.1f}%  FNR: {before_b['fnr']*100:.1f}%")

# --- পোস্ট-প্রসেসিং: শুধু Group B-এর থ্রেশহোল্ড বাড়িয়ে 0.72 করা হলো, Group A অপরিবর্তিত ---
after_a = metrics_at_threshold(group_a, 0.5)
after_b = metrics_at_threshold(group_b, 0.72)

print("\nমিটিগেশনের পরে (Group B-এর থ্রেশহোল্ড = 0.72, Group A অপরিবর্তিত = 0.5)")
print(f"  Group A -- FPR: {after_a['fpr']*100:.1f}%  FNR: {after_a['fnr']*100:.1f}%")
print(f"  Group B -- FPR: {after_b['fpr']*100:.1f}%  FNR: {after_b['fnr']*100:.1f}%")

    
যা উন্নত হলো: মিটিগেশনের আগে Group B-এর FPR ছিল ৬৬.৭% — Group A-এর ১৬.৭%-এর চেয়ে অনেক বেশি। থ্রেশহোল্ড 0.72-তে বাড়ানোর পর Group B-এর FPR নেমে আসে ঠিক ১৬.৭%-এ — Group A-এর সমান। এটি একটি প্রকৃত, পরিমাপযোগ্য উন্নতি।

যা খারাপ হলো: একই সমন্বয় Group B-এর FNR-কে ০% থেকে বাড়িয়ে ৩৩.৩%-এ নিয়ে যায় — যা এখন Group A-এর FNR (১৬.৭%)-এর চেয়েও বেশি। FPR-এর ফারাক দূর করতে গিয়ে একটি নতুন, বিপরীত FNR-এর ফারাক তৈরি হয়েছে।
মূল কথা · Key takeaway

পোস্ট-প্রসেসিং থ্রেশহোল্ড সমন্বয় একটি বাস্তব, ব্যবহারযোগ্য কৌশল — কিন্তু এটি "সব ঠিক করে দেয়" এমন নয়। এখানে FPR-এর সমতা অর্জিত হয়েছে FNR-এর নতুন অসমতা তৈরি করার বিনিময়ে। এই ট্রেড-অফটি দুর্ঘটনাক্রমে নয় — এটি একটি গভীরতর গাণিতিক প্যাটার্নের একটি দৃষ্টান্ত, যা L19-এ পূর্ণাঙ্গভাবে প্রমাণসহ ব্যাখ্যা করা হবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ শুধুমাত্র একটি গোষ্ঠীর থ্রেশহোল্ড আলাদা রাখার (গোষ্ঠী-সচেতন পোস্ট-প্রসেসিং) নিজস্ব কী নৈতিক ও আইনি প্রশ্ন থাকতে পারে?

একটি সুরক্ষিত বৈশিষ্ট্য (যেমন জাতি বা লিঙ্গ) সরাসরি ব্যবহার করে ভিন্ন সিদ্ধান্তের নিয়ম প্রয়োগ করা কিছু এখতিয়ারে আইনগতভাবে জটিল বা নিষিদ্ধ হতে পারে, এমনকি যদি উদ্দেশ্যটি ফেয়ারনেস বাড়ানো হয়। এটি "ফেয়ারনেসের জন্য বৈষম্য" বনাম "ক্ষতির জন্য বৈষম্য" — এই দুটোর মধ্যে পার্থক্য নিয়ে একটি বাস্তব, চলমান আইনি ও নীতিগত বিতর্কের জন্ম দেয়।

প্র ০২ প্রি-প্রসেসিং (ডেটা ঠিক করা) কেন কখনো কখনো পোস্ট-প্রসেসিংয়ের চেয়ে ভালো সমাধান মনে হয়, আবার কখনো অপ্রতুল মনে হয়?

প্রি-প্রসেসিং মূল সমস্যাটির (স্যাম্পলিং বায়াস) গোড়ায় গিয়ে সমাধান করে, তাই এটি প্রায়ই "সবচেয়ে সৎ" সমাধান মনে হয়। কিন্তু যদি বায়াসের উৎস মডেল বায়াস বা ডিপ্লয়মেন্ট বায়াস হয় (L15), তাহলে শুধু ট্রেনিং ডেটা ঠিক করলেই সমস্যা সমাধান নাও হতে পারে — কারণ সমস্যাটি ডেটায় নেই। এখানেও সঠিক প্রতিকার নির্ভর করে বায়াসের প্রকৃত উৎস সঠিকভাবে নির্ণয় করার উপর।

প্র ০৩ উপরের কোড সেলে যদি Group B-এর থ্রেশহোল্ড 0.72-এর বদলে আরও বেশি, যেমন 0.90-এ বাড়ানো হতো, তাহলে FPR ও FNR-এর কী হতো বলে মনে হয়?

থ্রেশহোল্ড আরও বাড়ালে FPR আরও কমবে (কম মানুষ পজিটিভ প্রেডিক্ট হবে, তাই ভুল-পজিটিভও কমবে), কিন্তু FNR আরও বাড়বে (প্রকৃত পজিটিভদের আরও বেশি অংশ থ্রেশহোল্ডের নিচে পড়ে যাবে)। এটি একটি ধারাবাহিক ট্রেড-অফ — থ্রেশহোল্ড যত বাড়ে, FPR তত কমে আর FNR তত বাড়ে, কখনো একই সাথে দুটোই কমে না।

অনুশীলন

  1. চিন্তা করুন: একটি সংস্থা যদি শুধুমাত্র FPR সমান করার লক্ষ্যে পোস্ট-প্রসেসিং প্রয়োগ করে এবং এর ফলে FNR-এর ফারাক তৈরি হয় তা প্রকাশ না করে, এটি নৈতিকভাবে কেন সমস্যাজনক?

    এটি একটি অসম্পূর্ণ ও বিভ্রান্তিকর দাবি তৈরি করে — "আমরা ন্যায্য করেছি" বলাটা কোন মেট্রিক্সে ন্যায্য তা না বলে বিভ্রান্তিকর, বিশেষত যখন অন্য একটি গুরুত্বপূর্ণ মেট্রিক্সে নতুন অসমতা তৈরি হয়েছে। স্বচ্ছতা দাবি করে যে কোন মেট্রিক্স উন্নত হয়েছে এবং কোনটির মূল্যে তা স্পষ্টভাবে জানানো হোক — এটিই দায়িত্বশীল রিপোর্টিংয়ের মূল ভিত্তি।

  2. পরীক্ষা করুন: উপরের কোড সেলে after_a-এর থ্রেশহোল্ডও (Group A) 0.5 থেকে 0.60 করে Run চেপে দেখুন Group A-এর নিজস্ব FPR/FNR কীভাবে বদলায়, এবং এরপর Group A ও B-এর নতুন ফারাক কেমন দাঁড়ায়।

    Group A-এর থ্রেশহোল্ড 0.60 করলে (0.60 স্কোরের ব্যক্তিটি এখন predicted-negative হয়ে যাবে) Group A-এর নিজস্ব FNR বাড়বে (2/6 ≈ ৩৩.৩%) এবং FPR কিছুটা কমবে (0/6 = ০%)। এটি দেখায় থ্রেশহোল্ড সমন্বয় একটি গোষ্ঠীতে সীমাবদ্ধ থাকতে হবে এমন নয় — উভয় গোষ্ঠীতে একসাথে প্রয়োগ করলে সামগ্রিক তুলনা আবার নতুনভাবে করতে হয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
কেস স্টাডি: COMPAS ও রিসিডিভিজম প্রেডিকশন