অধ্যায় 2 · ন্যায্যতা ও ডেটা
ন্যায্যতার লক্ষ্য তুলনা ও তার সীমা: ছোট স্যাম্পল ও পরস্পরবিরোধী মেট্রিক
- পৃষ্ঠা 6 / 22
- 20 মিনিট পড়া
আগের পাতা টয় ডেটায় ন্যায্যতার মেট্রিক: Python-এ সিলেকশন রেট ও এরর রেট-এ একই টেবিল নিয়ে তিনটা পার্থক্য তিন রকম কথা বলেছিল। এই পাতা দেখায় তারপর একটা টিম কী করে। সে শেখে ইকুয়ালাইজড ওডসের ফল কীভাবে পড়তে হয়, কেন একাধিক ন্যায্যতার লক্ষ্য একসঙ্গে পূরণ করা যায় না, গ্রুপ ছোট হলে নিজের নিশ্চয়তা কীভাবে জানাতে হয়, কখন তুলনা করতে অস্বীকার করতে হয়, আর সীমাবদ্ধতাসহ ফলাফল কীভাবে লিখতে হয়।
আপনার দরকার Python 3.12, শুধু স্ট্যান্ডার্ড লাইব্রেরি। ব্লকগুলো ক্রমে একটা সেশনে লিখুন; এগুলো ভেরিয়েবল ভাগ করে নেয়, আর প্রতিটা ব্লকের নিচের লেখাটা তার আসল আউটপুট।
সততার নিয়ম। প্রতিটা টেবিল কৃত্রিম এবং
Toy data:লেবেল দেওয়া; প্রতিটা গ্রুপ, মানুষ ও সংখ্যা কাল্পনিক। ফলাফল শুধু দেখায় একটা হিসাব কীভাবে কাজ করে। এগুলো কোনো বাস্তব সিস্টেম বা বাস্তব মানুষের দলের প্রমাণ নয়।
যা শিখবেন
- ইকুয়ালাইজড ওডসের ফারাক কীভাবে পড়বেন (দিক, আকার, আর কোন ভুলের বোঝা কার ঘাড়ে), এবং সহনসীমা বেছে নিলে কী ছাড়তে হয়।
- ক্যালিব্রেশন বা প্রিসিশন প্যারিটির সঙ্গে এরর-রেট প্যারিটির পার্থক্য, আর বেস রেট আলাদা হলে কেন তারা সংঘাতে পড়ে, একটা হিসাব-করা উদাহরণসহ।
- একই ডেটায় দুটো থ্রেশহোল্ড কীভাবে তুলনা করবেন, আর কী ভালো হলো ও কী খারাপ হলো তা কীভাবে জানাবেন।
- ছোট গ্রুপের একটা রেটের জন্য ব্যবধান (interval) কীভাবে দেবেন, আর কখন তুলনা করতে অস্বীকার করবেন।
- ন্যায্যতার একটা ফলাফল-নোট কীভাবে লিখবেন, যেখানে যা মাপা হয়েছে, যা দেখানো যায় না আর যা সুপারিশ করা হচ্ছে তা আলাদা থাকে।
হেল্পার ফাইল, নতুন করে
স্ট্যান্ডার্ড লাইব্রেরি দিয়ে গ্রুপ মেট্রিক হিসাব করুন। পাঁচ নম্বর পাতায় সারি ধরে ধরে ডেটা বানানো হয়েছিল। এখানে ডেটা হলো প্রতিটা গ্রুপের কনফিউশন কাউন্ট, তাই হেল্পার ছোট, আর সে পাঁচ নম্বর পাতার fair.py-র জায়গা নেয় (নতুন ফোল্ডার ব্যবহার করুন)। সে নেয় tp (উপযুক্ত ও শর্টলিস্টেড), fn (উপযুক্ত, বাদ পড়েছেন), fp (অনুপযুক্ত, শর্টলিস্টেড) আর tn। সে যোগ করে বেস রেট (গ্রুপের যে অংশ সত্যিই উপযুক্ত), আর পরে ব্যবহার হবে এমন একটা wilson ফাংশন। যে রেটের ভাগ করার মতো কিছু নেই, সেটা None থাকে এবং n/a হিসেবে দেখায়।
# file: fair.py
from math import sqrt
def ratio(top, bottom):
return top / bottom if bottom else None # None = undefined, never 0
def rates(c):
pos, neg, chosen, n = c["tp"] + c["fn"], c["fp"] + c["tn"], c["tp"] + c["fp"], sum(c.values())
return {"n": n, "base": ratio(pos, n), "selection": ratio(chosen, n), "tpr": ratio(c["tp"], pos),
"fpr": ratio(c["fp"], neg), "precision": ratio(c["tp"], chosen)}
def fmt(x, signed=False):
return "n/a" if x is None else f"{x:+.2f}" if signed else f"{x:.2f}"
def show(table, keys):
print(f"{'group':<8}" + "".join(f"{k:>11}" for k in keys))
for g, c in table.items():
r = rates(c)
print(f"{g:<8}" + "".join(f"{r[k] if k == 'n' else fmt(r[k]):>11}" for k in keys))
def gap(table, key, ref="A"):
"""Each group minus the reference group; None if either side is undefined."""
out = {}
for g, c in table.items():
a, b = rates(c)[key], rates(table[ref])[key]
if g != ref:
out[g] = None if None in (a, b) else a - b
return out
def wilson(k, n, z=1.96):
"""Wilson score interval for k successes in n trials (approximate, deterministic)."""
if n == 0:
return None
p = k / n
mid = (p + z * z / (2 * n)) / (1 + z * z / n)
half = z * sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / (1 + z * z / n)
return mid - half, mid + halfইকুয়ালাইজড ওডস: ফল পড়া
ইকুয়ালাইজড ওডসের পার্থক্য পরীক্ষা করুন। ইকুয়ালাইজড ওডস একসঙ্গে দুটো জিনিস চায়: প্রতিটা গ্রুপে একই ট্রু-পজিটিভ রেট (tpr) আর একই ফলস-পজিটিভ রেট (fpr)। তাই আপনি একটা নয়, দুটো ফারাক জানান, আর দুটোই পড়েন। আগে পাঁচ নম্বর পাতার কাউন্ট, যা ৪০ জন কাল্পনিক আবেদনকারীর।
টয় ডেটা: পাঁচ নম্বর পাতার কাউন্ট।
from fair import *
# Toy data: the 40 invented applicants of page 5, as confusion counts
PAGE5 = {"A": {"tp": 9, "fn": 3, "fp": 3, "tn": 9}, "B": {"tp": 3, "fn": 3, "fp": 1, "tn": 9}}
show(PAGE5, ["n", "base", "selection", "tpr", "fpr", "precision"])
tg, fg = gap(PAGE5, "tpr")["B"], gap(PAGE5, "fpr")["B"]
print("tpr gap (B - A):", fmt(tg, True), "| fpr gap (B - A):", fmt(fg, True))
print("largest gap:", fmt(max(abs(tg), abs(fg))), "| gaps point the same way:", (tg < 0) == (fg < 0))group n base selection tpr fpr precision
A 24 0.50 0.50 0.75 0.25 0.75
B 16 0.38 0.25 0.50 0.10 0.75
tpr gap (B - A): -0.25 | fpr gap (B - A): -0.15
largest gap: 0.25 | gaps point the same way: Trueএই দুটো সংখ্যা কীভাবে পড়বেন:
| ধরন | কী ইঙ্গিত দেয় | কোন প্রশ্ন করবেন |
|---|---|---|
| দুটো ফারাকই ঋণাত্মক (এখানকার মতো) | B গ্রুপ দুই স্তরেই কঠিন মানদণ্ডের মুখোমুখি: উপযুক্ত ও অনুপযুক্ত দুই ধরনের মানুষই কম নির্বাচিত হচ্ছেন | স্কোর বা তার কাট-অফ B-র ক্ষেত্রে আলাদাভাবে আচরণ করছে কি না? |
| tpr ফারাক ঋণাত্মক, fpr ফারাক ধনাত্মক | B-র উপযুক্ত মানুষ বেশি বাদ পড়ছেন আর অনুপযুক্ত মানুষ বেশি নির্বাচিত হচ্ছেন: টুল B-কে কম ভালোভাবে আলাদা করছে | B-র ইনপুট ডেটা দুর্বল কি না? |
| একটা ফারাক শূন্যের কাছে, আরেকটা বড় | ইকুয়ালাইজড ওডসের অর্ধেক মেলানো যথেষ্ট নয় | সিদ্ধান্তটা কোন ভুলের বেশি শাস্তি দেয়? |
| দুটো ফারাকই সহনসীমার মধ্যে | এই টেবিলে, এই লেবেলের জন্য ইকুয়ালাইজড ওডস টিকেছে | স্যাম্পল যথেষ্ট বড় কি না? লেবেল ভরসাযোগ্য কি না? (নিচে দেখুন) |
ট্রেড-অফ থাকে সহনসীমায়। খুব কড়া সীমা (ধরুন ০.০২) ছোট গ্রুপে প্রায় সবকিছুকে ফেল করায়, কারণ একজন মানুষ একটা রেট ০.১ বা তারও বেশি নাড়িয়ে দেন। খুব ঢিলা সীমা (ধরুন ০.২০) সত্যিকারের পার্থক্যকেও পাস করায়। কোনো মানই স্ট্যান্ডার্ড নয়; কোন সংখ্যা বেছেছেন আর কেন, তা লিখে রাখুন। বিগিনার টিউটোরিয়ালের ন্যায্যতা ও তার ট্রেড-অফ: অন্তর্ভুক্তি, অ্যাক্সেসিবিলিটি ও ভাষা পাতাও একই সতর্কতা কথায় দিয়েছিল।
ক্যালিব্রেশন বনাম এরর-রেট প্যারিটি
ক্যালিব্রেশন আর এরর-রেট প্যারিটির পার্থক্য করুন। ওপরের দুই গ্রুপের প্রিসিশন একই, ০.৭৫, কিন্তু tpr আলাদা। এগুলো আলাদা ধরনের প্রশ্ন (প্রচলিত সংজ্ঞার আমাদের ভাষ্য; Chouldechova, 2016, একটা ঝুঁকি-মাপক যন্ত্রে এগুলো প্রয়োগ করেছিলেন):
| ধারণা | প্রশ্ন | কার দৃষ্টিকোণ থেকে দেখা |
|---|---|---|
| ক্যালিব্রেশন | একটা নির্দিষ্ট স্কোরের মানে প্রতিটা গ্রুপে উপযুক্ত হওয়ার বাস্তব সম্ভাবনা একই কি না? | যিনি স্কোর পড়েন |
| প্রেডিক্টিভ প্যারিটি | নির্বাচিতদের মধ্যে উপযুক্তদের অনুপাত একই কি না (সমান প্রিসিশন)? | যিনি শর্টলিস্ট পড়েন |
| এরর-রেট প্যারিটি (সমান tpr ও fpr) | উপযুক্তদের মধ্যে নির্বাচিত হওয়ার সম্ভাবনা একই কি না? অনুপযুক্তদের মধ্যেও একই কি না? | যাঁকে স্কোর করা হচ্ছে |
একজন রিক্রুটার আর একজন আবেদনকারী দুজনেই নিজের প্রশ্নটাকে "ন্যায্যতা" বলতে পারেন, আর দুজনেই ঠিক হতে পারেন। এবার একটা হিসাব-করা টেবিল, যেখানে স্কোরটা গঠনগতভাবেই ক্যালিব্রেটেড।
টয় ডেটা: তিনটা স্কোর ব্যান্ডে ১৬০ জন কাল্পনিক আবেদনকারী, প্রতি ব্যান্ডে (মানুষ, উপযুক্ত মানুষ) হিসেবে।
BANDS = {"A": {"low": (20, 4), "mid": (30, 15), "high": (50, 40)},
"B": {"low": (30, 6), "mid": (20, 10), "high": (10, 8)}}
def at(bands, selected):
"""Confusion counts when exactly the bands in `selected` are shortlisted."""
c = {"tp": 0, "fn": 0, "fp": 0, "tn": 0}
for band, (n, s) in bands.items():
c["tp" if band in selected else "fn"] += s
c["fp" if band in selected else "tn"] += n - s
return c
print("share suitable in each score band")
for band in ("low", "mid", "high"):
print(f"{band:<5}" + "".join(f" {g}: {BANDS[g][band][1]}/{BANDS[g][band][0]} = "
f"{BANDS[g][band][1] / BANDS[g][band][0]:.2f}" for g in BANDS))
T1 = {g: at(b, {"high"}) for g, b in BANDS.items()} # threshold 1: shortlist the high band only
print("\nthreshold T1: shortlist the high band")
show(T1, ["n", "base", "selection", "tpr", "fpr", "precision"])share suitable in each score band
low A: 4/20 = 0.20 B: 6/30 = 0.20
mid A: 15/30 = 0.50 B: 10/20 = 0.50
high A: 40/50 = 0.80 B: 8/10 = 0.80
threshold T1: shortlist the high band
group n base selection tpr fpr precision
A 100 0.59 0.50 0.68 0.24 0.80
B 60 0.40 0.17 0.33 0.06 0.80প্রতিটা ব্যান্ডে দুই গ্রুপেরই সমান অংশ উপযুক্ত (০.২০, ০.৫০, ০.৮০): স্কোরটা গ্রুপের ভেতরে ক্যালিব্রেটেড। তবু বেস রেট আলাদা, A-র ০.৫৯ আর B-র ০.৪০, কারণ B-র বেশি মানুষ নিচের ব্যান্ডে। একটা ঘর হাতে মিলিয়ে দেখুন। A-তে হাই ব্যান্ডে ৫০ জন, ৪০ জন উপযুক্ত: tp ৪০, fp ১০। বাকি ৫০ জনের মধ্যে ৪ + ১৫ = ১৯ জন উপযুক্ত, যাঁরা বাদ পড়েছেন (fn ১৯), আর ৩১ জন অনুপযুক্ত (tn ৩১)। দুই গ্রুপেরই প্রিসিশন ০.৮০, অথচ B-র উপযুক্তরা শর্টলিস্টেড হন ০.৩৩ হারে, A-র ০.৬৮-এর বিপরীতে; আর B-র অনুপযুক্তরা ০.০৬ হারে, A-র ০.২৪-এর বিপরীতে।
মেট্রিক কেন সংঘাতে পড়ে, আর বেস রেটের ভূমিকা
ব্যাখ্যা করুন কেন ন্যায্যতার মেট্রিক পরস্পরবিরোধী হতে পারে। প্রিসিশন, tpr, fpr আর বেস রেট p একটা সূত্রে বাঁধা: প্রিসিশন = tpr×p / (tpr×p + fpr×(1−p))। দুই গ্রুপের প্রিসিশন ও tpr সমান কিন্তু p আলাদা হলে তাদের fpr সমান হতেই পারে না। কোডটা বের করে B-র জন্য কত fpr লাগত।
a, b = rates(T1["A"]), rates(T1["B"])
need = a["tpr"] * b["base"] * (1 - a["precision"]) / (a["precision"] * (1 - b["base"]))
print("precision A, B:", fmt(a["precision"]), fmt(b["precision"]), "| tpr A:", fmt(a["tpr"]))
print("B would need fpr", fmt(need), "to match A's precision and tpr; A's own fpr is", fmt(a["fpr"]))precision A, B: 0.80 0.80 | tpr A: 0.68
B would need fpr 0.11 to match A's precision and tpr; A's own fpr is 0.24বেস রেট তুলনাকে কীভাবে প্রভাবিত করে তা পরীক্ষা করুন। সমান tpr আর সমান প্রিসিশন B-র পক্ষে সম্ভব শুধু ০.১১ fpr-এ, যা A-র ০.২৪-এর অর্ধেকেরও কম। তাই বেস রেট আলাদা হলে অন্তত একটা লক্ষ্য ছাড়তে হয়। Kleinberg, Mullainathan ও Raghavan (arXiv 1609.05807) প্রমাণ করেছেন, সম্ভাব্যতাভিত্তিক শ্রেণিবিন্যাসের জন্য ন্যায্যতার তিনটা শর্ত সাধারণভাবে একসঙ্গে টিকতে পারে না, কেবল খুব সীমিত বিশেষ ক্ষেত্র ছাড়া। Chouldechova (arXiv 1610.07524) দেখান, প্রচলন (prevalence) আলাদা হলে প্রেডিক্টিভ প্যারিটি আর সমান এরর রেটের মধ্যে একই টানাপোড়েন তৈরি হয়। আমাদের টয় টেবিল সেই টানাপোড়েনের একটা উদাহরণ, প্রমাণ নয়। বেস রেট সমান হলে বা ক্লাসিফায়ার নিখুঁত হলে সংঘাত থাকে না (মাঝারি অনুশীলন)। বেস রেটের ভূমিকা দেখতে A-র ব্যান্ড-মিশ্রণ নিয়ে C গ্রুপ যোগ করুন।
BANDS["C"] = {"low": (40, 8), "mid": (60, 30), "high": (100, 80)} # same mix as A, twice the size
T1 = {g: at(b, {"high"}) for g, b in BANDS.items()}
show(T1, ["n", "base", "selection", "tpr", "fpr", "precision"])
print("C - A gaps:", {k: fmt(gap(T1, k, "A")["C"], True) for k in ("selection", "tpr", "fpr", "precision")})group n base selection tpr fpr precision
A 100 0.59 0.50 0.68 0.24 0.80
B 60 0.40 0.17 0.33 0.06 0.80
C 200 0.59 0.50 0.68 0.24 0.80
C - A gaps: {'selection': '+0.00', 'tpr': '+0.00', 'fpr': '+0.00', 'precision': '+0.00'}বেস রেট সমান আর স্কোর ক্যালিব্রেটেড হলে কোনো ফারাকই থাকে না। মেট্রিকদের মধ্যে বিরোধ আসে বেস রেট থেকে, অঙ্ক থেকে নয়। বেস রেটের পার্থক্য নিজেই ইতিহাস থেকে, লেবেল বানানোর পদ্ধতি থেকে বা কারা আবেদন করেছেন তা থেকে আসতে পারে; মেট্রিক বলতে পারে না কোনটা।
নথিভুক্ত ঘটনা:
Year: 2016.
Reported: ProPublica analysed COMPAS risk scores (a tool made by Northpointe) for defendants in
Broward County, Florida. It reported that defendants who did not reoffend were
labelled higher risk more often if they were Black than if they were white.
Disputed: Northpointe disputed ProPublica's methodology and defended the tool's accuracy.
Lesson: the dispute is a standard example of two reasonable fairness definitions, error rates
and calibration, that cannot both hold when base rates differ. This course does not
say who was right; it shows why the two arguments can both be coherent.একই ডেটায় দুটো থ্রেশহোল্ড
একই টয় ডেটাসেটে দুটো থ্রেশহোল্ডের বিকল্প তুলনা করুন। থ্রেশহোল্ড ঠিক করে কোন স্কোর শর্টলিস্টেড হবে। T1 শুধু হাই ব্যান্ডকে শর্টলিস্ট করে। T2 মিড ও হাই ব্যান্ডকে করে। ডেটা একই; বদলেছে শুধু পছন্দ।
T1 = {g: at(BANDS[g], {"high"}) for g in "AB"}
T2 = {g: at(BANDS[g], {"mid", "high"}) for g in "AB"}
print(f"{'gap B - A':<16}{'T1 high':>9}{'T2 mid+high':>13}")
for k in ("selection", "tpr", "fpr", "precision"):
print(f"{k:<16}{fmt(gap(T1, k)['B'], True):>9}{fmt(gap(T2, k)['B'], True):>13}")
for name, t in (("T1", T1), ("T2", T2)):
read = sum(c["tp"] + c["fp"] for c in t.values())
missed = {g: c["fn"] for g, c in t.items()}
print(name, "CVs a recruiter reads:", read, "| suitable people missed:", missed)gap B - A T1 high T2 mid+high
selection -0.33 -0.30
tpr -0.34 -0.18
fpr -0.19 -0.28
precision +0.00 -0.09
T1 CVs a recruiter reads: 60 | suitable people missed: {'A': 19, 'B': 16}
T2 CVs a recruiter reads: 110 | suitable people missed: {'A': 4, 'B': 6}কোনো থ্রেশহোল্ড প্রতিটা লাইনে জেতে না। T2 tpr ফারাক কমায় (-০.৩৪ থেকে -০.১৮) এবং অনেক কম উপযুক্ত মানুষকে বাদ দেয় (৩৫ জনের জায়গায় ১০ জন), কিন্তু fpr ফারাক বাড়ায় (-০.১৯ থেকে -০.২৮), প্রিসিশনে ফারাক খুলে দেয় (০.০০ থেকে -০.০৯) এবং রিক্রুটারদের ৬০টার জায়গায় ১১০টা সিভি পড়তে হয়। T2 বাদ পড়ার ঝুঁকিতে থাকা মানুষের জন্য ভালো, কাজের চাপের জন্য খারাপ; যুক্তিসঙ্গত টিমগুলো এটা আলাদাভাবে ওজন করে। প্রতিটা গ্রুপের জন্য আলাদা থ্রেশহোল্ড নিলেও কিছু ফারাক কমত, কিন্তু সেটা গ্রহণযোগ্য কি না তা নীতি ও আইনের প্রশ্ন, যা জায়গা ও খাতভেদে আলাদা। চেষ্টা করার আগে আপনার আইনি বা গোপনীয়তা দায়িত্বপ্রাপ্তকে জিজ্ঞেস করুন।
ছোট গ্রুপ: আমরা কতটা নিশ্চিত?
ছোট গ্রুপের অনিশ্চয়তা মাপুন। পাঁচ নম্বর পাতায় B-তে উপযুক্ত মানুষ ৬ জন। একটা সিদ্ধান্ত অন্যরকম হলে তার tpr নড়ে ১/৬, অর্থাৎ প্রায় ০.১৭। এই পাতা ব্যবহার করে উইলসন স্কোর ইন্টারভাল: k/n রেটের জন্য একটা বন্ধ-সূত্রের, নির্ধারিত (deterministic) পরিসর, কোনো র্যান্ডম সংখ্যা ছাড়া (সিড-দেওয়া বুটস্ট্র্যাপ সাধারণ বিকল্প)। এর সীমা: এটা একটা আনুমানিক পদ্ধতি; ধরে নেয় মানুষগুলো পরস্পর স্বাধীন এবং আপনি যে জনগোষ্ঠী নিয়ে ভাবছেন তার থেকে নেওয়া; ৯৫% একটা প্রথা; আর এটা শুধু স্যাম্পলে কারা এলেন সেই ভাগ্যকে ধরে, ভুল লেবেল বা পক্ষপাতদুষ্ট স্যাম্পলকে নয়।
rows = [("page 5, A tpr", 9, 12), ("page 5, B tpr", 3, 6), ("T1, A tpr", 40, 59), ("T1, B tpr", 8, 24),
("T2, A tpr", 55, 59), ("T2, B tpr", 18, 24)]
for label, k, n in rows:
lo, hi = wilson(k, n)
print(f"{label:<14}{k:>3}/{n:<3} = {k / n:.2f} interval {lo:.2f} to {hi:.2f}")
print("rate 0.50 with more people:", end=" ")
print(", ".join(f"{n // 2}/{n}: {wilson(n // 2, n)[0]:.2f}-{wilson(n // 2, n)[1]:.2f}" for n in (6, 24, 120, 600)))page 5, A tpr 9/12 = 0.75 interval 0.47 to 0.91
page 5, B tpr 3/6 = 0.50 interval 0.19 to 0.81
T1, A tpr 40/59 = 0.68 interval 0.55 to 0.78
T1, B tpr 8/24 = 0.33 interval 0.18 to 0.53
T2, A tpr 55/59 = 0.93 interval 0.84 to 0.97
T2, B tpr 18/24 = 0.75 interval 0.55 to 0.88
rate 0.50 with more people: 3/6: 0.19-0.81, 12/24: 0.31-0.69, 60/120: 0.41-0.59, 300/600: 0.46-0.54পাঁচ নম্বর পাতার ফারাক (০.৭৫ বনাম ০.৫০) দুটো চওড়া, ওভারল্যাপ করা ব্যবধানের (০.৪৭ থেকে ০.৯১ এবং ০.১৯ থেকে ০.৮১) ভেতরে বসে। ওভারল্যাপ কোনো পরিসংখ্যানগত পরীক্ষা নয়, আর এটা প্রমাণ করে না যে গ্রুপ দুটো সমান। এটা দেখায় যে এই টেবিল সত্যিকারের ফারাক আর ভাগ্যকে আলাদা করতে পারে না। বড় T1 টেবিলে B-র ব্যবধান (০.১৮ থেকে ০.৫৩) আর A-র ব্যবধান (০.৫৫ থেকে ০.৭৮) ওভারল্যাপ করে না, আর T2-তে সামান্য ওভারল্যাপ করে (B ০.৫৫ থেকে ০.৮৮, A ০.৮৪ থেকে ০.৯৭)। এটা ফারাক আছে বলে জোরালো ইঙ্গিত, তবে এখনও কাল্পনিক ডেটায়।
যখন তুলনা অর্থহীন
কখন গ্রুপের তুলনা অর্থবহ নয় তা চিনুন। প্রত্যাখ্যানকে এমন একটা নিয়ম বানান যা কোনো ফারাক জানানোর আগে চলে। নিচের সর্বনিম্ন সংখ্যাটা এই পাতার জন্য বেছে নেওয়া, স্ট্যান্ডার্ড নয়।
MIN = 10 # a team's choice for this page, not a standard
def usable(c, minimum=MIN):
pos, neg = c["tp"] + c["fn"], c["fp"] + c["tn"]
ok = lambda m, what: "ok" if m >= minimum else f"do not compare ({m} {what})"
return {"tpr": ok(pos, "suitable people"), "fpr": ok(neg, "unsuitable people")}
PAGE5["D"] = {"tp": 0, "fn": 0, "fp": 1, "tn": 2} # the 3-person group of the page 5 Hard exercise
for g, c in PAGE5.items():
print(g, usable(c))A {'tpr': 'ok', 'fpr': 'ok'}
B {'tpr': 'do not compare (6 suitable people)', 'fpr': 'ok'}
D {'tpr': 'do not compare (0 suitable people)', 'fpr': 'do not compare (3 unsuitable people)'}| পরিস্থিতি | তুলনা কেন বিভ্রান্ত করে | কী করবেন |
|---|---|---|
| ফলাফলওয়ালা মানুষ খুব কম | একটা কেসই রেট নাড়িয়ে দেয়; ব্যবধান খুব চওড়া | কাউন্ট ও ব্যবধান জানান; ফারাকের তুলনা করতে অস্বীকার করুন |
| অনির্ধারিত রেট (উপযুক্ত মানুষ নেই) | ভাগ করার মতো কিছু নেই | n/a রাখুন; কখনো ০ লিখবেন না |
| গ্রুপগুলোর লেবেল আলাদাভাবে বানানো | গ্রুপগুলো এক স্কেলে মাপা হয়নি | আগে লেবেলিং ঠিক করুন বা নথিভুক্ত করুন |
| গ্রুপের সংজ্ঞা অসঙ্গত বা একটা আরেকটার সঙ্গে মিশে যায় | মানুষ দুবার গোনা হতে পারে বা গ্রুপ বদলাতে পারে | সংজ্ঞা লিখুন; ওভারল্যাপ যাচাই করুন |
| গ্রুপগুলো আলাদা সিদ্ধান্ত বা কাজের মুখোমুখি | কেসের মিশ্রণ আলাদা, তাই ফারাক সেই মিশ্রণ থেকে আসতে পারে | এক ধরনের সিদ্ধান্তের মধ্যে তুলনা করুন |
টয় ডেটা যা প্রমাণ করতে পারে না
মনে রাখুন, টয় ডেটা বাস্তব ন্যায্যতা প্রমাণ করতে পারে না। ওপরের সবকিছু বানানো, তাই আপনি শুধু শিখেছেন কীভাবে হিসাব করতে ও পড়তে হয়। বাস্তব ডেটা হলেও একটা টেবিল একটা ডেটাসেট, একটা লেবেল আর একটা থ্রেশহোল্ডের বর্ণনা মাত্র। বাস্তব টুল সম্পর্কে কিছু বলতে হলে আপনার আরও লাগত একটা প্রতিনিধিত্বমূলক স্যাম্পল, ভরসাযোগ্য লেবেল, ক্ষতিগ্রস্ত মানুষদের মত, কারণ যাচাইয়ের পদক্ষেপ, এবং ফল নিয়ে কাজ করতে পারেন এমন একজন দায়িত্বপ্রাপ্ত ব্যক্তি।
ফলাফল-নোট লেখা
অনুশীলনী: সীমাবদ্ধতাসহ একটা ন্যায্যতা ফলাফল-নোট লিখুন। বিশ্লেষণের ডেস্ক থেকে যা বাইরে যায় সেটা এই নোট। এটা তিনটা জিনিস আলাদা রাখে: কী মাপা হয়েছে, সেই মাপ কী দেখাতে পারে না, আর আপনি কী সুপারিশ করেন।
টেমপ্লেট:
Fairness findings note: <feature, decision, date>
1 Question and data decision, groups, label, data source (toy or real), people per group
2 Measured each metric, threshold, counts and interval; numbers only, no verdict words
3 Cannot show causes, label quality, other groups, real-world fairness, legal compliance
4 Uncertainty small groups, wide intervals, rates left as n/a
5 Trade-offs seen what improves and what worsens between the options compared
6 Recommendation decision, conditions, what to collect or check next
7 Owner, review date a named role; the date or event that triggers a re-runউদাহরণ নোট (কাল্পনিক পরিস্থিতি, টয় ডেটা): এক নম্বর পাতার ShortlistHelper, ১৬০ জন কাল্পনিক আবেদনকারীর ওপর দুটো থ্রেশহোল্ড।
1 Question and data
Does ShortlistHelper's shortlist fall equally on groups A (100 people) and B (60)? Label:
"suitable in a later full review". Toy data: invented counts, one score in three bands.
2 Measured (gaps are B minus A)
T1 shortlist high band: selection -0.33, tpr -0.34, fpr -0.19, precision +0.00.
T2 shortlist mid+high: selection -0.30, tpr -0.18, fpr -0.28, precision -0.09.
tpr for B: T1 8/24 (0.18 to 0.53), T2 18/24 (0.55 to 0.88). Suitable people missed: T1 35, T2 10.
3 Cannot show
Whether any real tool behaves like this; why B is selected less (the score mix differs, so
base rates differ: 0.59 and 0.40); whether the label is fair; results for other groups;
whether either threshold meets a rule.
4 Uncertainty
B has 24 suitable people: the tpr intervals are wide, and no minimum sample size is a standard.
5 Trade-offs seen
T2 misses fewer suitable people but adds 50 CVs to read, widens the fpr gap and opens a
precision gap. No threshold satisfies all four metrics; the score is calibrated within groups,
so with different base rates this is expected.
6 Recommendation
Do not approve either threshold from this table. If a real pilot goes ahead: use the score
only to order CVs, start with T2 because missing suitable people is the harm of concern,
re-measure on real data per group with intervals, and review the label with recruiters.
7 Owner, review date
Head of recruitment (role). Re-run after the pilot or after any change to the score.লক্ষ করুন, ২ নম্বর অংশে শুধু সংখ্যা, ৩ নম্বর বলে সংখ্যাগুলো কী করতে পারে না, আর সুপারিশটা শর্তসাপেক্ষ এবং তার একজন মালিক আছে। নোটটা "ন্যায্য" বা "পক্ষপাতদুষ্ট" বলে না। যেখানে যুক্তিসঙ্গত মানুষ একমত নন (T1 বনাম T2), সেখানে নোট ট্রেড-অফটা লিখে রাখে এবং ঝোঁকের কারণ দেয়, যাতে সিদ্ধান্তদাতা জেনেবুঝে তা নাকচ করতে পারেন। T2-এর দিকে ঝোঁকটা একটা কাল্পনিক ফিচারের ওপর হাতে-কলমে উদাহরণের সুপারিশ। এটা শর্তসাপেক্ষ, সাধারণ নিয়ম নয়: যে টিম রিক্রুটারের কাজের চাপকে বেশি গুরুত্ব দেয়, বা লেবেল নিয়ে সন্দিহান, সে যুক্তিসঙ্গতভাবেই T1 বা কোনোটাই না বেছে নিতে পারে।
কাজের জায়গায় এটা কোথায় দেখা যায়
অ্যানালিস্টরা পাইলটের আগে, প্রতিটা মডেল বা থ্রেশহোল্ড বদলের পরে, আর কেউ অভিযোগ করলে এমন একটা টেবিল চালান। রিভিউয়াররা কোড নয়, নোট চান। বাস্তব ডেটায় একই হেল্পার চালানোর আগে গ্রুপ কলামের জন্য গোপনীয়তা রিভিউ লাগে।
সাধারণ ভুল
- একটা ফারাক জানিয়ে তাকে ইকুয়ালাইজড ওডস বলা। tpr ও fpr দুই ফারাকই লাগে।
- প্রতিটা মেট্রিক শূন্যে নামানোর চেষ্টা। বেস রেট আলাদা হলে সাধারণভাবে তা সম্ভব নয়; বেছে নিন এবং ব্যাখ্যা করুন।
- কাউন্ট ছাড়া ছোট গ্রুপের তুলনা। ৬ জনের ০.৫০ আর ৬০০ জনের ০.৫০ একই সিদ্ধান্ত নয়।
- ওভারল্যাপ করা ব্যবধানকে সমানতার প্রমাণ ভাবা। এটা শুধু দেখায় টেবিল গ্রুপ দুটোকে আলাদা করতে পারে না।
- নোটে "ন্যায্য" বা "পক্ষপাতদুষ্ট" লেখা। মাপ, সীমা আর শর্তসাপেক্ষ সুপারিশ লিখুন।
নিজে চেষ্টা করুন
এই পাতার নেমস্পেস ব্যবহার করুন। অনুশীলনগুলো পাঁচ নম্বর পাতার তিন জনের গ্রুপটা আবার ছোঁয়।
- সহজ। T2-তে B গ্রুপের জন্য ব্যান্ডের কাউন্ট থেকে (B: নিচু ৩০ জনে ৬ জন উপযুক্ত, মাঝারি ২০ জনে ১০ জন, উঁচু ১০ জনে ৮ জন) হাতে tpr, fpr ও প্রিসিশন বের করুন। তারপর
rates(T2["B"])দিয়ে মিলিয়ে দেখুন। - মাঝারি। A (৫৯ জন উপযুক্ত, ৪১ জন নয়) আর B (২৪ জন উপযুক্ত, ৩৬ জন নয়)-র জন্য একটা নিখুঁত ক্লাসিফায়ার বানান (সে ঠিক উপযুক্তদেরই শর্টলিস্ট করে)। মেট্রিকগুলো প্রিন্ট করুন। কোন লক্ষ্য টেকে আর কোনটা টেকে না?
- কঠিন। টেমপ্লেট ব্যবহার করে পাঁচ নম্বর পাতার টেবিলের (
PAGE5-এর A ও B) জন্য একটা ফলাফল-নোট লিখুন। ওপরের ব্যবধানগুলো আর আপনার নিজের সহনসীমা ব্যবহার করুন।
উত্তর
সহজ। শর্টলিস্টেড: মাঝারি ও উঁচু, অর্থাৎ ৩০ জন, যাঁদের ১০ + ৮ = ১৮ জন উপযুক্ত: tp ১৮, fp ১২। শর্টলিস্টেড নন: ৩০ জন, যাঁদের ৬ জন উপযুক্ত: fn ৬, tn ২৪। tpr = ১৮/২৪ = ০.৭৫, fpr = ১২/৩৬ = ০.৩৩, প্রিসিশন = ১৮/৩০ = ০.৬০। পাস চেকলিস্ট: তিনটা মানই টেবিলের সঙ্গে মেলে; প্রতিটা নিজের হর ব্যবহার করেছে (উপযুক্ত মানুষ, অনুপযুক্ত মানুষ, শর্টলিস্টেড মানুষ)। দুর্বল উত্তর প্রতিবার ৬০ জনকেই হর ধরে।
মাঝারি।
perfect = {"A": {"tp": 59, "fn": 0, "fp": 0, "tn": 41}, "B": {"tp": 24, "fn": 0, "fp": 0, "tn": 36}}
show(perfect, ["base", "selection", "tpr", "fpr", "precision"])group base selection tpr fpr precision
A 0.59 0.59 1.00 0.00 1.00
B 0.40 0.40 1.00 0.00 1.00ইকুয়ালাইজড ওডস ও প্রেডিক্টিভ প্যারিটি পুরোপুরি টেকে (tpr ১.০০, fpr ০.০০, প্রিসিশন ১.০০); ডেমোগ্রাফিক প্যারিটি টেকে না (সিলেকশন ০.৫৯ বনাম ০.৪০), কারণ সেটা বেস রেট অনুসরণ করে। পাস চেকলিস্ট: কোন লক্ষ্য টেকে আর কোনটা টেকে না তা জানিয়েছেন; ব্যর্থতাকে বেস রেটের সঙ্গে জুড়েছেন; ফলকে অন্যায্য বলেননি। দুর্বল উত্তর সিলেকশন ফারাককে ক্লাসিফায়ারের ভুল ধরে।
কঠিন। একটা আদর্শ নোট:
1 Question and data Do ShortlistHelper's decisions and errors fall equally on A (24) and B (16)?
Label: suitable in a later review. Toy data from page 5.
2 Measured B minus A: selection -0.25, tpr -0.25, fpr -0.15, precision +0.00.
tpr: A 9/12 (0.47 to 0.91), B 3/6 (0.19 to 0.81). Tolerance chosen: 0.10.
3 Cannot show Causes; label quality; real-world fairness; any legal question.
4 Uncertainty B has 6 suitable people: its tpr gap is inside overlapping intervals and
fails the minimum of 10, so it is reported but not compared.
5 Trade-offs seen Precision is equal while tpr is not; with base rates 0.50 and 0.38 both
cannot be equalised in general.
6 Recommendation Collect more cases for B before any decision; re-run then.
7 Owner, review date Analytics lead (role); re-run when B has 10 or more suitable people.পাস চেকলিস্ট: মাপা, দেখানো যায় না আর সুপারিশ আলাদা অংশে আছে; কাউন্ট ও ব্যবধান আছে; সুপারিশটা শর্তসাপেক্ষ এবং একজন নামধারী (ভূমিকাসহ) মালিক আছে; কোনো রায়-সূচক শব্দ নেই। দুর্বল নোট বলে "টুলটা B-র বিরুদ্ধে পক্ষপাতদুষ্ট", অথবা ছোট গ্রুপটা লুকায়।
সারসংক্ষেপ
- ইকুয়ালাইজড ওডস মানে দুটো ফারাক; দিক ও আকার পড়ুন, আর যে সহনসীমা বেছেছেন তা এবং কেন বেছেছেন তা লিখে রাখুন।
- ক্যালিব্রেশন ও প্রিসিশন প্যারিটি স্কোরের পাঠককে একটা প্রশ্ন করে; এরর-রেট প্যারিটি যাঁকে স্কোর করা হচ্ছে তাঁকে অন্য একটা প্রশ্ন করে।
- বেস রেট আলাদা আর স্কোর অসম্পূর্ণ হলে লক্ষ্যগুলো সাধারণভাবে সংঘাতে পড়ে (Kleinberg et al.; Chouldechova), যেমন হিসাব-করা টেবিলটা দেখায়।
- ছোট গ্রুপের জন্য কাউন্ট আর ব্যবধান দেখান, এবং অর্থহীন তুলনা করতে অস্বীকার করুন।
- টয় ডেটা শুধু হিসাব শেখায়; ফলাফল-নোট আলাদা রাখে কী মাপা হয়েছে, কী দেখানো যায় না আর কী সুপারিশ করা হচ্ছে।
এরপর: ডেটা গভর্ন্যান্স: উদ্দেশ্য, সম্মতি, ন্যূনতম ডেটা, মান ও পুনঃশনাক্তকরণ পাতায় আমরা আউটপুট মাপা ছেড়ে তার পেছনের ডেটায় যাব: ডেটা কার, কী কাজে লাগানো যাবে, আর কত দিন রাখা হবে।