Packages Installation#

First, install the holisticai package if you haven’t already:

!pip install holisticai[all]

Then, import the necessary libraries.

[2]:
import warnings

import pandas as pd
from holisticai.bias.metrics import multiclass_bias_metrics
from holisticai.datasets import load_dataset
from holisticai.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

warnings.filterwarnings("ignore")

Data Loading#

[3]:
dataset = load_dataset('us_crime_multiclass', protected_attribute="race")
train_test = dataset.train_test_split(test_size=0.2, random_state=42)

train = train_test['train']
test = train_test['test']

1. Fair Scoring Classifier#

Traditional implementation#

[5]:
from holisticai.bias.mitigation import FairScoreClassifier

# fit the mitigator
mitigator = FairScoreClassifier(objectives="ba", constraints={}, time_limit=200)
scaler = StandardScaler()
X_train = scaler.fit_transform(train['X'])
mitigator.fit(X_train, train['y'], train['group_a'], train['group_b'])

# predict the test set
X_test = scaler.transform(test['X'])
y_pred = mitigator.predict(X_test, test['group_a'], test['group_b'])

# compute bias metrics
metrics = multiclass_bias_metrics(test['group_a'], y_pred, test['y'], metric_type='both')
metrics
[5]:
Value Reference
Metric
Max Multiclass Statistical Parity 0.857143 0
Mean Multiclass Statistical Parity 0.857143 0
Max Multiclass Equality of Opportunity 0.631313 0
Max Multiclass Average Odds 0.580808 0
Max Multiclass True Positive Difference 0.353535 0
Mean Multiclass Equality of Opportunity 0.631313 0
Mean Multiclass Average Odds 0.580808 0
Mean Multiclass True Positive Difference 0.353535 0

Pipeline implementation#

[7]:
mitigator = FairScoreClassifier(objectives="ba", constraints={}, time_limit=200)

# set pipeline
pipeline = Pipeline(steps=[('scalar', StandardScaler()),("bm_inprocessing", mitigator),])
pipeline.fit(train['X'], train['y'], bm__group_a=train['group_a'], bm__group_b=train['group_b'])

# predict
y_pred = pipeline.predict(test['X'], bm__group_a=test['group_a'], bm__group_b=test['group_b'])

# compute bias metrics
metrics_pipeline = multiclass_bias_metrics(test['group_a'], y_pred, test['y'], metric_type='both')
metrics_pipeline
[7]:
Value Reference
Metric
Max Multiclass Statistical Parity 0.857143 0
Mean Multiclass Statistical Parity 0.857143 0
Max Multiclass Equality of Opportunity 0.631313 0
Max Multiclass Average Odds 0.580808 0
Max Multiclass True Positive Difference 0.353535 0
Mean Multiclass Equality of Opportunity 0.631313 0
Mean Multiclass Average Odds 0.580808 0
Mean Multiclass True Positive Difference 0.353535 0

Comparison#

[8]:
pd.concat([metrics['Value'], metrics_pipeline], axis=1, keys=['Traditional', 'Pipeline'])
[8]:
Traditional Pipeline
Value Value Reference
Metric
Max Multiclass Statistical Parity 0.857143 0.857143 0
Mean Multiclass Statistical Parity 0.857143 0.857143 0
Max Multiclass Equality of Opportunity 0.631313 0.631313 0
Max Multiclass Average Odds 0.580808 0.580808 0
Max Multiclass True Positive Difference 0.353535 0.353535 0
Mean Multiclass Equality of Opportunity 0.631313 0.631313 0
Mean Multiclass Average Odds 0.580808 0.580808 0
Mean Multiclass True Positive Difference 0.353535 0.353535 0