পাঠ ১১ · ৫৭-এর মধ্যে · মডিউল ৩
Home / AI Courses / AI Ethics / COMPAS কেস স্টাডি

কেস স্টাডি — COMPAS ও রিসিডিভিজম প্রেডিকশন

Case study: COMPAS & recidivism prediction
১০ মিনিট পড়া মধ্যম-কঠিন · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • COMPAS টুল কী এবং কোন প্রেক্ষাপটে ব্যবহৃত হয়
  • ২০১৬ সালের ProPublica তদন্তের সাধারণ চিত্র (well-established সাধারণ ফাইন্ডিং, নির্দিষ্ট বিতর্কিত সংখ্যা নয়)
  • Northpointe/Equivant-এর পাল্টা-যুক্তি ও কেন এটিও প্রযুক্তিগতভাবে বৈধ
  • কেন "সমান ক্যালিব্রেশন" ও "ভিন্ন FPR/FNR" একই সাথে সত্য হতে পারে যখন গ্রুপগুলোর বেস রেট ভিন্ন
  • L10-এর ক্যালকুলেটর ব্যবহার করে এই ঘটনার একটি সত্যিকারের, গণনা করা সিন্থেটিক উদাহরণ

১ · COMPAS কী

COMPAS (Correctional Offender Management Profiling for Alternative Sanctions) যুক্তরাষ্ট্রের বিভিন্ন আদালত ও সংশোধনী ব্যবস্থায় ব্যবহৃত একটি বাণিজ্যিক রিস্ক-অ্যাসেসমেন্ট টুল, যা একজন অভিযুক্ত/দণ্ডপ্রাপ্ত ব্যক্তির ভবিষ্যতে পুনরায় অপরাধ করার (রিসিডিভিজম) সম্ভাবনার একটি স্কোর/ঝুঁকি-স্তর (low/medium/high risk) তৈরি করে — যা প্রি-ট্রায়াল রিলিজ বা সেন্টেন্সিং-সম্পর্কিত সিদ্ধান্তে একটি ইনপুট হিসেবে ব্যবহৃত হয়ে থাকে। COMPAS এই ধরনের একাধিক রিস্ক-অ্যাসেসমেন্ট টুলের মধ্যে একটি, এবং এটিই সবচেয়ে বহুল-আলোচিত হয়ে ওঠে ২০১৬ সালের একটি সাংবাদিকতামূলক তদন্তের পর।

২ · ২০১৬ সালের ProPublica "Machine Bias" তদন্ত

অনুসন্ধানী সাংবাদিকতা প্রতিষ্ঠান ProPublica ২০১৬ সালে COMPAS-এর ফলাফল বিশ্লেষণ করে একটি ব্যাপকভাবে আলোচিত প্রতিবেদন প্রকাশ করে। তাদের বিশ্লেষণের সাধারণ, সুপ্রতিষ্ঠিত ফাইন্ডিং ছিল: বিভিন্ন জাতিগত গ্রুপ জুড়ে টুলটির ক্যালিব্রেশন মোটামুটি সমান ছিল (অর্থাৎ "high-risk" ট্যাগের প্রকৃত অর্থ — কত শতাংশ সত্যিই পুনরায় অপরাধ করেছেন — গ্রুপ জুড়ে কাছাকাছি ছিল), কিন্তু False Positive Rate ও False Negative Rate স্পষ্টভাবে ভিন্ন ছিল: সাধারণভাবে, Black defendant-দের প্রায়ই ভুলভাবে high-risk হিসেবে চিহ্নিত করা হয়েছিল যদিও তারা পরবর্তীতে পুনরায় অপরাধ করেননি, আর white defendant-দের প্রায়ই ভুলভাবে low-risk বলা হয়েছিল যদিও তারা পুনরায় অপরাধ করেছিলেন। এখানে ইচ্ছাকৃতভাবেই কোনো নির্দিষ্ট সংখ্যা উল্লেখ করা হচ্ছে না, কারণ প্রকৃত রিপোর্ট করা পরিসংখ্যান নিয়েও পদ্ধতিগত বিতর্ক রয়েছে — নিচের কোড সেলে আমরা নিজেদের সিন্থেটিক সংখ্যা দিয়ে একই ধরনের প্যাটার্ন দেখাব।

৩ · Northpointe/Equivant-এর পাল্টা-যুক্তি

COMPAS-এর নির্মাতা প্রতিষ্ঠান (তখন Northpointe, পরে Equivant নামে পরিচিত) পাল্টা যুক্তি দেয় যে তাদের টুল সামগ্রিকভাবে ভালোভাবে ক্যালিব্রেটেড — অর্থাৎ একটি নির্দিষ্ট রিস্ক-স্কোরের মানুষদের মধ্যে প্রকৃত রিসিডিভিজম রেট জাতিগত গ্রুপ জুড়ে সামঞ্জস্যপূর্ণ, যা তাদের মতে একটি প্রেডিকশন টুলের জন্য একটি গুরুত্বপূর্ণ ও যুক্তিসঙ্গত ফেয়ারনেস মানদণ্ড। এটি নিছক "কোম্পানির সাফাই" নয় — ক্যালিব্রেশন এবং ইকুয়ালাইজড অডস দুটোই স্বীকৃত, বৈধ ফেয়ারনেস মেট্রিক্স (L10-এ আমরা দুটোই সংজ্ঞায়িত করেছি)। প্রকৃত বিতর্কটি তাই "কে মিথ্যা বলছে" নয় — বরং কোন মেট্রিক্স ফেয়ারনেসের সঠিক পরিমাপ, তা নিয়ে একটি প্রকৃত পদ্ধতিগত মতবিরোধ।

৪ · কীভাবে দুটো দাবিই একসাথে সত্য হতে পারে

ভাসাভাসাভাবে মনে হতে পারে ProPublica ও Northpointe পরস্পরবিরোধী দাবি করছে — কিন্তু গাণিতিকভাবে দুটোই একসাথে সত্য হওয়া সম্পূর্ণ সম্ভব, যদি দুই গ্রুপের প্রকৃত বেস রেট (প্রকৃতপক্ষে পুনরায় অপরাধ করার হার) ভিন্ন হয়। L13-এ আমরা এর পেছনের সাধারণ গাণিতিক ফলাফলটি (impossibility theorem) বিস্তারিত দেখব; এখানে আমরা শুধু L10-এর ক্যালকুলেটর ব্যবহার করে একটি কংক্রিট, সত্যিকারের গণনা করা উদাহরণ দিয়ে দেখাচ্ছি এটি কীভাবে ঘটতে পারে।

নিচের কোডে ব্যবহৃত গ্রুপ A ও গ্রুপ B সম্পূর্ণ সিন্থেটিক — এগুলো বাস্তব COMPAS ডেটাসেট বা কোনো নির্দিষ্ট জাতিগত গ্রুপের প্রকৃত পরিসংখ্যান নয়। উদ্দেশ্য শুধু এই নির্দিষ্ট পরিসংখ্যানগত ঘটনাটির (সমান ক্যালিব্রেশন + ভিন্ন FPR/FNR, ভিন্ন বেস-রেটের কারণে) একটি হাতে-কলমে যাচাইযোগ্য উদাহরণ দেখানো।
Python
def make_group_records(group, tp, fp, fn, tn):
    records = []
    for _ in range(tp): records.append({"group": group, "predicted_high_risk": 1, "actual_reoffended": 1})
    for _ in range(fp): records.append({"group": group, "predicted_high_risk": 1, "actual_reoffended": 0})
    for _ in range(fn): records.append({"group": group, "predicted_high_risk": 0, "actual_reoffended": 1})
    for _ in range(tn): records.append({"group": group, "predicted_high_risk": 0, "actual_reoffended": 0})
    return records

# সিন্থেটিক ডেটা -- বাস্তব COMPAS ডেটাসেট নয়, শুধু একই পরিসংখ্যানগত ঘটনা
# (ভিন্ন বেস-রেট থাকা সত্ত্বেও সমান ক্যালিব্রেশন + ভিন্ন FPR/FNR) সিমুলেট করার জন্য তৈরি সংখ্যা
group_a = make_group_records("গ্রুপ A", tp=240, fp=160, fn=260, tn=340)  # গ্রুপ A: প্রকৃত রিঅফেন্স রেট বেশি
group_b = make_group_records("গ্রুপ B", tp=120, fp=80, fn=180, tn=620)   # গ্রুপ B: প্রকৃত রিঅফেন্স রেট কম

def confusion_matrix(records):
    cm = {"TP": 0, "FP": 0, "FN": 0, "TN": 0}
    for r in records:
        if r["predicted_high_risk"] == 1 and r["actual_reoffended"] == 1: cm["TP"] += 1
        elif r["predicted_high_risk"] == 1 and r["actual_reoffended"] == 0: cm["FP"] += 1
        elif r["predicted_high_risk"] == 0 and r["actual_reoffended"] == 1: cm["FN"] += 1
        else: cm["TN"] += 1
    return cm

def fairness_metrics(cm):
    TP, FP, FN, TN = cm["TP"], cm["FP"], cm["FN"], cm["TN"]
    total = TP + FP + FN + TN
    actual_positive = TP + FN
    actual_negative = FP + TN
    predicted_positive = TP + FP
    base_rate = actual_positive / total
    return {
        "base_rate": base_rate,
        "tpr": TP / actual_positive,
        "fpr": FP / actual_negative,
        "fnr": FN / actual_positive,
        "calibration_ppv": TP / predicted_positive,
    }

cm_a = confusion_matrix(group_a)
cm_b = confusion_matrix(group_b)
m_a = fairness_metrics(cm_a)
m_b = fairness_metrics(cm_b)

print(f"গ্রুপ A -- প্রকৃত বেস রিঅফেন্স রেট: {m_a['base_rate']*100:.1f}%")
print(f"গ্রুপ B -- প্রকৃত বেস রিঅফেন্স রেট: {m_b['base_rate']*100:.1f}%")
print()
print(f"ক্যালিব্রেশন (high-risk-দের মধ্যে প্রকৃত রিঅফেন্স রেট) -- A: {m_a['calibration_ppv']*100:.1f}%,  B: {m_b['calibration_ppv']*100:.1f}%")
print(f"False Positive Rate (রিঅফেন্ড করেনি এমন কাউকে high-risk বলা)      -- A: {m_a['fpr']*100:.1f}%,  B: {m_b['fpr']*100:.1f}%")
print(f"False Negative Rate (রিঅফেন্ড করেছে এমন কাউকে low-risk বলা)       -- A: {m_a['fnr']*100:.1f}%,  B: {m_b['fnr']*100:.1f}%")
print()
print("লক্ষ্য করুন: দুই গ্রুপেই ক্যালিব্রেশন প্রায় সমান, তবুও FPR ও FNR স্পষ্টভাবে ভিন্ন --")
print("এটাই ২০১৬ সালের ProPublica-Northpointe বিতর্কের মূল পরিসংখ্যানগত কাঠামো (সম্পূর্ণ সিন্থেটিক সংখ্যা দিয়ে)।")

    
কোডটি রান করলে দেখা যায়: গ্রুপ A-এর প্রকৃত বেস রিঅফেন্স রেট ৫০.০%, গ্রুপ B-এর ৩০.০% — সম্পূর্ণ ভিন্ন। তবুও উভয় গ্রুপে ক্যালিব্রেশন হুবহু ৬০.০% — অর্থাৎ "high-risk" ট্যাগের অর্থ দুই গ্রুপেই সমানভাবে নির্ভরযোগ্য। অথচ FPR (A: ৩২.০%, B: ১১.৪%) ও FNR (A: ৫২.০%, B: ৬০.০%) দুটোই স্পষ্টভাবে ভিন্ন। এটিই হাতে-কলমে দেখায় কীভাবে ProPublica ("FPR/FNR ভিন্ন") ও Northpointe ("ক্যালিব্রেশন সমান") — দুজনেই তাদের নিজস্ব সংজ্ঞা অনুযায়ী "সঠিক" হতে পারে, একই সময়ে।
মূল কথা · Key takeaway

COMPAS বিতর্ক শুধু "কে মিথ্যা বলছে" এই প্রশ্ন নয় — এটি দেখায় ফেয়ারনেসের একাধিক বৈধ সংজ্ঞা একে অপরের সাথে গাণিতিকভাবে সাংঘর্ষিক হতে পারে যখন গ্রুপগুলোর প্রকৃত বেস রেট ভিন্ন। L13-এ আমরা দেখব এটি কোনো ব্যতিক্রম নয় — বরং একটি সাধারণ, প্রমাণিত গাণিতিক ফলাফল, এবং কেন "নিখুঁতভাবে ফেয়ার" মডেল ডিজাইন করা তাত্ত্বিকভাবেই সীমাবদ্ধ।

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

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

প্র ০১ ২০১৬ সালের ProPublica তদন্তের সাধারণ ফাইন্ডিং কী ছিল, এবং কেন এই পাঠে নির্দিষ্ট বিতর্কিত সংখ্যা উল্লেখ করা হয়নি?

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

প্র ০২ Northpointe/Equivant-এর "আমরা ভালোভাবে ক্যালিব্রেটেড" দাবিটি কেন নিছক অজুহাত নয়, বরং একটি বৈধ প্রযুক্তিগত যুক্তি?

কারণ ক্যালিব্রেশন একটি প্রকৃত, স্বীকৃত ফেয়ারনেস মেট্রিক্স (L10) — এবং কোডের ডেমোতে দেখা গেছে গাণিতিকভাবে একটি টুল সত্যিই ক্যালিব্রেটেড হতে পারে (৬০.০% = ৬০.০%) এমনকি যখন সেই একই টুলের FPR/FNR গ্রুপভেদে ভিন্ন। তাই "আমরা ক্যালিব্রেটেড" বলাটা মিথ্যা নয় — সমস্যাটি হলো ক্যালিব্রেশন একাই ফেয়ারনেসের সম্পূর্ণ চিত্র দেয় না।

প্র ০৩ যদি গ্রুপ A ও B-এর প্রকৃত বেস রিঅফেন্স রেট হুবহু সমান হতো, তাহলে কি সমান ক্যালিব্রেশনের সাথে FPR/FNR-এর এই ধরনের গ্যাপ থাকা সম্ভব হতো?

না — যদি বেস রেট সমান থাকে, তাহলে সমান ক্যালিব্রেশন বজায় রাখতে গেলে গাণিতিকভাবে TPR ও FPR-ও সমান হতে বাধ্য (L13-এ এই সম্পর্কটি একটি ফর্মুলা দিয়ে দেখানো হবে)। এই ডেমোর গ্যাপ সৃষ্টি হয়েছে ঠিক এই কারণে যে গ্রুপ A ও B-এর বেস রেট ভিন্ন (৫০% বনাম ৩০%) — বেস-রেট পার্থক্যই এই পুরো ঘটনার মূল চাবিকাঠি।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে যদি group_a-এর সংখ্যাগুলো tp=120, fp=80, fn=180, tn=620-এ পরিবর্তন করা হয় (অর্থাৎ গ্রুপ B-এর সংখ্যার হুবহু সমান, একই ৩০% বেস রেট), তাহলে FPR/FNR গ্যাপের কী হবে বলে আপনার ধারণা?

    দুই গ্রুপের কনফিউশন ম্যাট্রিক্স তখন হুবহু একই হয়ে যাবে, তাই FPR, FNR, TPR, ক্যালিব্রেশন — সবগুলো মেট্রিক্সের গ্যাপই শূন্যে নেমে আসবে। এটি নিশ্চিত করে গ্যাপের একমাত্র উৎস ছিল বেস-রেট পার্থক্য, অন্য কিছু নয়।

  2. পরীক্ষা করুন: উপরের কোড সেলে group_a = make_group_records("গ্রুপ A", tp=240, fp=160, fn=260, tn=340)-এর সংখ্যাগুলো tp=120, fp=80, fn=180, tn=620-এ পরিবর্তন করে Run চেপে আপনার অনুমান যাচাই করুন।

    পরিবর্তনের পর গ্রুপ A-এর বেস রেট, ক্যালিব্রেশন, FPR ও FNR — সবকিছুই গ্রুপ B-এর সাথে হুবহু মিলে যাবে (কারণ কনফিউশন ম্যাট্রিক্স নিজেই এখন অভিন্ন), সব গ্যাপ শূন্যে নেমে আসবে — যা নিশ্চিত করে বেস-রেট পার্থক্যই এই পুরো ঘটনার একমাত্র চালিকাশক্তি ছিল।

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

  • পরবর্তী পাঠ L12 বায়াস মিটিগেশন টেকনিক — প্রি-প্রসেসিং, ইন-প্রসেসিং ও পোস্ট-প্রসেসিং পদ্ধতি, সাথে একটি সত্যিকারের পোস্ট-প্রসেসিং থ্রেশহোল্ড-অ্যাডজাস্টমেন্ট ডেমো।
  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ নৈতিক ফ্রেমওয়ার্ক, বায়াস-ফেয়ারনেস, প্রাইভেসি, ট্রান্সপারেন্সি, AI অ্যালাইনমেন্ট, জেনারেটিভ AI/LLM এথিক্স, সামাজিক প্রভাব, গভর্নেন্স ও রেগুলেশন, সেক্টর-স্পেসিফিক এথিক্স ও এক্সিস্টেনশিয়াল রিস্ক বিতর্ক।
  • Ethics in Computing & AI Safety কোর্স সহোদর কোর্স সাধারণ কম্পিউটিং এথিক্স, প্রফেশনাল এথিক্স ও সেফটি-ক্রিটিক্যাল কেস স্টাডির একটি বিস্তৃত সার্ভে।
আগের পাঠ
ফেয়ারনেস মেট্রিক্স — ডেমোগ্রাফিক প্যারিটি ও ইকুয়ালাইজড অডস