{ "cells": [ { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import sys\n", "sys.path.append(\"../\")\n", "from aif360.datasets import BinaryLabelDataset\n", "from aif360.datasets import AdultDataset, GermanDataset, CompasDataset\n", "from aif360.metrics import BinaryLabelDatasetMetric\n", "from aif360.metrics import ClassificationMetric\n", "from aif360.metrics.utils import compute_boolean_conditioning_vector\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.preprocessing import StandardScaler, MaxAbsScaler\n", "from sklearn.metrics import accuracy_score\n", "\n", "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult, load_preproc_data_compas, load_preproc_data_german\n", "\n", "from aif360.algorithms.inprocessing.meta_fair_classifier import MetaFairClassifier\n", "from aif360.algorithms.inprocessing.celisMeta.utils import getStats\n", "from IPython.display import Markdown, display\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/markdown": [ "### Meta-Algorithm for fair classification." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "The fairness metrics to be optimized have to specified as \"input\". Currently we can handle the following fairness metrics." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "Statistical Rate, False Positive Rate, True Positive Rate, False Negative Rate, True Negative Rate," ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "Accuracy Rate, False Discovery Rate, False Omission Rate, Positive Predictive Rate, Negative Predictive Rate." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "#### -----------------------------" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "The example below considers the case of False Discovery Parity." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Markdown(\"### Meta-Algorithm for fair classification.\"))\n", "display(Markdown(\"The fairness metrics to be optimized have to specified as \\\"input\\\". Currently we can handle the following fairness metrics.\"))\n", "display(Markdown(\"Statistical Rate, False Positive Rate, True Positive Rate, False Negative Rate, True Negative Rate,\"))\n", "display(Markdown(\"Accuracy Rate, False Discovery Rate, False Omission Rate, Positive Predictive Rate, Negative Predictive Rate.\"))\n", "display(Markdown(\"#### -----------------------------\"))\n", "display(Markdown(\"The example below considers the case of False Discovery Parity.\"))\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "dataset_orig = load_preproc_data_adult()\n", "\n", "privileged_groups = [{'sex': 1}]\n", "unprivileged_groups = [{'sex': 0}]\n", "\n", "dataset_orig_train, dataset_orig_test = dataset_orig.split([0.7], shuffle=True)\n" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/markdown": [ "#### Training Dataset shape" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "(34189, 18)\n" ] }, { "data": { "text/markdown": [ "#### Favorable and unfavorable labels" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "(1.0, 0.0)\n" ] }, { "data": { "text/markdown": [ "#### Protected attribute names" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "['sex', 'race']\n" ] }, { "data": { "text/markdown": [ "#### Privileged and unprivileged protected attribute values" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "([array([1.]), array([1.])], [array([0.]), array([0.])])\n" ] }, { "data": { "text/markdown": [ "#### Dataset feature names" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "['race', 'sex', 'Age (decade)=10', 'Age (decade)=20', 'Age (decade)=30', 'Age (decade)=40', 'Age (decade)=50', 'Age (decade)=60', 'Age (decade)=>=70', 'Education Years=6', 'Education Years=7', 'Education Years=8', 'Education Years=9', 'Education Years=10', 'Education Years=11', 'Education Years=12', 'Education Years=<6', 'Education Years=>12']\n" ] } ], "source": [ "display(Markdown(\"#### Training Dataset shape\"))\n", "print(dataset_orig_train.features.shape)\n", "display(Markdown(\"#### Favorable and unfavorable labels\"))\n", "print(dataset_orig_train.favorable_label, dataset_orig_train.unfavorable_label)\n", "display(Markdown(\"#### Protected attribute names\"))\n", "print(dataset_orig_train.protected_attribute_names)\n", "display(Markdown(\"#### Privileged and unprivileged protected attribute values\"))\n", "print(dataset_orig_train.privileged_protected_attributes, \n", " dataset_orig_train.unprivileged_protected_attributes)\n", "display(Markdown(\"#### Dataset feature names\"))\n", "print(dataset_orig_train.feature_names)\n" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "#### Training Dataset shape" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "(34189, 18)\n" ] }, { "data": { "text/markdown": [ "#### Favorable and unfavorable labels" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "(1.0, 0.0)\n" ] }, { "data": { "text/markdown": [ "#### Protected attribute names" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "['sex', 'race']\n" ] }, { "data": { "text/markdown": [ "#### Privileged and unprivileged protected attribute values" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "([array([1.]), array([1.])], [array([0.]), array([0.])])\n" ] }, { "data": { "text/markdown": [ "#### Dataset feature names" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "['race', 'sex', 'Age (decade)=10', 'Age (decade)=20', 'Age (decade)=30', 'Age (decade)=40', 'Age (decade)=50', 'Age (decade)=60', 'Age (decade)=>=70', 'Education Years=6', 'Education Years=7', 'Education Years=8', 'Education Years=9', 'Education Years=10', 'Education Years=11', 'Education Years=12', 'Education Years=<6', 'Education Years=>12']\n" ] } ], "source": [ "display(Markdown(\"#### Training Dataset shape\"))\n", "print(dataset_orig_train.features.shape)\n", "display(Markdown(\"#### Favorable and unfavorable labels\"))\n", "print(dataset_orig_train.favorable_label, dataset_orig_train.unfavorable_label)\n", "display(Markdown(\"#### Protected attribute names\"))\n", "print(dataset_orig_train.protected_attribute_names)\n", "display(Markdown(\"#### Privileged and unprivileged protected attribute values\"))\n", "print(dataset_orig_train.privileged_protected_attributes, \n", " dataset_orig_train.unprivileged_protected_attributes)\n", "display(Markdown(\"#### Dataset feature names\"))\n", "print(dataset_orig_train.feature_names)\n" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train set: Difference in mean outcomes between unprivileged and privileged groups = -0.193944\n", "Test set: Difference in mean outcomes between unprivileged and privileged groups = -0.195913\n", "Train set: Difference in mean outcomes between unprivileged and privileged groups = -0.193944\n", "Test set: Difference in mean outcomes between unprivileged and privileged groups = -0.195913\n" ] } ], "source": [ "metric_orig_train = BinaryLabelDatasetMetric(dataset_orig_train, \n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "#display(Markdown(\"#### Original training dataset\"))\n", "print(\"Train set: Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_orig_train.mean_difference())\n", "metric_orig_test = BinaryLabelDatasetMetric(dataset_orig_test, \n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "print(\"Test set: Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_orig_test.mean_difference())\n", "\n", "\n", "\n", "\n", "min_max_scaler = MaxAbsScaler()\n", "dataset_orig_train.features = min_max_scaler.fit_transform(dataset_orig_train.features)\n", "dataset_orig_test.features = min_max_scaler.transform(dataset_orig_test.features)\n", "metric_scaled_train = BinaryLabelDatasetMetric(dataset_orig_train, \n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "#display(Markdown(\"#### Scaled dataset - Verify that the scaling does not affect the group label statistics\"))\n", "print(\"Train set: Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_scaled_train.mean_difference())\n", "metric_scaled_test = BinaryLabelDatasetMetric(dataset_orig_test, \n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "print(\"Test set: Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_scaled_test.mean_difference())\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get classifier without fairness constraints\n", "biased_model = MetaFairClassifier(tau=0, sensitive_attr=\"sex\")\n", "biased_model.fit(dataset_orig_train)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Accuracy : ', 3148, 14653, 0.7851634477581383)\n", "('SR tau : ', 0.5128381178595508)\n", "('FPR tau : ', 0.7945499159671334)\n", "('FNR tau : ', 0.910501272336843)\n", "('TPR tau : ', 0.7721613485851896)\n", "('TNR tau : ', 0.986749402037707)\n", "('AR tau : ', 0.8525978220135617)\n", "('FDR tau : ', 0.5030017152658662)\n", "('FOR tau : ', 0.3717552930362757)\n", "('PPR tau : ', 0.5485001947798986)\n", "('NPR tau : ', 0.827615343560593)\n", "0.503001715266\n" ] } ], "source": [ "# Apply the unconstrained model to test data\n", "dataset_bias_test = biased_model.predict(dataset_orig_test)\n", "\n", "predictions = [1 if y == dataset_orig_train.favorable_label else -1 for y in list(dataset_bias_test.labels)]\n", "y_test = np.array([1 if y == [dataset_orig_train.favorable_label] else -1 for y in dataset_orig_test.labels])\n", "x_control_test = pd.DataFrame(data=dataset_orig_test.features, columns=dataset_orig_test.feature_names)[\"sex\"]\n", "\n", "acc, sr, unconstrainedFDR = getStats(y_test, predictions, x_control_test)\n", "print(unconstrainedFDR)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Training Accuracy: ', 0.7350317353534763, ', Training gamma: ', 0.672899406837947)\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Learn debiased classifier\n", "tau = 0.8\n", "debiased_model = MetaFairClassifier(tau=tau, sensitive_attr=\"sex\")\n", "debiased_model.fit(dataset_orig_train)\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# Apply the debiased model to test data\n", "dataset_debiasing_train = debiased_model.predict(dataset_orig_train)\n", "dataset_debiasing_test = debiased_model.predict(dataset_orig_test)\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "#### Model - with debiasing - dataset metrics" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Train set: Difference in mean outcomes between unprivileged and privileged groups = -0.201319\n", "Test set: Difference in mean outcomes between unprivileged and privileged groups = -0.195210\n" ] } ], "source": [ "# Metrics for the dataset from model with debiasing\n", "display(Markdown(\"#### Model - with debiasing - dataset metrics\"))\n", "metric_dataset_debiasing_train = BinaryLabelDatasetMetric(dataset_debiasing_train, \n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "\n", "print(\"Train set: Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_dataset_debiasing_train.mean_difference())\n", "\n", "metric_dataset_debiasing_test = BinaryLabelDatasetMetric(dataset_debiasing_test, \n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "\n", "print(\"Test set: Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_dataset_debiasing_test.mean_difference())\n" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "#### Model - with debiasing - classification metrics" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Test set: Classification accuracy = 0.731932\n", "Test set: Balanced classification accuracy = 0.716763\n", "Test set: Disparate impact = 0.539856\n", "Test set: Equal opportunity difference = -0.120467\n", "Test set: Average odds difference = -0.117636\n", "Test set: Theil_index = 0.128652\n" ] } ], "source": [ "display(Markdown(\"#### Model - with debiasing - classification metrics\"))\n", "classified_metric_debiasing_test = ClassificationMetric(dataset_orig_test, \n", " dataset_debiasing_test,\n", " unprivileged_groups=unprivileged_groups,\n", " privileged_groups=privileged_groups)\n", "print(\"Test set: Classification accuracy = %f\" % classified_metric_debiasing_test.accuracy())\n", "TPR = classified_metric_debiasing_test.true_positive_rate()\n", "TNR = classified_metric_debiasing_test.true_negative_rate()\n", "bal_acc_debiasing_test = 0.5*(TPR+TNR)\n", "print(\"Test set: Balanced classification accuracy = %f\" % bal_acc_debiasing_test)\n", "print(\"Test set: Disparate impact = %f\" % classified_metric_debiasing_test.disparate_impact())\n", "print(\"Test set: Equal opportunity difference = %f\" % classified_metric_debiasing_test.equal_opportunity_difference())\n", "print(\"Test set: Average odds difference = %f\" % classified_metric_debiasing_test.average_odds_difference())\n", "print(\"Test set: Theil_index = %f\" % classified_metric_debiasing_test.theil_index())\n" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Accuracy : ', 3928, 14653, 0.7319320275711458)\n", "('SR tau : ', 0.5398556890759312)\n", "('FPR tau : ', 0.6157226437750696)\n", "('FNR tau : ', 0.7093999136230463)\n", "('TPR tau : ', 0.8293479564733099)\n", "('TNR tau : ', 0.8593163406441414)\n", "('AR tau : ', 0.8892945217528149)\n", "('FDR tau : ', 0.6832866118898019)\n", "('FOR tau : ', 0.3834976405176844)\n", "('PPR tau : ', 0.5596391928376183)\n", "('NPR tau : ', 0.8967236467236467)\n", "(0.6832866118898019, 0.5030017152658662)\n" ] } ], "source": [ "### Testing \n", "predictions = list(dataset_debiasing_test.labels)\n", "predictions = [1 if y == dataset_orig_train.favorable_label else -1 for y in predictions]\n", "y_test = np.array([1 if y == [dataset_orig_train.favorable_label] else -1 for y in dataset_orig_test.labels])\n", "x_control_test = pd.DataFrame(data=dataset_orig_test.features, columns=dataset_orig_test.feature_names)[\"sex\"]\n", "\n", "acc, sr, fdr = getStats(y_test, predictions, x_control_test)\n", "print(fdr, unconstrainedFDR)\n", "assert(fdr >= unconstrainedFDR)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "biased_model = MetaFairClassifier(tau=0, sensitive_attr=\"race\")\n", "biased_model.fit(dataset_orig_train)\n", "\n", "dataset_bias_test = biased_model.predict(dataset_orig_test)\n", "\n", "predictions = [1 if y == dataset_orig_train.favorable_label else -1 for y in list(dataset_bias_test.labels)]\n", "y_test = np.array([1 if y == [dataset_orig_train.favorable_label] else -1 for y in dataset_orig_test.labels])\n", "x_control_test = pd.DataFrame(data=dataset_orig_test.features, columns=dataset_orig_test.feature_names)[\"race\"]\n", "\n", "acc, sr, unconstrainedFDR = getStats(y_test, predictions, x_control_test)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "#### Running the algorithm for different tau values" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Tau: 0.10\n", "('Training Accuracy: ', 0.59007283044254, ', Training gamma: ', 0.8471557184765197)\n", "('Accuracy : ', 6015, 14653, 0.5895038558656931)\n", "('SR tau : ', 0.8607089248858592)\n", "('FPR tau : ', 0.8957864358026685)\n", "('FNR tau : ', 0.9194857234907978)\n", "('TPR tau : ', 0.9919093179930415)\n", "('TNR tau : ', 0.8974125546638897)\n", "('AR tau : ', 0.9991230759162755)\n", "('FDR tau : ', 0.8457246400235614)\n", "('FOR tau : ', 0.5351545846135752)\n", "('PPR tau : ', 0.6980432406212983)\n", "('NPR tau : ', 0.972325603734294)\n", "Tau: 0.20\n", "('Training Accuracy: ', 0.7089122232296938, ', Training gamma: ', 0.8560547557579788)\n", "('Accuracy : ', 4219, 14653, 0.7120726131167678)\n", "('SR tau : ', 0.6866930102717664)\n", "('FPR tau : ', 0.6726467708167688)\n", "('FNR tau : ', 0.9258698009067614)\n", "('TPR tau : ', 0.9788702965603217)\n", "('TNR tau : ', 0.8609042092761701)\n", "('AR tau : ', 0.9016318454549019)\n", "('FDR tau : ', 0.8985716754370806)\n", "('FOR tau : ', 0.5212835077229696)\n", "('PPR tau : ', 0.8634340785883854)\n", "('NPR tau : ', 0.9509873699572469)\n", "Tau: 0.30\n", "('Training Accuracy: ', 0.7305566117757174, ', Training gamma: ', 0.8652540142403449)\n", "('Accuracy : ', 3971, 14653, 0.7289974749198116)\n", "('SR tau : ', 0.6378556299285792)\n", "('FPR tau : ', 0.6258949415833267)\n", "('FNR tau : ', 0.8021281808953761)\n", "('TPR tau : ', 0.9157061270745418)\n", "('TNR tau : ', 0.8661540136913607)\n", "('AR tau : ', 0.9010399037361635)\n", "('FDR tau : ', 0.8970117068060988)\n", "('FOR tau : ', 0.6040206475603341)\n", "('PPR tau : ', 0.8695616726701354)\n", "('NPR tau : ', 0.9531107873071419)\n", "Tau: 0.40\n", "('Training Accuracy: ', 0.6383339670654304, ', Training gamma: ', 0.8874069404811007)\n", "('Accuracy : ', 5277, 14653, 0.6398689688118474)\n", "('SR tau : ', 0.6738297875613554)\n", "('FPR tau : ', 0.644122920953404)\n", "('FNR tau : ', 0.7865711339087011)\n", "('TPR tau : ', 0.9673632005976219)\n", "('TNR tau : ', 0.7621665735103976)\n", "('AR tau : ', 0.8627152073258121)\n", "('FDR tau : ', 0.9207857965052172)\n", "('FOR tau : ', 0.5333710407239819)\n", "('PPR tau : ', 0.869572944869857)\n", "('NPR tau : ', 0.9685594512195121)\n", "Tau: 0.50\n", "('Training Accuracy: ', 0.6278920120506596, ', Training gamma: ', 0.8424560564810398)\n", "('Accuracy : ', 5474, 14653, 0.6264246229441071)\n", "('SR tau : ', 0.8298481425555508)\n", "('FPR tau : ', 0.8569955013034397)\n", "('FNR tau : ', 0.928239074324443)\n", "('TPR tau : ', 0.9916079407319798)\n", "('TNR tau : ', 0.8873302430084463)\n", "('AR tau : ', 0.9673097194084582)\n", "('FDR tau : ', 0.8523093321100546)\n", "('FOR tau : ', 0.4555634964843873)\n", "('PPR tau : ', 0.7360851226839791)\n", "('NPR tau : ', 0.9639178758413839)\n", "Tau: 0.60\n", "('Training Accuracy: ', 0.688964286758899, ', Training gamma: ', 0.8364392682037156)\n", "('Accuracy : ', 4525, 14653, 0.6911895175049478)\n", "('SR tau : ', 0.7999629846862536)\n", "('FPR tau : ', 0.8174527554362845)\n", "('FNR tau : ', 0.7909665888208081)\n", "('TPR tau : ', 0.953958901547282)\n", "('TNR tau : ', 0.9070827451204897)\n", "('AR tau : ', 0.9394597060776729)\n", "('FDR tau : ', 0.8613593842228706)\n", "('FOR tau : ', 0.4055043530080791)\n", "('PPR tau : ', 0.7937196009266697)\n", "('NPR tau : ', 0.9433076267447764)\n", "Tau: 0.70\n", "('Training Accuracy: ', 0.758694316885548, ', Training gamma: ', 0.8794270410853803)\n", "('Accuracy : ', 3569, 14653, 0.7564321299392616)\n", "('SR tau : ', 0.6227876622165098)\n", "('FPR tau : ', 0.5866903792182638)\n", "('FNR tau : ', 0.9190407482450215)\n", "('TPR tau : ', 0.9560780895648338)\n", "('TNR tau : ', 0.890147909980094)\n", "('AR tau : ', 0.896234124640508)\n", "('FDR tau : ', 0.9343469954055406)\n", "('FOR tau : ', 0.5509667897652915)\n", "('PPR tau : ', 0.9298652703704154)\n", "('NPR tau : ', 0.9372291956457304)\n", "Tau: 0.80\n", "('Training Accuracy: ', 0.7235953084325368, ', Training gamma: ', 0.8054119984862806)\n", "('Accuracy : ', 4059, 14653, 0.7229918787961509)\n", "('SR tau : ', 0.854029993599877)\n", "('FPR tau : ', 0.8938353737389849)\n", "('FNR tau : ', 0.6857428917603186)\n", "('TPR tau : ', 0.9027407287653024)\n", "('TNR tau : ', 0.9581570773154029)\n", "('AR tau : ', 0.9535764486010664)\n", "('FDR tau : ', 0.8409937049267278)\n", "('FOR tau : ', 0.37742963089855464)\n", "('PPR tau : ', 0.7856525093953137)\n", "('NPR tau : ', 0.9281236852587971)\n", "Tau: 0.90\n", "('Training Accuracy: ', 0.7241217935593319, ', Training gamma: ', 0.8099147766891792)\n", "('Accuracy : ', 4051, 14653, 0.7235378420801202)\n", "('SR tau : ', 0.8381936758377602)\n", "('FPR tau : ', 0.8732228179504548)\n", "('FNR tau : ', 0.7206111743921992)\n", "('TPR tau : ', 0.9125888094427421)\n", "('TNR tau : ', 0.9504356649707367)\n", "('AR tau : ', 0.9489248561688661)\n", "('FDR tau : ', 0.8448827898766063)\n", "('FOR tau : ', 0.39272980229352533)\n", "('PPR tau : ', 0.791857698925242)\n", "('NPR tau : ', 0.9297660413700446)\n" ] } ], "source": [ "display(Markdown(\"#### Running the algorithm for different tau values\"))\n", "\n", "accuracies, false_discovery_rates, statistical_rates = [], [], []\n", "s_attr = \"race\"\n", "# Converting to form used by celisMeta.utils file\n", "y_test = np.array([1 if y == [dataset_orig_train.favorable_label] else -1 for y in dataset_orig_test.labels])\n", "x_control_test = pd.DataFrame(data=dataset_orig_test.features, columns=dataset_orig_test.feature_names)[s_attr]\n", "\n", "all_tau = np.linspace(0.1, 0.9, 9)\n", "for tau in all_tau:\n", " print(\"Tau: %.2f\" % tau)\n", " debiased_model = MetaFairClassifier(tau=tau, sensitive_attr=s_attr)\n", " debiased_model.fit(dataset_orig_train)\n", " \n", " dataset_debiasing_test = debiased_model.predict(dataset_orig_test)\n", " predictions = dataset_debiasing_test.labels\n", " predictions = [1 if y == dataset_orig_train.favorable_label else -1 for y in predictions]\n", " \n", " acc, sr, fdr = getStats(y_test, predictions, x_control_test)\n", " \n", " ## Testing\n", " assert (tau < unconstrainedFDR) or (fdr >= unconstrainedFDR)\n", " \n", " accuracies.append(acc)\n", " false_discovery_rates.append(fdr)\n", " statistical_rates.append(sr)\n", " " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "### Plot of accuracy and output fairness vs input constraint (tau)" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "#### Output fairness is represented by $\\gamma_{fdr}$, which is the ratio of false discovery rate of different sensitive attribute values." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "display(Markdown(\"### Plot of accuracy and output fairness vs input constraint (tau)\"))\n", "\n", "display(Markdown(\"#### Output fairness is represented by $\\gamma_{fdr}$, which is the ratio of false discovery rate of different sensitive attribute values.\"))\n", "\n", "fig, ax1 = plt.subplots(figsize=(13,7))\n", "ax1.plot(all_tau, accuracies, color='r')\n", "ax1.set_title('Accuracy and $\\gamma_{fdr}$ vs Tau', fontsize=16, fontweight='bold')\n", "ax1.set_xlabel('Input Tau', fontsize=16, fontweight='bold')\n", "ax1.set_ylabel('Accuracy', color='r', fontsize=16, fontweight='bold')\n", "ax1.xaxis.set_tick_params(labelsize=14)\n", "ax1.yaxis.set_tick_params(labelsize=14)\n", "\n", "ax2 = ax1.twinx()\n", "ax2.plot(all_tau, false_discovery_rates, color='b')\n", "ax2.set_ylabel('$\\gamma_{fdr}$', color='b', fontsize=16, fontweight='bold')\n", "ax2.yaxis.set_tick_params(labelsize=14)\n", "ax2.grid(True)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# # \n", "# References:\n", "# Celis, L. E., Huang, L., Keswani, V., & Vishnoi, N. K. (2018). \n", "# \"Classification with Fairness Constraints: A Meta-Algorithm with Provable Guarantees.\"\"\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" } }, "nbformat": 4, "nbformat_minor": 2 }