Bird
Raised Fist0
ML Pythonml~5 mins

Fairness metrics in ML Python

Choose your learning style10 modes available
Introduction

Fairness metrics help us check if a machine learning model treats all groups of people equally. They show if the model is biased or fair.

When building a loan approval system to ensure no group is unfairly denied loans.
When creating a hiring tool to avoid bias against certain genders or ethnicities.
When developing a medical diagnosis model to ensure equal accuracy for all patient groups.
When evaluating a criminal risk prediction tool to prevent discrimination.
When auditing any AI system that impacts people's lives to promote fairness.
Syntax
ML Python
# Example: Calculate demographic parity difference
from sklearn.metrics import confusion_matrix

def demographic_parity_difference(y_true, y_pred, sensitive_attr):
    groups = set(sensitive_attr)
    rates = {}
    for group in groups:
        idx = [i for i, val in enumerate(sensitive_attr) if val == group]
        positive_rate = sum(y_pred[i] for i in idx) / len(idx)
        rates[group] = positive_rate
    return max(rates.values()) - min(rates.values())

Fairness metrics often compare model outcomes across different groups defined by sensitive attributes like gender or race.

Common fairness metrics include demographic parity, equal opportunity, and equalized odds.

Examples
This function calculates how much the model favors one group over another by comparing positive prediction rates.
ML Python
# Demographic parity difference
# Measures difference in positive prediction rates between groups

def demographic_parity_difference(y_true, y_pred, sensitive_attr):
    groups = set(sensitive_attr)
    rates = {}
    for group in groups:
        idx = [i for i, val in enumerate(sensitive_attr) if val == group]
        positive_rate = sum(y_pred[i] for i in idx) / len(idx)
        rates[group] = positive_rate
    return max(rates.values()) - min(rates.values())
This function checks if the model correctly identifies positive cases equally well across groups.
ML Python
# Equal opportunity difference
# Measures difference in true positive rates between groups

def equal_opportunity_difference(y_true, y_pred, sensitive_attr):
    groups = set(sensitive_attr)
    tpr = {}
    for group in groups:
        idx = [i for i, val in enumerate(sensitive_attr) if val == group]
        tp = sum(1 for i in idx if y_pred[i] == 1 and y_true[i] == 1)
        fn = sum(1 for i in idx if y_pred[i] == 0 and y_true[i] == 1)
        tpr[group] = tp / (tp + fn) if (tp + fn) > 0 else 0
    return max(tpr.values()) - min(tpr.values())
Sample Model

This program calculates two fairness metrics on a small example dataset. It shows how much the model's positive predictions and true positive rates differ between two groups.

ML Python
from sklearn.metrics import confusion_matrix

def demographic_parity_difference(y_true, y_pred, sensitive_attr):
    groups = set(sensitive_attr)
    rates = {}
    for group in groups:
        idx = [i for i, val in enumerate(sensitive_attr) if val == group]
        positive_rate = sum(y_pred[i] for i in idx) / len(idx)
        rates[group] = positive_rate
    return max(rates.values()) - min(rates.values())

def equal_opportunity_difference(y_true, y_pred, sensitive_attr):
    groups = set(sensitive_attr)
    tpr = {}
    for group in groups:
        idx = [i for i, val in enumerate(sensitive_attr) if val == group]
        tp = sum(1 for i in idx if y_pred[i] == 1 and y_true[i] == 1)
        fn = sum(1 for i in idx if y_pred[i] == 0 and y_true[i] == 1)
        tpr[group] = tp / (tp + fn) if (tp + fn) > 0 else 0
    return max(tpr.values()) - min(tpr.values())

# Sample data
# y_true: actual labels (1 = positive, 0 = negative)
# y_pred: model predictions
# sensitive_attr: group membership (e.g., 'A' or 'B')
y_true = [1, 0, 1, 0, 1, 0, 1, 0]
y_pred = [1, 0, 1, 1, 0, 0, 1, 0]
sensitive_attr = ['A', 'A', 'B', 'B', 'A', 'A', 'B', 'B']

dp_diff = demographic_parity_difference(y_true, y_pred, sensitive_attr)
eo_diff = equal_opportunity_difference(y_true, y_pred, sensitive_attr)

print(f"Demographic Parity Difference: {dp_diff:.2f}")
print(f"Equal Opportunity Difference: {eo_diff:.2f}")
OutputSuccess
Important Notes

Fairness metrics depend on the sensitive attribute you choose, like gender or age.

Perfect fairness is hard to achieve; sometimes you must balance fairness with accuracy.

Use fairness metrics to find and reduce bias in your models early.

Summary

Fairness metrics measure if a model treats groups equally.

Common metrics compare positive rates or true positive rates across groups.

Checking fairness helps build trustworthy and ethical AI systems.

Practice

(1/5)
1. What is the main purpose of fairness metrics in machine learning models?
easy
A. To improve the speed of model training
B. To check if the model treats different groups equally
C. To increase the size of the training dataset
D. To reduce the number of model parameters

Solution

  1. Step 1: Understand fairness metrics

    Fairness metrics are designed to measure if a model treats different groups fairly and without bias.
  2. Step 2: Compare options

    Options B, C, and D relate to performance or data size, not fairness.
  3. Final Answer:

    To check if the model treats different groups equally -> Option B
  4. Quick Check:

    Fairness metrics = check equal treatment [OK]
Hint: Fairness metrics check equality across groups [OK]
Common Mistakes:
  • Confusing fairness with accuracy
  • Thinking fairness improves training speed
  • Mixing fairness with data size
2. Which of the following is a correct way to calculate demographic parity difference between two groups?
easy
A. Sum of false negatives in both groups
B. Ratio of training samples in each group
C. Difference in positive prediction rates between groups
D. Difference in model training times

Solution

  1. Step 1: Recall demographic parity definition

    Demographic parity measures if the positive prediction rates are similar across groups.
  2. Step 2: Evaluate options

    Difference in positive prediction rates between groups matches this definition. Options A, C, and D are unrelated to demographic parity.
  3. Final Answer:

    Difference in positive prediction rates between groups -> Option C
  4. Quick Check:

    Demographic parity = positive rate difference [OK]
Hint: Demographic parity = compare positive rates [OK]
Common Mistakes:
  • Using false negatives instead of positive rates
  • Confusing sample ratios with fairness metrics
  • Mixing training time with fairness
3. Given the following confusion matrices for two groups, what is the equal opportunity difference? Group A: TP=40, FN=10, FP=20, TN=30 Group B: TP=30, FN=20, FP=15, TN=35
medium
A. 0.25
B. 0.10
C. 0.05
D. 0.20

Solution

  1. Step 1: Calculate true positive rates (TPR) for both groups

    TPR = TP / (TP + FN). For Group A: 40 / (40 + 10) = 0.8. For Group B: 30 / (30 + 20) = 0.6.
  2. Step 2: Find equal opportunity difference

    Equal opportunity difference = |0.8 - 0.6| = 0.20.
  3. Final Answer:

    0.20 -> Option D
  4. Quick Check:

    Equal opportunity difference = |TPR_A - TPR_B| = 0.20 [OK]
Hint: Equal opportunity = difference in true positive rates [OK]
Common Mistakes:
  • Confusing false positive rate with true positive rate
  • Not dividing by (TP + FN)
  • Ignoring absolute difference
4. You have this Python code to compute statistical parity difference but it gives wrong results:
def stat_parity_diff(y_true, y_pred, group):
    pos_rate_group1 = sum(y_pred[group == 1]) / len(y_pred[group == 1])
    pos_rate_group0 = sum(y_pred[group == 0]) / len(y_pred[group == 0])
    return pos_rate_group0 - pos_rate_group1
What is the main bug?
medium
A. The difference sign is reversed; should be group1 - group0
B. Using y_true instead of y_pred for positive rates
C. Not handling division by zero if group has no samples
D. Using sum instead of mean for positive rate

Solution

  1. Step 1: Understand statistical parity difference

    It is usually calculated as positive rate of group 1 minus positive rate of group 0.
  2. Step 2: Check code difference calculation

    The code returns pos_rate_group0 - pos_rate_group1, which reverses the sign.
  3. Final Answer:

    The difference sign is reversed; should be group1 - group0 -> Option A
  4. Quick Check:

    Sign order matters in parity difference [OK]
Hint: Stat parity = group1 rate minus group0 rate [OK]
Common Mistakes:
  • Mixing up group order in subtraction
  • Ignoring zero division errors
  • Confusing y_true and y_pred
5. You want to ensure your loan approval model is fair by equalizing false positive rates (FPR) across two groups. Given these FPRs: Group X: 0.10 Group Y: 0.25 Which action best reduces this fairness gap?
hard
A. Adjust the model threshold for Group Y to be more strict
B. Increase training data size for Group X
C. Remove Group Y samples from training
D. Use accuracy as the only metric to evaluate fairness

Solution

  1. Step 1: Understand false positive rate difference

    Group Y has a higher FPR (0.25) than Group X (0.10), meaning more false alarms for Group Y.
  2. Step 2: Choose action to reduce FPR gap

    Adjusting the decision threshold for Group Y to be more strict reduces false positives, lowering FPR closer to Group X.
  3. Final Answer:

    Adjust the model threshold for Group Y to be more strict -> Option A
  4. Quick Check:

    Threshold tuning reduces FPR gap [OK]
Hint: Higher threshold for high FPR group to reduce false positives [OK]
Common Mistakes:
  • Ignoring threshold adjustment
  • Removing data harms fairness
  • Using accuracy alone misses fairness issues
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard