Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save amaarora/f846fb959bfed2187719c83e10ed09d6 to your computer and use it in GitHub Desktop.
Save amaarora/f846fb959bfed2187719c83e10ed09d6 to your computer and use it in GitHub Desktop.
git_repos/fairlearn/notebooks/Binary Classification with the UCI Credit-card Default Dataset.ipynb
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# Binary Classification with the UCI Credit-card Default Dataset\n_**Mitigating disparities in false-positive rates and false-negative rates**_"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Contents\n\n1. [What is Covered](#What-is-Covered)\n1. [Introduction](#Introduction)\n1. [The UCI Credit-card Default Dataset](#The-UCI-Credit-card-Default-Dataset)\n1. [Using a Fairness Unaware Model](#Using-a-Fairness-Unaware-Model)\n1. [Mitigating Equalized Odds Difference with Postprocessing](#Mitigating-Equalized-Odds-Difference-with-Postprocessing)\n1. [Mitigating Equalized Odds Difference with GridSearch](#Mitigating-Equalized-Odds-Difference-with-GridSearch)\n1. [Conclusion](#Conclusion)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## What is Covered\n\n* **Domain:**\n * Finance (loan decisions). The data is semisynthetic to create a simple example of disparities in FPR and FNR.\n\n* **ML task:**\n * Binary classification.\n\n* **Fairness tasks:**\n * Assessment of unfairness using Fairlearn metrics.\n * Mitigation of unfairness using Fairlearn mitigation algorithms.\n\n* **Performance metrics:**\n * Area under ROC curve.\n * Balanced accuracy.\n\n* **Fairness metrics:**\n * False-positive rate difference.\n * False-negative rate difference.\n * Equalized-odds difference.\n\n* **Mitigation algorithms:**\n * `fairlearn.reductions.GridSearch`\n * `fairlearn.postprocessing.ThresholdOptimizer`"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Introduction\n\nIn this notebook, we consider a scenario where algorithmic tools are deployed to predict the likelihood that an applicant will default on a credit-card loan. The notebook emulates the problem presented in this [white paper](https://www.microsoft.com/en-us/research/uploads/prod/2020/09/Fairlearn-EY_WhitePaper-2020-09-22.pdf) in collaboration with EY.\n\nDue to data privacy, we do not use the data from the white paper. Instead, we use the [UCI Credit-card default dataset](https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients), a toy dataset reflecting credit-card defaults in Taiwan, as a substitute dataset to replicate the desired workflow. To make this dataset applicable to our problem, we introduce a synthethic feature that is highly predictive for applicants defined as \"female\" in terms of the \"sex\" feature, but is uninformative for applicants defined as \"male\".\n\nWe train a fairness-unaware algorithm on this dataset and show the model has a higher false-positive rate as well as a higher false-negative rate for the \"male\" group than for the \"female\" group. We then use Fairlearn to mitigate this disparity using both the `ThresholdOptimizer` and `GridSearch` algorithms."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import wandb\n\n# General imports\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# Data processing\nfrom sklearn.model_selection import train_test_split\n\n# Models\nimport lightgbm as lgb\nfrom sklearn.calibration import CalibratedClassifierCV\n\n# Fairlearn algorithms and utils\nfrom fairlearn.postprocessing import ThresholdOptimizer\nfrom fairlearn.reductions import GridSearch, EqualizedOdds\n\n# Metrics\nfrom fairlearn.metrics import (\n MetricFrame,\n selection_rate, demographic_parity_difference, demographic_parity_ratio,\n false_positive_rate, false_negative_rate,\n false_positive_rate_difference, false_negative_rate_difference,\n equalized_odds_difference)\nfrom sklearn.metrics import balanced_accuracy_score, roc_auc_score",
"execution_count": 1,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## The UCI Credit-card Default Dataset\n\nThe UCI dataset contains data on 30,000 clients and their credit card transactions at a bank in Taiwan. In addition to static client features, the dataset contains the history of credit card bill payments between April and September 2005, as well as the balance limit of the client's credit card. The target is whether the client will default on a card payment in the following month, October 2005. A model trained on this data could be used, in part, to determine whether a client is eligible for another loan or a credit increase."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Load the data\ndata_url = \"http://archive.ics.uci.edu/ml/machine-learning-databases/00350/default+of+credit+card+clients.xls\"\ndataset = pd.read_excel(io=data_url, header=1).drop(columns=['ID']).rename(columns={'PAY_0':'PAY_1'})\ndataset.head()",
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 2,
"data": {
"text/plain": " LIMIT_BAL SEX EDUCATION MARRIAGE AGE PAY_1 PAY_2 PAY_3 PAY_4 \\\n0 20000 2 2 1 24 2 2 -1 -1 \n1 120000 2 2 2 26 -1 2 0 0 \n2 90000 2 2 2 34 0 0 0 0 \n3 50000 2 2 1 37 0 0 0 0 \n4 50000 1 2 1 57 -1 0 -1 0 \n\n PAY_5 ... BILL_AMT4 BILL_AMT5 BILL_AMT6 PAY_AMT1 PAY_AMT2 PAY_AMT3 \\\n0 -2 ... 0 0 0 0 689 0 \n1 0 ... 3272 3455 3261 0 1000 1000 \n2 0 ... 14331 14948 15549 1518 1500 1000 \n3 0 ... 28314 28959 29547 2000 2019 1200 \n4 0 ... 20940 19146 19131 2000 36681 10000 \n\n PAY_AMT4 PAY_AMT5 PAY_AMT6 default payment next month \n0 0 0 0 1 \n1 1000 0 2000 1 \n2 1000 1000 5000 0 \n3 1100 1069 1000 0 \n4 9000 689 679 0 \n\n[5 rows x 24 columns]",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>LIMIT_BAL</th>\n <th>SEX</th>\n <th>EDUCATION</th>\n <th>MARRIAGE</th>\n <th>AGE</th>\n <th>PAY_1</th>\n <th>PAY_2</th>\n <th>PAY_3</th>\n <th>PAY_4</th>\n <th>PAY_5</th>\n <th>...</th>\n <th>BILL_AMT4</th>\n <th>BILL_AMT5</th>\n <th>BILL_AMT6</th>\n <th>PAY_AMT1</th>\n <th>PAY_AMT2</th>\n <th>PAY_AMT3</th>\n <th>PAY_AMT4</th>\n <th>PAY_AMT5</th>\n <th>PAY_AMT6</th>\n <th>default payment next month</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>20000</td>\n <td>2</td>\n <td>2</td>\n <td>1</td>\n <td>24</td>\n <td>2</td>\n <td>2</td>\n <td>-1</td>\n <td>-1</td>\n <td>-2</td>\n <td>...</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>689</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>1</td>\n </tr>\n <tr>\n <th>1</th>\n <td>120000</td>\n <td>2</td>\n <td>2</td>\n <td>2</td>\n <td>26</td>\n <td>-1</td>\n <td>2</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>3272</td>\n <td>3455</td>\n <td>3261</td>\n <td>0</td>\n <td>1000</td>\n <td>1000</td>\n <td>1000</td>\n <td>0</td>\n <td>2000</td>\n <td>1</td>\n </tr>\n <tr>\n <th>2</th>\n <td>90000</td>\n <td>2</td>\n <td>2</td>\n <td>2</td>\n <td>34</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>14331</td>\n <td>14948</td>\n <td>15549</td>\n <td>1518</td>\n <td>1500</td>\n <td>1000</td>\n <td>1000</td>\n <td>1000</td>\n <td>5000</td>\n <td>0</td>\n </tr>\n <tr>\n <th>3</th>\n <td>50000</td>\n <td>2</td>\n <td>2</td>\n <td>1</td>\n <td>37</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>28314</td>\n <td>28959</td>\n <td>29547</td>\n <td>2000</td>\n <td>2019</td>\n <td>1200</td>\n <td>1100</td>\n <td>1069</td>\n <td>1000</td>\n <td>0</td>\n </tr>\n <tr>\n <th>4</th>\n <td>50000</td>\n <td>1</td>\n <td>2</td>\n <td>1</td>\n <td>57</td>\n <td>-1</td>\n <td>0</td>\n <td>-1</td>\n <td>0</td>\n <td>0</td>\n <td>...</td>\n <td>20940</td>\n <td>19146</td>\n <td>19131</td>\n <td>2000</td>\n <td>36681</td>\n <td>10000</td>\n <td>9000</td>\n <td>689</td>\n <td>679</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 24 columns</p>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Dataset columns:\n\n* `LIMIT_BAL`: credit card limit, will be replaced by a synthetic feature\n* `SEX, EDUCATION, MARRIAGE, AGE`: client demographic features\n* `BILL_AMT[1-6]`: amount on bill statement for April-September\n* `PAY_AMT[1-6]`: payment amount for April-September\n* `default payment next month`: target, whether the client defaulted the following month"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "raw_data = wandb.Table(dataframe=dataset)\nwandb.init(\"model-bias\")",
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": "\u001b[34m\u001b[1mwandb\u001b[0m: Currently logged in as: \u001b[33mamanarora\u001b[0m (use `wandb login --relogin` to force relogin)\n",
"name": "stderr"
},
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "\n Syncing run <strong><a href=\"https://wandb.ai/amanarora/fairlearn-notebooks/runs/1jtd1vrc\" target=\"_blank\">jolly-snowflake-11</a></strong> to <a href=\"https://wandb.ai/amanarora/fairlearn-notebooks\" target=\"_blank\">Weights & Biases</a> (<a href=\"https://docs.wandb.com/integrations/jupyter.html\" target=\"_blank\">docs</a>).<br/>\n\n "
},
"metadata": {}
},
{
"output_type": "execute_result",
"execution_count": 3,
"data": {
"text/html": "<button onClick=\"this.nextSibling.style.display='block';this.style.display='none';\">Display W&B run</button><iframe src=\"https://wandb.ai/amanarora/fairlearn-notebooks/runs/1jtd1vrc?jupyter=true\" style=\"border:none;width:100%;height:420px;display:none;\"></iframe>",
"text/plain": "<wandb.sdk.wandb_run.Run at 0x7efcc30b13d0>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Extract the sensitive feature\nA = dataset[\"SEX\"]\nA_str = A.map({ 2:\"female\", 1:\"male\"})\n\n# Extract the target\nY = dataset[\"default payment next month\"]\ncategorical_features = ['EDUCATION', 'MARRIAGE','PAY_1', 'PAY_2', 'PAY_3', 'PAY_4', 'PAY_5', 'PAY_6']\nfor col in categorical_features:\n dataset[col] = dataset[col].astype('category')",
"execution_count": 6,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Introduce a Synthetic Feature\n\nWe manipulate the balance-limit feature `LIMIT_BAL` to make it highly predictive for the \"female\" group but not for the \"male\" group. Specifically, we set this up, so that a lower credit limit indicates that a female client is less likely to default, but provides no information on a male client's probability of default."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dist_scale = 0.3\nnp.random.seed(12345)\n\n# Make 'LIMIT_BAL' informative of the target\ndataset['LIMIT_BAL'] = Y + np.random.normal(scale=dist_scale, size=len(dataset))\n\n# But then make it uninformative for the male clients\ndataset.loc[A==1, 'LIMIT_BAL'] = np.random.normal(scale=dist_scale, size=dataset[A==1].shape[0])",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "table2 = wandb.Table(dataframe=dataset)",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dataset['LIMIT_BAL'][(A==2) & (Y==0)].hist()",
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 12,
"data": {
"text/plain": "<AxesSubplot:>"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dataset['LIMIT_BAL'][(A==2) & (Y==1)].hist()",
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 16,
"data": {
"text/plain": "<AxesSubplot:>"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 432x288 with 1 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n\n# Plot distribution of LIMIT_BAL for men\ndataset['LIMIT_BAL'][(A==1) & (Y==0)].plot(kind='kde', label=\"Payment on time\", ax=ax1, \n title=\"LIMIT_BAL distribution for \\\"male\\\" group\")\ndataset['LIMIT_BAL'][(A==1) & (Y==1)].plot(kind='kde', label=\"Default\", ax=ax1)\n# wandb.log({'LIMIT_BAL distribution for \"Male\" group': fig})\n\n# Plot distribution of LIMIT_BAL for women\n# fig, (ax2) = plt.subplots(ncols=1, figsize=(10, 4), sharey=True)\n\ndataset['LIMIT_BAL'][(A==2) & (Y==0)].plot(kind='kde', label=\"Payment on time\", ax=ax2, \n legend=True, title=\"LIMIT_BAL distribution for \\\"female\\\" group\")\ndataset['LIMIT_BAL'][(A==2) & (Y==1)].plot(kind='kde', label=\"Default\", ax=ax2, \n legend=True).legend(bbox_to_anchor=(1.6, 1))\n# wandb.log({'LIMIT_BAL distribution for \"Female\" group': fig})\nplt.show()",
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 720x288 with 2 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "wandb.log({'raw-credit-card-data': table1, \n 'synthetic-feature-credit-card-data': table2, \n 'LIMIT_BAL distribution for \"Male\" & \"Female\" group': fig})",
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": "/opt/conda/lib/python3.7/site-packages/plotly/matplotlylib/renderer.py:649: UserWarning:\n\nLooks like the annotation(s) you are trying \nto draw lies/lay outside the given figure size.\n\nTherefore, the resulting Plotly figure may not be \nlarge enough to view the full text. To adjust \nthe size of the figure, use the 'width' and \n'height' keys in the Layout object. Alternatively,\nuse the Margin object to adjust the figure's margins.\n\n/opt/conda/lib/python3.7/site-packages/plotly/matplotlylib/renderer.py:613: UserWarning:\n\nI found a path object that I don't think is part of a bar chart. Ignoring.\n\n",
"name": "stderr"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Note in the above figures that the new `LIMIT_BAL` feature is indeed highly predictive for the \"female\" group, but not for the \"male\" group."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Train-test split\ndf_train, df_test, Y_train, Y_test, A_train, A_test, A_str_train, A_str_test = train_test_split(\n dataset.drop(columns=['SEX', 'default payment next month']), \n Y, \n A, \n A_str,\n test_size = 0.3, \n random_state=12345,\n stratify=Y)",
"execution_count": 20,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Using a Fairness Unaware Model"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We train an out-of-the-box `lightgbm` model on the modified data and assess several fairness metrics. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lgb_params = {\n 'objective' : 'binary',\n 'metric' : 'auc',\n 'learning_rate': 0.03,\n 'num_leaves' : 10,\n 'max_depth' : 3\n}",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "model = lgb.LGBMClassifier(**lgb_params)",
"execution_count": 22,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "model.fit(df_train, Y_train)",
"execution_count": 23,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 23,
"data": {
"text/plain": "LGBMClassifier(learning_rate=0.03, max_depth=3, metric='auc', num_leaves=10,\n objective='binary')"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Scores on test set\ntest_scores = model.predict_proba(df_test)[:, 1]",
"execution_count": 24,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Train AUC\nroc_auc_score(Y_train, model.predict_proba(df_train)[:, 1])",
"execution_count": 30,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 30,
"data": {
"text/plain": "0.8893629471767917"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Predictions (0 or 1) on test set\ntest_preds = (test_scores >= np.mean(Y_train)) * 1",
"execution_count": 31,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# LightGBM feature importance \nlgb.plot_importance(model, height=0.6, title=\"Features importance (LightGBM)\", importance_type=\"gain\", max_num_features=15) \nplt.show()",
"execution_count": 15,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We notice that the synthetic feature `LIMIT_BAL` appears as the most important feature in this model although it has no predictive power for an entire demographic segment in the data.\n\nWe next use Fairlearn's `MetricFrame` to examine the the two different kinds of errors (false positives and false negatives) on the test data."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "mf = MetricFrame({\n 'FPR': false_positive_rate,\n 'FNR': false_negative_rate},\n Y_test, test_preds, sensitive_features=A_str_test)\n\nmf.by_group",
"execution_count": 32,
"outputs": [
{
"output_type": "stream",
"text": "/home/arora/git_repos/fairlearn/fairlearn/metrics/_metric_frame.py:75: FutureWarning:\n\nYou have provided 'metrics', 'y_true', 'y_pred' as positional arguments. Please pass them as keyword arguments. From version 0.10.0 passing them as positional arguments will result in an error.\n\n",
"name": "stderr"
},
{
"output_type": "execute_result",
"execution_count": 32,
"data": {
"text/plain": " FPR FNR\nSEX \nfemale 0.083791 0.048077\nmale 0.099205 0.5549",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>FPR</th>\n <th>FNR</th>\n </tr>\n <tr>\n <th>SEX</th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>female</th>\n <td>0.083791</td>\n <td>0.048077</td>\n </tr>\n <tr>\n <th>male</th>\n <td>0.099205</td>\n <td>0.5549</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Note that both kinds of errors are more common in the \"male\" group than in the \"female\" group."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "?demographic_parity_difference",
"execution_count": 34,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Helper functions\ndef get_metrics_df(models_dict, y_true, group):\n metrics_dict = {\n \"Overall selection rate\": (\n lambda x: selection_rate(y_true, x), True),\n \"Demographic parity difference\": (\n lambda x: demographic_parity_difference(y_true, x, sensitive_features=group), True),\n \"Demographic parity ratio\": (\n lambda x: demographic_parity_ratio(y_true, x, sensitive_features=group), True),\n \"------\": (lambda x: \"\", True),\n \"Overall balanced error rate\": (\n lambda x: 1-balanced_accuracy_score(y_true, x), True),\n \"Balanced error rate difference\": (\n lambda x: MetricFrame(metrics=balanced_accuracy_score, y_true=y_true, y_pred=x, sensitive_features=group).difference(method='between_groups'), True),\n \" ------\": (lambda x: \"\", True),\n \"False positive rate difference\": (\n lambda x: false_positive_rate_difference(y_true, x, sensitive_features=group), True),\n \"False negative rate difference\": (\n lambda x: false_negative_rate_difference(y_true, x, sensitive_features=group), True),\n \"Equalized odds difference\": (\n lambda x: equalized_odds_difference(y_true, x, sensitive_features=group), True),\n \" ------\": (lambda x: \"\", True),\n \"Overall AUC\": (\n lambda x: roc_auc_score(y_true, x), False),\n \"AUC difference\": (\n lambda x: MetricFrame(metrics=roc_auc_score, y_true=y_true, y_pred=x, sensitive_features=group).difference(method='between_groups'), False),\n }\n df_dict = {}\n for metric_name, (metric_func, use_preds) in metrics_dict.items():\n df_dict[metric_name] = [metric_func(preds) if use_preds else metric_func(scores) \n for model_name, (preds, scores) in models_dict.items()]\n return pd.DataFrame.from_dict(df_dict, orient=\"index\", columns=models_dict.keys())",
"execution_count": 33,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We calculate several performance and fairness metrics below:"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Metrics\nmodels_dict = {\"Unmitigated\": (test_preds, test_scores)}\nget_metrics_df(models_dict, Y_test, A_str_test)",
"execution_count": 35,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 35,
"data": {
"text/plain": " Unmitigated\nOverall selection rate 0.232667\nDemographic parity difference 0.08077\nDemographic parity ratio 0.694018\n------ \nOverall balanced error rate 0.176643\nBalanced error rate difference 0.261118\n ------ \nFalse positive rate difference 0.015414\nFalse negative rate difference 0.506823\nEqualized odds difference 0.506823\n ------ \nOverall AUC 0.890264\nAUC difference 0.230374",
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unmitigated</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Overall selection rate</th>\n <td>0.232667</td>\n </tr>\n <tr>\n <th>Demographic parity difference</th>\n <td>0.08077</td>\n </tr>\n <tr>\n <th>Demographic parity ratio</th>\n <td>0.694018</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n </tr>\n <tr>\n <th>Overall balanced error rate</th>\n <td>0.176643</td>\n </tr>\n <tr>\n <th>Balanced error rate difference</th>\n <td>0.261118</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n </tr>\n <tr>\n <th>False positive rate difference</th>\n <td>0.015414</td>\n </tr>\n <tr>\n <th>False negative rate difference</th>\n <td>0.506823</td>\n </tr>\n <tr>\n <th>Equalized odds difference</th>\n <td>0.506823</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n </tr>\n <tr>\n <th>Overall AUC</th>\n <td>0.890264</td>\n </tr>\n <tr>\n <th>AUC difference</th>\n <td>0.230374</td>\n </tr>\n </tbody>\n</table>\n</div>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "As the overall performance metric we use the _area under ROC curve_ (AUC), which is suited to classification problems with a large imbalance between positive and negative examples. For binary classifiers, this is the same as _balanced accuracy_.\n\nAs the fairness metric we use *equalized odds difference*, which quantifies the disparity in accuracy experienced by different demographics. Our goal is to assure that neither of the two groups (\"male\" vs \"female\") has substantially larger false-positive rates or false-negative rates than the other group. The equalized odds difference is equal to the larger of the following two numbers: (1) the difference between false-positive rates of the two groups, (2) the difference between false-negative rates of the two groups.\n\nThe table above shows the overall AUC of 0.85 (based on continuous predictions) and the overall balanced error rate of 0.22 (based on 0/1 predictions). Both of these are satisfactory in our application context. However, there is a large disparity in accuracy rates (as indicated by the balanced error rate difference) and even larger when we consider the equalized-odds difference. As a sanity check, we also show the demographic parity ratio, whose level (slightly above 0.8) is considered satisfactory in this context."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Mitigating Equalized Odds Difference with Postprocessing"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We attempt to mitigate the disparities in the `lightgbm` predictions using the Fairlearn postprocessing algorithm `ThresholdOptimizer`. This algorithm finds a suitable threshold for the scores (class probabilities) produced by the `lightgbm` model by optimizing the accuracy rate under the constraint that the equalized odds difference (on training data) is zero. Since our goal is to optimize balanced accuracy, we resample the training data to have the same number of positive and negative examples. This means that `ThresholdOptimizer` is effectively optimizing balanced accuracy on the original data."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "postprocess_est = ThresholdOptimizer(\n estimator=model,\n constraints=\"equalized_odds\",\n prefit=True)",
"execution_count": 19,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Balanced data set is obtained by sampling the same number of points from the majority class (Y=0)\n# as there are points in the minority class (Y=1)\nbalanced_idx1 = df_train[Y_train==1].index\npp_train_idx = balanced_idx1.union(Y_train[Y_train==0].sample(n=balanced_idx1.size, random_state=1234).index)",
"execution_count": 20,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df_train_balanced = df_train.loc[pp_train_idx, :]\nY_train_balanced = Y_train.loc[pp_train_idx]\nA_train_balanced = A_train.loc[pp_train_idx]",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "postprocess_est.fit(df_train_balanced, Y_train_balanced, sensitive_features=A_train_balanced)",
"execution_count": 22,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": "/home/arora/git_repos/fairlearn/fairlearn/postprocessing/_threshold_optimizer.py:275: FutureWarning: 'predict_method' default value is changed from 'predict' to 'auto'. Explicitly pass `predict_method='predict' to replicate the old behavior, or pass `predict_method='auto' or other valid values to silence this warning.\n FutureWarning,\n"
},
{
"data": {
"text/plain": "ThresholdOptimizer(constraints='equalized_odds',\n estimator=LGBMClassifier(learning_rate=0.03, max_depth=3,\n metric='auc', num_leaves=10,\n objective='binary'),\n prefit=True)"
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "postprocess_preds = postprocess_est.predict(df_test, sensitive_features=A_test)",
"execution_count": 23,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "models_dict = {\"Unmitigated\": (test_preds, test_scores),\n \"ThresholdOptimizer\": (postprocess_preds, postprocess_preds)}\nget_metrics_df(models_dict, Y_test, A_str_test)",
"execution_count": 24,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unmitigated</th>\n <th>ThresholdOptimizer</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Overall selection rate</th>\n <td>0.268111</td>\n <td>0.080778</td>\n </tr>\n <tr>\n <th>Demographic parity difference</th>\n <td>0.051105</td>\n <td>0.005265</td>\n </tr>\n <tr>\n <th>Demographic parity ratio</th>\n <td>0.8225</td>\n <td>0.937323</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n <td></td>\n </tr>\n <tr>\n <th>Overall balanced error rate</th>\n <td>0.220682</td>\n <td>0.406107</td>\n </tr>\n <tr>\n <th>Balanced error rate difference</th>\n <td>0.175789</td>\n <td>0.007486</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n <td></td>\n </tr>\n <tr>\n <th>False positive rate difference</th>\n <td>0.009296</td>\n <td>0.002053</td>\n </tr>\n <tr>\n <th>False negative rate difference</th>\n <td>0.342283</td>\n <td>0.012919</td>\n </tr>\n <tr>\n <th>Equalized odds difference</th>\n <td>0.342283</td>\n <td>0.012919</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n <td></td>\n </tr>\n <tr>\n <th>Overall AUC</th>\n <td>0.851931</td>\n <td>0.593893</td>\n </tr>\n <tr>\n <th>AUC difference</th>\n <td>0.189712</td>\n <td>0.007486</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " Unmitigated ThresholdOptimizer\nOverall selection rate 0.268111 0.080778\nDemographic parity difference 0.051105 0.005265\nDemographic parity ratio 0.8225 0.937323\n------ \nOverall balanced error rate 0.220682 0.406107\nBalanced error rate difference 0.175789 0.007486\n ------ \nFalse positive rate difference 0.009296 0.002053\nFalse negative rate difference 0.342283 0.012919\nEqualized odds difference 0.342283 0.012919\n ------ \nOverall AUC 0.851931 0.593893\nAUC difference 0.189712 0.007486"
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The `ThresholdOptimizer` algorithm significantly reduces the disparity according to multiple metrics. However, the performance metrics (balanced error rate as well as AUC) get worse. Before deploying such a model in practice, it would be important to examine in more detail why we observe such a sharp trade-off. In our case it is because the available features are much less informative for one of the demographic groups than for the other.\n\nNote that unlike the unmitigated model, `ThresholdOptimizer` produces 0/1 predictions, so its balanced error rate difference is equal to the AUC difference, and its overall balanced error rate is equal to 1 - overall AUC."
},
{
"metadata": {
"heading_collapsed": true
},
"cell_type": "markdown",
"source": "## Mitigating Equalized Odds Difference with GridSearch"
},
{
"metadata": {
"hidden": true
},
"cell_type": "markdown",
"source": "We now attempt to mitigate disparities using the `GridSearch` algorithm. Unlike `ThresholdOptimizer`, the predictors produced by `GridSearch` do not access the sensitive feature at test time. Also, rather than training a single model, we train multiple models corresponding to different trade-off points between the performance metric (balanced accuracy) and fairness metric (equalized odds difference)."
},
{
"metadata": {
"scrolled": true,
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "# Train GridSearch\nsweep = GridSearch(model,\n constraints=EqualizedOdds(),\n grid_size=50,\n grid_limit=3)\n\nsweep.fit(df_train_balanced, Y_train_balanced, sensitive_features=A_train_balanced)",
"execution_count": 25,
"outputs": []
},
{
"metadata": {
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "sweep_preds = [predictor.predict(df_test) for predictor in sweep.predictors_] \nsweep_scores = [predictor.predict_proba(df_test)[:, 1] for predictor in sweep.predictors_] ",
"execution_count": 26,
"outputs": []
},
{
"metadata": {
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "equalized_odds_sweep = [\n equalized_odds_difference(Y_test, preds, sensitive_features=A_str_test)\n for preds in sweep_preds\n]\nbalanced_accuracy_sweep = [balanced_accuracy_score(Y_test, preds) for preds in sweep_preds]\nauc_sweep = [roc_auc_score(Y_test, scores) for scores in sweep_scores]",
"execution_count": 27,
"outputs": []
},
{
"metadata": {
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "# Select only non-dominated models (with respect to balanced accuracy and equalized odds difference)\nall_results = pd.DataFrame(\n {\"predictor\": sweep.predictors_, \"accuracy\": balanced_accuracy_sweep, \"disparity\": equalized_odds_sweep}\n) \nnon_dominated = [] \nfor row in all_results.itertuples(): \n accuracy_for_lower_or_eq_disparity = all_results[\"accuracy\"][all_results[\"disparity\"] <= row.disparity] \n if row.accuracy >= accuracy_for_lower_or_eq_disparity.max(): \n non_dominated.append(True)\n else:\n non_dominated.append(False)\n\nequalized_odds_sweep_non_dominated = np.asarray(equalized_odds_sweep)[non_dominated]\nbalanced_accuracy_non_dominated = np.asarray(balanced_accuracy_sweep)[non_dominated]\nauc_non_dominated = np.asarray(auc_sweep)[non_dominated]",
"execution_count": 28,
"outputs": []
},
{
"metadata": {
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "# Plot equalized odds difference vs balanced accuracy\nplt.scatter(balanced_accuracy_non_dominated, equalized_odds_sweep_non_dominated, label=\"GridSearch Models\")\nplt.scatter(balanced_accuracy_score(Y_test, test_preds),\n equalized_odds_difference(Y_test, test_preds, sensitive_features=A_str_test), \n label=\"Unmitigated Model\")\nplt.scatter(balanced_accuracy_score(Y_test, postprocess_preds), \n equalized_odds_difference(Y_test, postprocess_preds, sensitive_features=A_str_test),\n label=\"ThresholdOptimizer Model\")\nplt.xlabel(\"Balanced Accuracy\")\nplt.ylabel(\"Equalized Odds Difference\")\nplt.legend(bbox_to_anchor=(1.55, 1))\nplt.show()",
"execution_count": 29,
"outputs": [
{
"data": {
"image/png": "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XqNGjerx+++/VzunzXPPPdc2Pz+//Hf38OHDe548ebLauXgsPvroo1ZPPvlke6PHGyUiMRMnTgyybBcXF8PPzy96xIgRPWtyHuuFVmtzTEV2S3ZExB3AmwDGAYgAcJeIRFQ47DsA0araB8B9AN6tQV0iIpfX0derRuWurn379qVpaWkpaWlpKffcc8+JGTNmHE9LS0uJj49PsbUEQkXFxVWuq1lvZs2aFVhQUOB28ODBpMOHDydNmDAhb+LEiT3LysqqrPf222+3KygoKP+gW7duzWzTpk1pVXWsTZ069eyLL754rBah27yHXl5eZenp6V4FBQUCAOvWrWvZrl07x7jZsG/LTn8Amap6QFUvAfgYwC3WB6hqgf53VsMWANRoXSIiV1DdAp+zx4TCq8nlf7g71Rw7AD5J/8R/xKcjonp/0DtmxKcjoj5J/8QuK56XlpZi8uTJXXv27Bk5ZMiQYMsv3v79+4c+9NBDgddcc03o/Pnz2/3444/Nr7nmmtDIyMjwoUOHBh8+fLgJAMyfP79tjx49IkNCQiJuvvnm7pbzpqamevXv3z+0U6dOUfPnz29rKZ83b1674ODgyODg4MjnnnuubcV4ysrKcM8993Tp0aNH5HXXXdfz5MmTHgCQn5/v9umnn7ZZunTpEQ8PUwPFww8/fMrT07Ns48aNPunp6Z5BQUGRt956a7eQkJCIsWPHds/Pz3ebP39+29zc3CbDhw8PsczobGnlsNS58847uwYHB0dOmDAhaP369T79+vUL69q1a68ffvihOQAsXry49T333NMFACwtZGFhYRHNmjXr99VXX3mfO3fObdKkSd169eoVHh4eHrFy5UpfS71x48Z1HzlyZM9hw4aFVPysADBq1Kizn332mS8ArF692v+2224rn1vp+PHj7qNHj+4REhISER0dHfbrr796AaaWuiFDhgSHh4dHTJkypav1RMdLlizxj4qKCg8LC4uYMmVK15KSkpp/KczsmewEAjhitZ1lLruMiPxJRNIAfAVT647huub6081dYPEnTpyok8CJiOqDZfBxdl4hFP8dfGyd8EzsG4iXbo1CoK8XBKZZk1+6NcppBid/kv6J/8s7X+56svCkp0JxsvCk58s7X+5qj4Tnjz/+aDZr1qzczMzM5FatWpV++OGHfpZ9eXl57jt37kx/8sknc2fNmtXliy+++D05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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"hidden": true
},
"cell_type": "markdown",
"source": "As intended, `GridSearch` models appear along the trade-off curve between the large balanced accuracy (but also large disparity), and low disparity (but worse balanced accuracy). This gives the data scientist a flexibility to select a model that fits the application context best."
},
{
"metadata": {
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "# Plot equalized odds difference vs AUC\nplt.scatter(auc_non_dominated, equalized_odds_sweep_non_dominated, label=\"GridSearch Models\")\nplt.scatter(roc_auc_score(Y_test, test_scores),\n equalized_odds_difference(Y_test, test_preds, sensitive_features=A_str_test), \n label=\"Unmitigated Model\")\nplt.scatter(roc_auc_score(Y_test, postprocess_preds), \n equalized_odds_difference(Y_test, postprocess_preds, sensitive_features=A_str_test),\n label=\"ThresholdOptimizer Model\")\nplt.xlabel(\"AUC\")\nplt.ylabel(\"Equalized Odds Difference\")\nplt.legend(bbox_to_anchor=(1.55, 1))\nplt.show()",
"execution_count": 30,
"outputs": [
{
"data": {
"image/png": "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mpp+zz33nHz00UeDAGDZsmVdU1JS0rKystLeeeedI9a62dnZbRITE7N27dqV/o9//COwpKREvvnmm7br1q3ruHv37vSkpKT01atXB3z33XeXdb+tWbPGNzs7u3VmZmbqO++8c2TPnj3eAJCWlta6W7dul/z9/S/rxrnqqqsuJCcnewHA4cOH28yaNetEVlZWmo+PT8XSpUsD5s+fn9+5c+fSxMTErB9//DGravuPHj3a5pFHHsnPyMhI/eWXX9r8+9//7piUlJTx/PPP5zz//PPdql5v7SF75plncqOios6PHTv2/JNPPtlt1KhR51JSUtK/+eabzPnz53e37ue1Z88e7/Xr1x/auXPn794bAGbMmHH6/fff97tw4YKkp6e3HTJkyHnrucceeywwNjb2QlZWVtpzzz2Xe88994QAwLx58wKHDBlSlJ6enjZp0qSCY8eOeVreq82GDRv8k5KSMjIyMtLc3Nx0xYoVte4TVh1HPo1lb/fY3+1NoaqbAGwSkWsAPAdgrNG6lvorAawEzNtFXHG0REQOVNPE46qJjCuto7Ni34qgS+WXLvvD+lL5JbcV+1YE3RF2R4OuqhwUFFQydOjQYgDo37//hcOHD7e2nrvzzjtPA8D+/ftbHzhwwGv06NEmwNz7EhAQUAoAYWFhxX/4wx9CJk2aVDB9+vQCa93rr7++wMvLS728vMr8/f1Lc3JyPLZv3+59ww03FLRv374CAG688cYzX3/9tc+wYcMqJ1clJib63H777ac9PDzQq1ev0iFDhhRa39O6+7gtVYWI+ddf165dL11//fXnAWDGjBmnli1b1hnAb7W137oZqMlkKh49evQ5Nzc3DBgw4MKiRYsC7dVJTk5u/dRTT3X/+uuvs1q3bq3bt29vn5CQ4Lts2bKuAFBSUiLZ2dmeADBixIhzXbp0qXbIbNCgQcU5OTmt33zzTf+xY8eetT33008/+Xz00UfZADBp0qTCmTNnepw6dcp9586dPhs3bswGgKlTp5594IEHygFg69atPikpKW1jY2MjAODixYtunTt3vuKunVqTHRExAXgdQBdVjRaRfgAmqeqiWqrmAOhhc9wdQF51F6vqDhHpIyKd6lqXiMjZtdSJx6eKT9ndNbu68vrw9PSsTCDc3d21uLi4Msny8fGpAABVlb59+xb//PPPGVXrf/311wf+85//+Gze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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"hidden": true
},
"cell_type": "markdown",
"source": "Similarly, `GridSearch` models appear along the trade-off curve between AUC and equalized odds difference."
},
{
"metadata": {
"trusted": true,
"hidden": true
},
"cell_type": "code",
"source": "# Compare GridSearch models with low values of equalized odds difference with the previously constructed models\ngrid_search_dict = {\"GridSearch_{}\".format(i): (sweep_preds[i], sweep_scores[i])\n for i in range(len(sweep_preds))\n if non_dominated[i] and equalized_odds_sweep[i]<0.1}\nmodels_dict.update(grid_search_dict)\nget_metrics_df(models_dict, Y_test, A_str_test)",
"execution_count": 31,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unmitigated</th>\n <th>ThresholdOptimizer</th>\n <th>GridSearch_39</th>\n <th>GridSearch_40</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Overall selection rate</th>\n <td>0.268111</td>\n <td>0.080778</td>\n <td>0.268667</td>\n <td>0.256</td>\n </tr>\n <tr>\n <th>Demographic parity difference</th>\n <td>0.051105</td>\n <td>0.005265</td>\n <td>0.020546</td>\n <td>0.03327</td>\n </tr>\n <tr>\n <th>Demographic parity ratio</th>\n <td>0.8225</td>\n <td>0.937323</td>\n <td>0.926947</td>\n <td>0.87962</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n <tr>\n <th>Overall balanced error rate</th>\n <td>0.220682</td>\n <td>0.406107</td>\n <td>0.264572</td>\n <td>0.273208</td>\n </tr>\n <tr>\n <th>Balanced error rate difference</th>\n <td>0.175789</td>\n <td>0.007486</td>\n <td>0.066646</td>\n <td>0.040527</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n <tr>\n <th>False positive rate difference</th>\n <td>0.009296</td>\n <td>0.002053</td>\n <td>0.034358</td>\n <td>0.035793</td>\n </tr>\n <tr>\n <th>False negative rate difference</th>\n <td>0.342283</td>\n <td>0.012919</td>\n <td>0.098935</td>\n <td>0.045262</td>\n </tr>\n <tr>\n <th>Equalized odds difference</th>\n <td>0.342283</td>\n <td>0.012919</td>\n <td>0.098935</td>\n <td>0.045262</td>\n </tr>\n <tr>\n <th>------</th>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n <tr>\n <th>Overall AUC</th>\n <td>0.851931</td>\n <td>0.593893</td>\n <td>0.805242</td>\n <td>0.799174</td>\n </tr>\n <tr>\n <th>AUC difference</th>\n <td>0.189712</td>\n <td>0.007486</td>\n <td>0.062807</td>\n <td>0.055957</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " Unmitigated ThresholdOptimizer GridSearch_39 \\\nOverall selection rate 0.268111 0.080778 0.268667 \nDemographic parity difference 0.051105 0.005265 0.020546 \nDemographic parity ratio 0.8225 0.937323 0.926947 \n------ \nOverall balanced error rate 0.220682 0.406107 0.264572 \nBalanced error rate difference 0.175789 0.007486 0.066646 \n ------ \nFalse positive rate difference 0.009296 0.002053 0.034358 \nFalse negative rate difference 0.342283 0.012919 0.098935 \nEqualized odds difference 0.342283 0.012919 0.098935 \n ------ \nOverall AUC 0.851931 0.593893 0.805242 \nAUC difference 0.189712 0.007486 0.062807 \n\n GridSearch_40 \nOverall selection rate 0.256 \nDemographic parity difference 0.03327 \nDemographic parity ratio 0.87962 \n------ \nOverall balanced error rate 0.273208 \nBalanced error rate difference 0.040527 \n ------ \nFalse positive rate difference 0.035793 \nFalse negative rate difference 0.045262 \nEqualized odds difference 0.045262 \n ------ \nOverall AUC 0.799174 \nAUC difference 0.055957 "
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Conclusion"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "In this notebook, we explored how a fairness-unaware gradient boosted trees model performed on the classification task in contrast to the postprocessed `ThresholdOptimizer` model and the `GridSearch` model. The `ThresholdOptimizer` greatly reduced the disparity in performance across multiple fairness metrics. However the overall error rate and AUC for the `ThresholdOptimizer` model were worse compared to the fairness-unaware model. \n\nWith the `GridSearch` algorithm, we trained multiple models that balance the trade-off between the balanced accuracy and the equalized odds fairness metric. After engaging with relevant stakeholders, the data scientist can deploy the model that balances the performance-fairness trade-off that meets the needs of the business."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.7.10",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"base_numbering": 1,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"gist": {
"id": "bb49271a23f6a5b168b692e0c9c473e2",
"data": {
"description": "git_repos/fairlearn/notebooks/Binary Classification with the UCI Credit-card Default Dataset.ipynb",
"public": true
}
},
"_draft": {
"nbviewer_url": "https://gist.github.com/bb49271a23f6a5b168b692e0c9c473e2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment