diff --git a/examples/demo_optim_data_preproc.ipynb b/examples/demo_optim_data_preproc.ipynb index 16273a7c..2c8ce616 100644 --- a/examples/demo_optim_data_preproc.ipynb +++ b/examples/demo_optim_data_preproc.ipynb @@ -1,757 +1,1382 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### This notebook demonstrates the use of an optimized data pre-processing algorithm for bias mitigation\n", - "\n", - "- The debiasing function used is implemented in the `OptimPreproc` class.\n", - "- Define parameters for optimized pre-processing specific to the dataset.\n", - "- Divide the dataset into training, validation, and testing partitions.\n", - "- Learn the optimized pre-processing transformation from the training data.\n", - "- Train classifier on original training data.\n", - "- Estimate the optimal classification threshold, that maximizes balanced accuracy without fairness constraints (from the original validation set).\n", - "- Determine the prediction scores for original testing data. Using the estimated optimal classification threshold, compute accuracy and fairness metrics.\n", - "- Transform the testing set using the learned probabilistic transformation.\n", - "- Determine the prediction scores for transformed testing data. Using the estimated optimal classification threshold, compute accuracy and fairness metrics.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "# Load all necessary packages\n", - "import sys\n", - "sys.path.append(\"../\")\n", - "import numpy as np\n", - "from tqdm import tqdm\n", - "\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 aif360.algorithms.preprocessing.optim_preproc import OptimPreproc\n", - "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions\\\n", - " import load_preproc_data_adult, load_preproc_data_german, load_preproc_data_compas\n", - "from aif360.algorithms.preprocessing.optim_preproc_helpers.distortion_functions\\\n", - " import get_distortion_adult, get_distortion_german, get_distortion_compas\n", - "from aif360.algorithms.preprocessing.optim_preproc_helpers.opt_tools import OptTools\n", - "from common_utils import compute_metrics\n", - "\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.metrics import accuracy_score\n", - "\n", - "from IPython.display import Markdown, display\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Load dataset and specify options" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# import dataset\n", - "dataset_used = \"adult\" # \"adult\", \"german\", \"compas\"\n", - "protected_attribute_used = 1 # 1, 2\n", - "\n", - "if dataset_used == \"adult\":\n", - " if protected_attribute_used == 1:\n", - " privileged_groups = [{'sex': 1}]\n", - " unprivileged_groups = [{'sex': 0}]\n", - " dataset_orig = load_preproc_data_adult(['sex'])\n", - " else:\n", - " privileged_groups = [{'race': 1}]\n", - " unprivileged_groups = [{'race': 0}]\n", - " dataset_orig = load_preproc_data_adult(['race'])\n", - " \n", - " optim_options = {\n", - " \"distortion_fun\": get_distortion_adult,\n", - " \"epsilon\": 0.05,\n", - " \"clist\": [0.99, 1.99, 2.99],\n", - " \"dlist\": [.1, 0.05, 0]\n", - " }\n", - " \n", - "elif dataset_used == \"german\":\n", - " if protected_attribute_used == 1:\n", - " privileged_groups = [{'sex': 1}]\n", - " unprivileged_groups = [{'sex': 0}]\n", - " dataset_orig = load_preproc_data_german(['sex'])\n", - " optim_options = {\n", - " \"distortion_fun\": get_distortion_german,\n", - " \"epsilon\": 0.05,\n", - " \"clist\": [0.99, 1.99, 2.99],\n", - " \"dlist\": [.1, 0.05, 0]\n", - " }\n", - " \n", - " else:\n", - " privileged_groups = [{'age': 1}]\n", - " unprivileged_groups = [{'age': 0}]\n", - " dataset_orig = load_preproc_data_german(['age'])\n", - " optim_options = {\n", - " \"distortion_fun\": get_distortion_german,\n", - " \"epsilon\": 0.1,\n", - " \"clist\": [0.99, 1.99, 2.99],\n", - " \"dlist\": [.1, 0.05, 0]\n", - " } \n", - "\n", - "elif dataset_used == \"compas\":\n", - " if protected_attribute_used == 1:\n", - " privileged_groups = [{'sex': 1}]\n", - " unprivileged_groups = [{'sex': 0}]\n", - " dataset_orig = load_preproc_data_compas(['sex'])\n", - " else:\n", - " privileged_groups = [{'race': 1}]\n", - " unprivileged_groups = [{'race': 0}]\n", - " dataset_orig = load_preproc_data_compas(['race'])\n", - " \n", - " optim_options = {\n", - " \"distortion_fun\": get_distortion_compas,\n", - " \"epsilon\": 0.05,\n", - " \"clist\": [0.99, 1.99, 2.99],\n", - " \"dlist\": [.1, 0.05, 0]\n", - " }\n", - "\n", - "#random seed\n", - "np.random.seed(1)\n", - "\n", - "# Split into train, validation, and test\n", - "dataset_orig_train, dataset_orig_vt = dataset_orig.split([0.7], shuffle=True)\n", - "dataset_orig_valid, dataset_orig_test = dataset_orig_vt.split([0.5], shuffle=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Display dataset attributes" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/markdown": [ - "#### Training Dataset shape" + "cells": [ + { + "cell_type": "markdown", + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Trusted-AI/AIF360/blob/master/examples/demo_optim_data_preproc.ipynb)" + ], + "metadata": { + "id": "QFkbHA0zIQ92" + } + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DVW01MmV9bJL" + }, + "source": [ + "#### This notebook demonstrates the use of an optimized data pre-processing algorithm for bias mitigation\n", + "\n", + "- The debiasing function used is implemented in the `OptimPreproc` class.\n", + "- Define parameters for optimized pre-processing specific to the dataset.\n", + "- Divide the dataset into training, validation, and testing partitions.\n", + "- Learn the optimized pre-processing transformation from the training data.\n", + "- Train classifier on original training data.\n", + "- Estimate the optimal classification threshold, that maximizes balanced accuracy without fairness constraints (from the original validation set).\n", + "- Determine the prediction scores for original testing data. Using the estimated optimal classification threshold, compute accuracy and fairness metrics.\n", + "- Transform the testing set using the learned probabilistic transformation.\n", + "- Determine the prediction scores for transformed testing data. Using the estimated optimal classification threshold, compute accuracy and fairness metrics.\n" + ] + }, + { + "cell_type": "code", + "source": [ + "# Install necessary libraries\n", + "!pip install 'aif360'\n", + "!pip install 'aif360[LawSchoolGPA]'\n", + "!pip install 'aif360[Reductions]'" + ], + "metadata": { + "id": "7EzTKEyS9h4z", + "outputId": "8ccff2fc-92db-4228-d80b-a71901342a2f", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting aif360\n", + " Downloading aif360-0.5.0-py3-none-any.whl (214 kB)\n", + "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/214.1 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[91m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m112.6/214.1 kB\u001b[0m \u001b[31m3.1 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m214.1/214.1 kB\u001b[0m \u001b[31m4.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: numpy>=1.16 in /usr/local/lib/python3.10/dist-packages (from aif360) (1.23.5)\n", + "Requirement already satisfied: scipy>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from aif360) (1.11.2)\n", + "Requirement already satisfied: pandas>=0.24.0 in /usr/local/lib/python3.10/dist-packages (from aif360) (1.5.3)\n", + "Requirement already satisfied: scikit-learn>=1.0 in /usr/local/lib/python3.10/dist-packages (from aif360) (1.2.2)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from aif360) (3.7.1)\n", + "Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24.0->aif360) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24.0->aif360) (2023.3.post1)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0->aif360) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0->aif360) (3.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360) (3.1.1)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas>=0.24.0->aif360) (1.16.0)\n", + "Installing collected packages: aif360\n", + "Successfully installed aif360-0.5.0\n", + "Requirement already satisfied: aif360[LawSchoolGPA] in /usr/local/lib/python3.10/dist-packages (0.5.0)\n", + "Requirement already satisfied: numpy>=1.16 in /usr/local/lib/python3.10/dist-packages (from aif360[LawSchoolGPA]) (1.23.5)\n", + "Requirement already satisfied: scipy>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from aif360[LawSchoolGPA]) (1.11.2)\n", + "Requirement already satisfied: pandas>=0.24.0 in /usr/local/lib/python3.10/dist-packages (from aif360[LawSchoolGPA]) (1.5.3)\n", + "Requirement already satisfied: scikit-learn>=1.0 in /usr/local/lib/python3.10/dist-packages (from aif360[LawSchoolGPA]) (1.2.2)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from aif360[LawSchoolGPA]) (3.7.1)\n", + "Collecting tempeh (from aif360[LawSchoolGPA])\n", + " Downloading tempeh-0.1.12-py3-none-any.whl (39 kB)\n", + "Requirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24.0->aif360[LawSchoolGPA]) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24.0->aif360[LawSchoolGPA]) (2023.3.post1)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0->aif360[LawSchoolGPA]) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0->aif360[LawSchoolGPA]) (3.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[LawSchoolGPA]) (3.1.1)\n", + "Collecting memory-profiler (from tempeh->aif360[LawSchoolGPA])\n", + " Downloading memory_profiler-0.61.0-py3-none-any.whl (31 kB)\n", + "Requirement already satisfied: pytest in /usr/local/lib/python3.10/dist-packages (from tempeh->aif360[LawSchoolGPA]) (7.4.1)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from tempeh->aif360[LawSchoolGPA]) (2.31.0)\n", + "Collecting shap (from tempeh->aif360[LawSchoolGPA])\n", + " Downloading shap-0.42.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (547 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m547.9/547.9 kB\u001b[0m \u001b[31m20.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas>=0.24.0->aif360[LawSchoolGPA]) (1.16.0)\n", + "Requirement already satisfied: psutil in /usr/local/lib/python3.10/dist-packages (from memory-profiler->tempeh->aif360[LawSchoolGPA]) (5.9.5)\n", + "Requirement already satisfied: iniconfig in /usr/local/lib/python3.10/dist-packages (from pytest->tempeh->aif360[LawSchoolGPA]) (2.0.0)\n", + "Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.10/dist-packages (from pytest->tempeh->aif360[LawSchoolGPA]) (1.3.0)\n", + "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /usr/local/lib/python3.10/dist-packages (from pytest->tempeh->aif360[LawSchoolGPA]) (1.1.3)\n", + "Requirement already satisfied: tomli>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from pytest->tempeh->aif360[LawSchoolGPA]) (2.0.1)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->tempeh->aif360[LawSchoolGPA]) (3.2.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->tempeh->aif360[LawSchoolGPA]) (3.4)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->tempeh->aif360[LawSchoolGPA]) (2.0.4)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->tempeh->aif360[LawSchoolGPA]) (2023.7.22)\n", + "Requirement already satisfied: tqdm>=4.27.0 in /usr/local/lib/python3.10/dist-packages (from shap->tempeh->aif360[LawSchoolGPA]) (4.66.1)\n", + "Collecting slicer==0.0.7 (from shap->tempeh->aif360[LawSchoolGPA])\n", + " Downloading slicer-0.0.7-py3-none-any.whl (14 kB)\n", + "Requirement already satisfied: numba in /usr/local/lib/python3.10/dist-packages (from shap->tempeh->aif360[LawSchoolGPA]) (0.56.4)\n", + "Requirement already satisfied: cloudpickle in /usr/local/lib/python3.10/dist-packages (from shap->tempeh->aif360[LawSchoolGPA]) (2.2.1)\n", + "Requirement already satisfied: llvmlite<0.40,>=0.39.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba->shap->tempeh->aif360[LawSchoolGPA]) (0.39.1)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from numba->shap->tempeh->aif360[LawSchoolGPA]) (67.7.2)\n", + "Installing collected packages: slicer, memory-profiler, shap, tempeh\n", + "Successfully installed memory-profiler-0.61.0 shap-0.42.1 slicer-0.0.7 tempeh-0.1.12\n", + "Requirement already satisfied: aif360[Reductions] in /usr/local/lib/python3.10/dist-packages (0.5.0)\n", + "Requirement already satisfied: numpy>=1.16 in /usr/local/lib/python3.10/dist-packages (from aif360[Reductions]) (1.23.5)\n", + "Requirement already satisfied: scipy>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from aif360[Reductions]) (1.11.2)\n", + "Requirement already satisfied: pandas>=0.24.0 in /usr/local/lib/python3.10/dist-packages (from aif360[Reductions]) (1.5.3)\n", + "Requirement already satisfied: scikit-learn>=1.0 in /usr/local/lib/python3.10/dist-packages (from aif360[Reductions]) (1.2.2)\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from aif360[Reductions]) (3.7.1)\n", + "Collecting fairlearn~=0.7 (from aif360[Reductions])\n", + " Downloading fairlearn-0.9.0-py3-none-any.whl (231 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m231.5/231.5 kB\u001b[0m \u001b[31m3.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hRequirement already satisfied: python-dateutil>=2.8.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24.0->aif360[Reductions]) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=0.24.0->aif360[Reductions]) (2023.3.post1)\n", + "Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0->aif360[Reductions]) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn>=1.0->aif360[Reductions]) (3.2.0)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (1.1.0)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (1.4.5)\n", + "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (9.4.0)\n", + "Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->aif360[Reductions]) (3.1.1)\n", + "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.1->pandas>=0.24.0->aif360[Reductions]) (1.16.0)\n", + "Installing collected packages: fairlearn\n", + "Successfully installed fairlearn-0.9.0\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "import os\n", + "import aif360\n", + "\n", + "# Obtain the location where it is installed\n", + "LIB_PATH = aif360.__file__.rsplit(\"aif360\", 1)[0]\n", + "\n", + "# check if the data got download properly\n", + "def check_data_or_download(destn, files, data_source_directory):\n", + " check = all(item in os.listdir(destn) for item in files)\n", + " if check:\n", + " print(\"Adult dataset is available for us\")\n", + " else:\n", + " print(\"Some files are missing. Downloading now.\")\n", + " for data_file in files:\n", + " _ = urllib.request.urlretrieve(data_source_directory + data_file,\n", + " os.path.join(destn, data_file))\n", + "\n", + "# Download adult dataset\n", + "data_source_directory = \"https://archive.ics.uci.edu/ml/machine-learning-databases/adult/\"\n", + "destn = os.path.join(LIB_PATH, \"aif360\", \"data\", \"raw\", \"adult\")\n", + "files = [\"adult.data\", \"adult.test\", \"adult.names\"]\n", + "\n", + "check_data_or_download(destn, files, data_source_directory)" + ], + "metadata": { + "id": "kxlfn4ioFiHQ", + "outputId": "2bce72b8-0f76-4d8e-bb47-2d378c25e2de", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Some files are missing. Downloading now.\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "ieHTdhTE9bJM" + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Load all necessary packages\n", + "import sys\n", + "sys.path.append(\"../\")\n", + "import numpy as np\n", + "from tqdm import tqdm\n", + "\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 aif360.algorithms.preprocessing.optim_preproc import OptimPreproc\n", + "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions\\\n", + " import load_preproc_data_adult, load_preproc_data_german, load_preproc_data_compas\n", + "from aif360.algorithms.preprocessing.optim_preproc_helpers.distortion_functions\\\n", + " import get_distortion_adult, get_distortion_german, get_distortion_compas\n", + "from aif360.algorithms.preprocessing.optim_preproc_helpers.opt_tools import OptTools\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "from IPython.display import Markdown, display\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "source": [ + "# Metrics function\n", + "from collections import OrderedDict\n", + "from aif360.metrics import ClassificationMetric\n", + "\n", + "def compute_metrics(dataset_true, dataset_pred,\n", + " unprivileged_groups, privileged_groups,\n", + " disp = True):\n", + " \"\"\" Compute the key metrics \"\"\"\n", + " classified_metric_pred = ClassificationMetric(dataset_true,\n", + " dataset_pred,\n", + " unprivileged_groups=unprivileged_groups,\n", + " privileged_groups=privileged_groups)\n", + " metrics = OrderedDict()\n", + " metrics[\"Balanced accuracy\"] = 0.5*(classified_metric_pred.true_positive_rate()+\n", + " classified_metric_pred.true_negative_rate())\n", + " metrics[\"Statistical parity difference\"] = classified_metric_pred.statistical_parity_difference()\n", + " metrics[\"Disparate impact\"] = classified_metric_pred.disparate_impact()\n", + " metrics[\"Average odds difference\"] = classified_metric_pred.average_odds_difference()\n", + " metrics[\"Equal opportunity difference\"] = classified_metric_pred.equal_opportunity_difference()\n", + " metrics[\"Theil index\"] = classified_metric_pred.theil_index()\n", + "\n", + " if disp:\n", + " for k in metrics:\n", + " print(\"%s = %.4f\" % (k, metrics[k]))\n", + "\n", + " return metrics" ], - "text/plain": [ - "" + "metadata": { + "id": "uGmzNDyTCat9" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8-usF1IA9bJN" + }, + "source": [ + "#### Load dataset and specify options" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "(34189, 18)\n" - ] + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "RrThA70U9bJO" + }, + "outputs": [], + "source": [ + "# import dataset\n", + "dataset_used = \"adult\" # \"adult\", \"german\", \"compas\"\n", + "protected_attribute_used = 1 # 1, 2\n", + "\n", + "if dataset_used == \"adult\":\n", + " if protected_attribute_used == 1:\n", + " privileged_groups = [{'sex': 1}]\n", + " unprivileged_groups = [{'sex': 0}]\n", + " dataset_orig = load_preproc_data_adult(['sex'])\n", + " else:\n", + " privileged_groups = [{'race': 1}]\n", + " unprivileged_groups = [{'race': 0}]\n", + " dataset_orig = load_preproc_data_adult(['race'])\n", + "\n", + " optim_options = {\n", + " \"distortion_fun\": get_distortion_adult,\n", + " \"epsilon\": 0.05,\n", + " \"clist\": [0.99, 1.99, 2.99],\n", + " \"dlist\": [.1, 0.05, 0]\n", + " }\n", + "\n", + "elif dataset_used == \"german\":\n", + " if protected_attribute_used == 1:\n", + " privileged_groups = [{'sex': 1}]\n", + " unprivileged_groups = [{'sex': 0}]\n", + " dataset_orig = load_preproc_data_german(['sex'])\n", + " optim_options = {\n", + " \"distortion_fun\": get_distortion_german,\n", + " \"epsilon\": 0.05,\n", + " \"clist\": [0.99, 1.99, 2.99],\n", + " \"dlist\": [.1, 0.05, 0]\n", + " }\n", + "\n", + " else:\n", + " privileged_groups = [{'age': 1}]\n", + " unprivileged_groups = [{'age': 0}]\n", + " dataset_orig = load_preproc_data_german(['age'])\n", + " optim_options = {\n", + " \"distortion_fun\": get_distortion_german,\n", + " \"epsilon\": 0.1,\n", + " \"clist\": [0.99, 1.99, 2.99],\n", + " \"dlist\": [.1, 0.05, 0]\n", + " }\n", + "\n", + "elif dataset_used == \"compas\":\n", + " if protected_attribute_used == 1:\n", + " privileged_groups = [{'sex': 1}]\n", + " unprivileged_groups = [{'sex': 0}]\n", + " dataset_orig = load_preproc_data_compas(['sex'])\n", + " else:\n", + " privileged_groups = [{'race': 1}]\n", + " unprivileged_groups = [{'race': 0}]\n", + " dataset_orig = load_preproc_data_compas(['race'])\n", + "\n", + " optim_options = {\n", + " \"distortion_fun\": get_distortion_compas,\n", + " \"epsilon\": 0.05,\n", + " \"clist\": [0.99, 1.99, 2.99],\n", + " \"dlist\": [.1, 0.05, 0]\n", + " }\n", + "\n", + "#random seed\n", + "np.random.seed(1)\n", + "\n", + "# Split into train, validation, and test\n", + "dataset_orig_train, dataset_orig_vt = dataset_orig.split([0.7], shuffle=True)\n", + "dataset_orig_valid, dataset_orig_test = dataset_orig_vt.split([0.5], shuffle=True)" + ] }, { - "data": { - "text/markdown": [ - "#### Favorable and unfavorable labels" + "cell_type": "markdown", + "metadata": { + "id": "LVJsopSk9bJO" + }, + "source": [ + "#### Display dataset attributes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "voA_Ybsy9bJP", + "outputId": "1e748276-a3cc-4688-aa1d-5e0fb926353f", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 314 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Training Dataset shape" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(34189, 18)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Favorable and unfavorable labels" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "1.0 0.0\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Protected attribute names" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "['sex']\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Privileged and unprivileged protected attribute values" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[array([1.])] [array([0.])]\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Dataset feature names" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "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" + ] + } ], - "text/plain": [ - "" + "source": [ + "# print out some labels, names, etc.\n", + "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)" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "(1.0, 0.0)\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "5Jw3_OPu9bJP" + }, + "source": [ + "#### Metric for original training data" + ] }, { - "data": { - "text/markdown": [ - "#### Protected attribute names" + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iL7VrC-m9bJQ", + "outputId": "90e3ce7f-d0ab-4493-d5ce-e8bc48a55a6a", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Original training dataset" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Difference in mean outcomes between unprivileged and privileged groups = -0.190244\n" + ] + } ], - "text/plain": [ - "" + "source": [ + "# Metric for the original dataset\n", + "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(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_orig_train.mean_difference())" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "['sex']\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "dYEfzlqN9bJR" + }, + "source": [ + "#### Train with and transform the original training data" + ] }, { - "data": { - "text/markdown": [ - "#### Privileged and unprivileged protected attribute values" + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": false, + "id": "aB-CKPUo9bJR", + "outputId": "ae4df5f1-1e80-4897-b236-74cc0a0826fb", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/usr/local/lib/python3.10/dist-packages/aif360/algorithms/preprocessing/optim_preproc.py:68: UserWarning: Privileged and unprivileged groups specified will not be used. The protected attributes are directly specified in the data preprocessing function. The current implementation automatically adjusts for discrimination across all groups. This can be changed by changing the optimization code.\n", + " warn(\"Privileged and unprivileged groups specified will not be \"\n", + "/usr/local/lib/python3.10/dist-packages/cvxpy/expressions/expression.py:612: UserWarning: \n", + "This use of ``*`` has resulted in matrix multiplication.\n", + "Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n", + " Use ``*`` for matrix-scalar and vector-scalar multiplication.\n", + " Use ``@`` for matrix-matrix and matrix-vector multiplication.\n", + " Use ``multiply`` for elementwise multiplication.\n", + "This code path has been hit 1 times so far.\n", + "\n", + " warnings.warn(msg, UserWarning)\n", + "/usr/local/lib/python3.10/dist-packages/cvxpy/expressions/expression.py:612: UserWarning: \n", + "This use of ``*`` has resulted in matrix multiplication.\n", + "Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n", + " Use ``*`` for matrix-scalar and vector-scalar multiplication.\n", + " Use ``@`` for matrix-matrix and matrix-vector multiplication.\n", + " Use ``multiply`` for elementwise multiplication.\n", + "This code path has been hit 2 times so far.\n", + "\n", + " warnings.warn(msg, UserWarning)\n", + "/usr/local/lib/python3.10/dist-packages/cvxpy/expressions/expression.py:612: UserWarning: \n", + "This use of ``*`` has resulted in matrix multiplication.\n", + "Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n", + " Use ``*`` for matrix-scalar and vector-scalar multiplication.\n", + " Use ``@`` for matrix-matrix and matrix-vector multiplication.\n", + " Use ``multiply`` for elementwise multiplication.\n", + "This code path has been hit 3 times so far.\n", + "\n", + " warnings.warn(msg, UserWarning)\n", + "/usr/local/lib/python3.10/dist-packages/cvxpy/expressions/expression.py:612: UserWarning: \n", + "This use of ``*`` has resulted in matrix multiplication.\n", + "Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.\n", + " Use ``*`` for matrix-scalar and vector-scalar multiplication.\n", + " Use ``@`` for matrix-matrix and matrix-vector multiplication.\n", + " Use ``multiply`` for elementwise multiplication.\n", + "This code path has been hit 4 times so far.\n", + "\n", + " warnings.warn(msg, UserWarning)\n", + "/usr/local/lib/python3.10/dist-packages/cvxpy/problems/problem.py:1387: UserWarning: Solution may be inaccurate. Try another solver, adjusting the solver settings, or solve with verbose=True for more information.\n", + " warnings.warn(\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Optimized Preprocessing: Objective converged to 0.010890\n" + ] + } ], - "text/plain": [ - "" + "source": [ + "OP = OptimPreproc(OptTools, optim_options,\n", + " unprivileged_groups = unprivileged_groups,\n", + " privileged_groups = privileged_groups)\n", + "\n", + "OP = OP.fit(dataset_orig_train)\n", + "\n", + "# Transform training data and align features\n", + "dataset_transf_train = OP.transform(dataset_orig_train, transform_Y=True)\n", + "dataset_transf_train = dataset_orig_train.align_datasets(dataset_transf_train)" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "([array([1.])], [array([0.])])\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "4S5hoh8Y9bJR" + }, + "source": [ + "#### Metric with the transformed training data" + ] }, { - "data": { - "text/markdown": [ - "#### Dataset feature names" + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aIretI9R9bJS", + "outputId": "22a76ac7-2cda-4474-a720-b68353b6b8a3", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Transformed training dataset" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Difference in mean outcomes between unprivileged and privileged groups = -0.047833\n" + ] + } ], - "text/plain": [ - "" + "source": [ + "metric_transf_train = BinaryLabelDatasetMetric(dataset_transf_train,\n", + " unprivileged_groups=unprivileged_groups,\n", + " privileged_groups=privileged_groups)\n", + "display(Markdown(\"#### Transformed training dataset\"))\n", + "print(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_transf_train.mean_difference())" ] - }, - "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" - ] + "cell_type": "markdown", + "metadata": { + "id": "PaqQjOD09bJS" + }, + "source": [ + "Optimized preprocessing has reduced the disparity in favorable outcomes between the privileged and unprivileged\n", + "groups (training data)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "dY3_u9SM9bJS" + }, + "outputs": [], + "source": [ + "### Testing\n", + "assert np.abs(metric_transf_train.mean_difference()) < np.abs(metric_orig_train.mean_difference())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4QTuHi_o9bJS" + }, + "source": [ + "#### Load, clean up original test data and compute metric" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Q2YWVVS59bJS", + "outputId": "cff26fb1-44df-4a6f-bfb6-06affe4b42e5", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 128 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Testing Dataset shape" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "(7327, 18)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Original test dataset" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Difference in mean outcomes between unprivileged and privileged groups = -0.190984\n" + ] + } + ], + "source": [ + "dataset_orig_test = dataset_transf_train.align_datasets(dataset_orig_test)\n", + "display(Markdown(\"#### Testing Dataset shape\"))\n", + "print(dataset_orig_test.features.shape)\n", + "\n", + "metric_orig_test = BinaryLabelDatasetMetric(dataset_orig_test,\n", + " unprivileged_groups=unprivileged_groups,\n", + " privileged_groups=privileged_groups)\n", + "display(Markdown(\"#### Original test dataset\"))\n", + "print(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_orig_test.mean_difference())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Xmzgd6lY9bJS" + }, + "source": [ + "#### Transform test data and compute metric" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "p4yx6PlK9bJT", + "outputId": "8dc98d18-9e14-42a9-b7c9-db51e051e7b1", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Transformed test dataset" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Difference in mean outcomes between unprivileged and privileged groups = -0.050932\n" + ] + } + ], + "source": [ + "dataset_transf_test = OP.transform(dataset_orig_test, transform_Y = True)\n", + "dataset_transf_test = dataset_orig_test.align_datasets(dataset_transf_test)\n", + "\n", + "metric_transf_test = BinaryLabelDatasetMetric(dataset_transf_test,\n", + " unprivileged_groups=unprivileged_groups,\n", + " privileged_groups=privileged_groups)\n", + "display(Markdown(\"#### Transformed test dataset\"))\n", + "print(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_transf_test.mean_difference())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WiORE_UT9bJT" + }, + "source": [ + "Optimized preprocessing has reduced the disparity in favorable outcomes between the privileged and unprivileged\n", + "groups (test data)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "QUbsZEhP9bJT" + }, + "outputs": [], + "source": [ + "### Testing\n", + "assert np.abs(metric_transf_test.mean_difference()) < np.abs(metric_orig_test.mean_difference())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HbPMNGJJ9bJT" + }, + "source": [ + "### Train classifier on original data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cBjtKydK9bJT" + }, + "outputs": [], + "source": [ + "# Logistic regression classifier and predictions\n", + "scale_orig = StandardScaler()\n", + "X_train = scale_orig.fit_transform(dataset_orig_train.features)\n", + "y_train = dataset_orig_train.labels.ravel()\n", + "\n", + "lmod = LogisticRegression()\n", + "lmod.fit(X_train, y_train)\n", + "y_train_pred = lmod.predict(X_train)\n", + "\n", + "# positive class index\n", + "pos_ind = np.where(lmod.classes_ == dataset_orig_train.favorable_label)[0][0]\n", + "\n", + "dataset_orig_train_pred = dataset_orig_train.copy()\n", + "dataset_orig_train_pred.labels = y_train_pred" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cpYPUzwu9bJT" + }, + "source": [ + "#### Obtain scores original test set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "XEEAkn3a9bJT" + }, + "outputs": [], + "source": [ + "dataset_orig_valid_pred = dataset_orig_valid.copy(deepcopy=True)\n", + "X_valid = scale_orig.transform(dataset_orig_valid_pred.features)\n", + "y_valid = dataset_orig_valid_pred.labels\n", + "dataset_orig_valid_pred.scores = lmod.predict_proba(X_valid)[:,pos_ind].reshape(-1,1)\n", + "\n", + "dataset_orig_test_pred = dataset_orig_test.copy(deepcopy=True)\n", + "X_test = scale_orig.transform(dataset_orig_test_pred.features)\n", + "y_test = dataset_orig_test_pred.labels\n", + "dataset_orig_test_pred.scores = lmod.predict_proba(X_test)[:,pos_ind].reshape(-1,1)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VSaTmbhx9bJU" + }, + "source": [ + "### Find the optimal classification threshold from the validation set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "inoHZhxy9bJU", + "outputId": "6b770c24-70bb-4ceb-8666-ca09169bf8be", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Best balanced accuracy (no fairness constraints) = 0.7463\n", + "Optimal classification threshold (no fairness constraints) = 0.2872\n" + ] + } + ], + "source": [ + "num_thresh = 100\n", + "ba_arr = np.zeros(num_thresh)\n", + "class_thresh_arr = np.linspace(0.01, 0.99, num_thresh)\n", + "for idx, class_thresh in enumerate(class_thresh_arr):\n", + "\n", + " fav_inds = dataset_orig_valid_pred.scores > class_thresh\n", + " dataset_orig_valid_pred.labels[fav_inds] = dataset_orig_valid_pred.favorable_label\n", + " dataset_orig_valid_pred.labels[~fav_inds] = dataset_orig_valid_pred.unfavorable_label\n", + "\n", + " classified_metric_orig_valid = ClassificationMetric(dataset_orig_valid,\n", + " dataset_orig_valid_pred,\n", + " unprivileged_groups=unprivileged_groups,\n", + " privileged_groups=privileged_groups)\n", + "\n", + " ba_arr[idx] = 0.5*(classified_metric_orig_valid.true_positive_rate()\\\n", + " +classified_metric_orig_valid.true_negative_rate())\n", + "\n", + "best_ind = np.where(ba_arr == np.max(ba_arr))[0][0]\n", + "best_class_thresh = class_thresh_arr[best_ind]\n", + "\n", + "print(\"Best balanced accuracy (no fairness constraints) = %.4f\" % np.max(ba_arr))\n", + "print(\"Optimal classification threshold (no fairness constraints) = %.4f\" % best_class_thresh)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-o5vmB0Y9bJU" + }, + "source": [ + "### Predictions and fairness metrics from original test set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "EM1AgxaI9bJU", + "outputId": "23b3c00a-b58a-46d5-9a3f-d366b61b133d", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 292 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Predictions from original testing data" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Testing set" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "##### Raw predictions - No fairness constraints" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + " 45%|████▌ | 45/100 [00:00<00:00, 135.82it/s]" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Balanced accuracy = 0.7437\n", + "Statistical parity difference = -0.3580\n", + "Disparate impact = 0.2794\n", + "Average odds difference = -0.3181\n", + "Equal opportunity difference = -0.3769\n", + "Theil index = 0.1129\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + " 60%|██████ | 60/100 [00:00<00:00, 138.12it/s]/usr/local/lib/python3.10/dist-packages/aif360/metrics/dataset_metric.py:82: RuntimeWarning: invalid value encountered in double_scalars\n", + " return metric_fun(privileged=False) / metric_fun(privileged=True)\n", + "100%|██████████| 100/100 [00:00<00:00, 139.93it/s]\n" + ] + } + ], + "source": [ + "display(Markdown(\"#### Predictions from original testing data\"))\n", + "\n", + "bal_acc_arr_orig = []\n", + "disp_imp_arr_orig = []\n", + "avg_odds_diff_arr_orig = []\n", + "\n", + "display(Markdown(\"#### Testing set\"))\n", + "display(Markdown(\"##### Raw predictions - No fairness constraints\"))\n", + "\n", + "for thresh in tqdm(class_thresh_arr):\n", + "\n", + " fav_inds = dataset_orig_test_pred.scores > thresh\n", + " dataset_orig_test_pred.labels[fav_inds] = dataset_orig_test_pred.favorable_label\n", + " dataset_orig_test_pred.labels[~fav_inds] = dataset_orig_test_pred.unfavorable_label\n", + "\n", + " if (thresh == best_class_thresh):\n", + " disp = True\n", + " else:\n", + " disp = False\n", + "\n", + " metric_test_bef = compute_metrics(dataset_orig_test, dataset_orig_test_pred,\n", + " unprivileged_groups, privileged_groups, disp=disp)\n", + "\n", + " bal_acc_arr_orig.append(metric_test_bef[\"Balanced accuracy\"])\n", + " avg_odds_diff_arr_orig.append(metric_test_bef[\"Average odds difference\"])\n", + " disp_imp_arr_orig.append(metric_test_bef[\"Disparate impact\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "60HbaG209bJU", + "outputId": "47405090-491e-4a78-af8b-257599f7014c", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6sAAAJlCAYAAAA8d2T1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADgsUlEQVR4nOzdd3hUZdrH8e/MpHdK6DVIlyZFEARRBMSCKAh23BXLrroquvuKBXQtq2vvBRdYFQVFsKwIKE1ABRQQAekloQdSSM9k5v3jyaSQQjKZZDKT3+e6znVO5pw5584u4NxzP8/9WJxOpxMRERERERGRWsTq7QBERERERERETqdkVURERERERGodJasiIiIiIiJS6yhZFRERERERkVpHyaqIiIiIiIjUOkpWRUREREREpNZRsioiIiIiIiK1jpJVERERERERqXUCvB2Av7Pb7WzYsIHGjRtjteq7ARERERGRusrhcHD06FF69epFQIBSsTPR/0LVbMOGDfTr18/bYYiIiIiISC2xdu1a+vbt6+0waj0lq9WscePGgPkD2bRpUy9HIyKny8nJ4eGHHwbgqaeeIigoyMsRiYiIiL86fPgw/fr1K8gRpHxKVquZa+hv06ZNadGihZejEZHTpaen88knnwAwffp0wsPDvRyRiIiI+DtND6wYJasiUqcFBgby5JNPFhyLiIiISO2gZFVE6rSgoKCCYcAiIiIiUnuo/iwiIiIiIiK1jiqrIlKnOZ1OEhMTAWjYsCEWi8XLEYmIiIgIKFkVkTouIyODRo0aAZCWlqYGSyIiIiK1hIYBi4iIiIiISK2jyqqI1Gnh4eE4nU5vhyEiIiIip6nVldV169YxatQoYmJiCA8Pp3///sydO7fC72/Tpg0Wi6Xc7Ycffij2nvKunThxood/QxERERERESlNra2sLlu2jBEjRhASEsKECROIjIxk3rx5jB8/nvj4eCZPnnzGe9x7770kJyeXeD0xMZE33niDevXq0bdv3xLnW7duXWpi2rNnTzd+ExEREREREamsWpms2u12Jk2ahNVqZeXKlQVJ4mOPPUa/fv2YMmUKY8eOpXXr1uXe59577y319RdeeAGAG264gZCQkBLn27Rpw7Rp06ryK4iIj8jOzuYf//gHAM8++yzBwcFejkhEREREoJYOA166dCm7d+/muuuuK1bNjI6OZsqUKeTk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iIiIiIjIMYpMVgcPHozWrVtj5cqVOHz4sLQ+JycH8+fPh06nw/jx46X1Fy5cwPHjx+2a7/7xxx925zabzZgxYwZOnjyJgQMHomnTpnW+LhEREREREbmGIvusarVaLF26FAkJCejfvz/GjBmDgIAArFu3DqmpqVi8eDGio6Ol/WfOnIkVK1Zg2bJlmDhxorS+Z8+e6NKlC7p06YLIyEhkZmZi586dOHHiBJo3b46lS5fW67pE5PmKioowadIkAMB///tf+Pr6yhwREREREQEKTVYBYODAgdizZw+SkpKwatUqlJaWIjY2FgsXLsTo0aMdOsf06dPx66+/YuvWrcjMzIROp0ObNm3w4osvYtq0aZUOluSM6xKR5zCbzVi5ciUA4OOPP5Y5GiIiIiKyUgmCIMgdREN27tw5tGjRAmlpaWjevLnc4RDRdUpLS/Hee+8BAB577DH4+PjIHBERERE1VMwNakexlVUiInfw8fHB008/LXcYRERERHQdRQ6wRERERERERN6NlVUi8moWiwVnz54FALRs2RJqNf+GR0RERKQETFaJyKuZTCa0atUKAJCfnw+j0ShzREREREQEMFklIoKfn5/cIRARERHRdZisEpFXMxqNKCgokDsMIiIiIroOO2cRERERERGR4jBZJSIiIiIiIsVhskpEXq24uBhTpkzBlClTUFxcLHc4RERERHQNk1Ui8mplZWVYunQpli5dirKyMrnDISIiIqJrOMASEXk1Hx8fvPrqq9IyERERESkDk1Ui8mo6nQ6zZ8+WOwwiIiIiug6bARMREREREZHisLJKRF5NEARcvXoVABAWFgaVSiVzREREREQEMFklIi9XWFiI8PBwAEB+fj6MRqPMERERERERwGTV5SwWCwDgwoULMkdCRJUpLCyUltPT0+Hn5ydjNERERNSQWXMCa45A1WOy6mKXLl0CAMTFxckcCRHVpF27dnKHQERERF7g0qVLaNmypdxhKJ5KEARB7iAasrKyMhw6dAhNmjSBWu368azy8vLQsWNH/PXXXwgICHD59ahh4f1DdcV7h+qD9w/VB+8fqg933z8WiwWXLl1C9+7dodWyblgTJqsNTG5uLgIDA5GTk4NGjRrJHQ55GN4/VFe8d6g+eP9QffD+ofrg/aNsnLqGiIiIiIiIFIfJKhERERERESkOk9UGRq/XIykpCXq9Xu5Q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9Sq6desmTV3zxx9/VHu8HJ8HEZGcmKwSkVczGAz46aef8Nxzz+H999+X+nnl5eVh27ZtdvtX19zxeq+//jri4+OlKm1GRgY2bNgAQKzARUVF2QzSUpnCwsJqv8C+8sordv3xzGYzkpOTbeZGrSgxMRHDhw93+H04w5tvvonS0lKbqtmFCxdw4cKFSvePjo7G008/jTfeeENa9+eff0rNJhcvXoxnn3222mtOmjQJ//73v6XXR44ckeYDHTBggENxd+zYEevXr8d9990nJb7nz5+3q9QaDAZ89NFHGDhwoEPn9SahoaHYunUr7rnnHmngoPz8fOzatavS/SuOEm1VUlKCo0eP2jW/tXr44YftWhzUx7p163D33XdLMZpMpkrjHTFiBD744AOHz6vVarF69WoMGjRIup8KCgqk3zXR0dFo1aqVzRyvlXH350FEJBcmq0Tk9fR6Pd555x2pArRjxw78/fffyMrKgiAIaNy4MTp27IhBgwZh7NixDp83Li4O+/btQ1JSEnbt2gWTyYSWLVtizJgxmDVrFh555JEqj33xxRfRs2dP7Nu3DykpKcjIyEBOTg70ej2aN2+OuLg4TJ482WZk3XvuuQdqtRr79u3DsWPHcPXqVWRmZkKtViM8PBxdunTBvffei/vvv79WSbczaDQafPDBB3jwwQfx3//+F3v27MHZs2dRVFSEkJAQtGrVCgMHDkRYWJh0zOLFi9GuXTu8//77OH78OHx9fdGtWzdMnz4dw4cPrzFZfe211xAYGIiVK1fin3/+sWva7aihQ4fi+PHj+Oijj7BhwwYcP34ceXl58PPzQ5s2bXDrrbdi6tSpdgNmUbnOnTvjyJEj+PLLL7F+/XocPnwYGRkZsFgsCAkJQZs2bdCnTx8kJiba/CHhkUceQWRkJPbt24fk5GRcvXoV2dnZ8PHxQUREBHr06IFx48bhzjvvdGq8ISEhUv/ylStX4sCBA7hy5QpUKhUiIiLQu3dvPPDAA0hISKj1ubt27YqDBw9i7ty52LhxI7KystCsWTPcddddeOmllzBt2rQqj5Xr8yAikotKcMVwh0RERERERET1wAGWiIiIiIiISHGYrBIREREREZHiMFklIiIiIiIixWGySkRERERERIrDZJWIiIiIiIgUh8kqERERERERKQ6TVSIiIiIiIlIcJqtERERERESkOExWiYiIiIiISHGYrBIREREREZHiMFklIiIiIiIixWGySkRERERERIrDZJWIiIiIiIgU5/8DjdCI5jkuPtgAAAAASUVORK5CYII=\n" + }, + "metadata": {} + } + ], + "source": [ + "fig, ax1 = plt.subplots(figsize=(10,7))\n", + "ax1.plot(class_thresh_arr, bal_acc_arr_orig)\n", + "ax1.set_xlabel('Classification Thresholds', fontsize=16, fontweight='bold')\n", + "ax1.set_ylabel('Balanced Accuracy', color='b', fontsize=16, fontweight='bold')\n", + "ax1.xaxis.set_tick_params(labelsize=14)\n", + "ax1.yaxis.set_tick_params(labelsize=14)\n", + "\n", + "\n", + "ax2 = ax1.twinx()\n", + "ax2.plot(class_thresh_arr, np.abs(1.0-np.array(disp_imp_arr_orig)), color='r')\n", + "ax2.set_ylabel('abs(1-disparate impact)', color='r', fontsize=16, fontweight='bold')\n", + "ax2.axvline(np.array(class_thresh_arr)[best_ind],\n", + " color='k', linestyle=':')\n", + "ax2.yaxis.set_tick_params(labelsize=14)\n", + "ax2.grid(True)\n", + "\n", + "disp_imp_at_best_bal_acc_orig = np.abs(1.0-np.array(disp_imp_arr_orig))[best_ind]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vbRZEt0r9bJU" + }, + "source": [ + "```abs(1-disparate impact)``` must be close to zero for classifier predictions to be fair." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4zeWdeYL9bJU" + }, + "source": [ + "### Train classifier on transformed data and obtain predictions with its fairness metrics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "59LC5sXc9bJU" + }, + "outputs": [], + "source": [ + "scale_transf = StandardScaler()\n", + "X_train = scale_transf.fit_transform(dataset_transf_train.features)\n", + "y_train = dataset_transf_train.labels.ravel()\n", + "\n", + "lmod = LogisticRegression()\n", + "lmod.fit(X_train, y_train)\n", + "y_train_pred = lmod.predict(X_train)\n", + "\n", + "dataset_transf_train_pred = dataset_transf_train.copy()\n", + "dataset_transf_train_pred.labels = y_train_pred" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "W8rSib0a9bJV" + }, + "source": [ + "### Predictions and fairness metrics from transformed test set" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "aQUn759e9bJV" + }, + "outputs": [], + "source": [ + "dataset_transf_test_pred = dataset_transf_test.copy(deepcopy=True)\n", + "X_test = scale_transf.transform(dataset_transf_test_pred.features)\n", + "y_test = dataset_transf_test_pred.labels\n", + "dataset_transf_test_pred.scores = lmod.predict_proba(X_test)[:,pos_ind].reshape(-1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "kUfPTk1V9bJV", + "outputId": "c7b8e892-0275-424f-f99d-0d08d632db30", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 292 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Predictions from transformed testing data" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Testing set" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "##### Transformed predictions - No fairness constraints" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + " 44%|████▍ | 44/100 [00:00<00:00, 139.92it/s]" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Balanced accuracy = 0.7013\n", + "Statistical parity difference = -0.0722\n", + "Disparate impact = 0.7895\n", + "Average odds difference = -0.0487\n", + "Equal opportunity difference = -0.0429\n", + "Theil index = 0.1469\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\r 59%|█████▉ | 59/100 [00:00<00:00, 141.36it/s]/usr/local/lib/python3.10/dist-packages/aif360/metrics/dataset_metric.py:82: RuntimeWarning: invalid value encountered in double_scalars\n", + " return metric_fun(privileged=False) / metric_fun(privileged=True)\n", + "100%|██████████| 100/100 [00:00<00:00, 110.73it/s]\n" + ] + } + ], + "source": [ + "display(Markdown(\"#### Predictions from transformed testing data\"))\n", + "\n", + "bal_acc_arr_transf = []\n", + "disp_imp_arr_transf = []\n", + "avg_odds_diff_arr_transf = []\n", + "\n", + "display(Markdown(\"#### Testing set\"))\n", + "display(Markdown(\"##### Transformed predictions - No fairness constraints\"))\n", + "\n", + "for thresh in tqdm(class_thresh_arr):\n", + "\n", + " fav_inds = dataset_transf_test_pred.scores > thresh\n", + " dataset_transf_test_pred.labels[fav_inds] = dataset_transf_test_pred.favorable_label\n", + " dataset_transf_test_pred.labels[~fav_inds] = dataset_transf_test_pred.unfavorable_label\n", + "\n", + " if (thresh == best_class_thresh):\n", + " disp = True\n", + " else:\n", + " disp = False\n", + "\n", + " metric_test_bef = compute_metrics(dataset_transf_test, dataset_transf_test_pred,\n", + " unprivileged_groups, privileged_groups, disp=disp)\n", + "\n", + " bal_acc_arr_transf.append(metric_test_bef[\"Balanced accuracy\"])\n", + " avg_odds_diff_arr_transf.append(metric_test_bef[\"Average odds difference\"])\n", + " disp_imp_arr_transf.append(metric_test_bef[\"Disparate impact\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "YAoaHLhS9bJV", + "outputId": "362586d4-eba2-4de6-db4b-04eec24fc60f", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 629 + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6sAAAJlCAYAAAA8d2T1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD/6ElEQVR4nOzdd3hUdfbH8fdMeg+Q0Euk9yagiIJYALGvBey4q669obs/saFrX3vXxQVcdQVFbAuChSKCojSR3ntJgCSkTiYzvz9ubiYhheTOJHOTfF7PM89MZm7u/WYXMzlzzvcch9fr9SIiIiIiIiJiI85gL0BERERERETkWApWRURERERExHYUrIqIiIiIiIjtKFgVERERERER21GwKiIiIiIiIrajYFVERERERERsR8GqiIiIiIiI2I6CVREREREREbGd0GAvoL5zu92sWLGCZs2a4XTqswERERERkYbK4/Fw4MAB+vXrR2ioQrHj0f9CNWzFihUMGjQo2MsQERERERGbWLp0KQMHDgz2MmxPwWoNa9asGWD8g2zRokWQVyMix3K5XDz44IMAPPnkk4SHhwd5RSIiIlJf7du3j0GDBhXHCFI5Bas1zCz9bdGiBa1btw7yakTkWNnZ2Xz88ccATJo0iZiYmCCvSEREROo7bQ+sGgWrItKghYWF8cQTTxQ/FhERERF7ULAqIg1aeHh4cRmwiIiIiNiH8s8iIiIiIiJiO8qsikiD5vV6SUtLAyApKQmHwxHkFYmIiIgIKFgVkQYuJyeHpk2bApCVlaUGSyIiIiI2oTJgERERERERsR1lVkWkQYuJicHr9QZ7GSIiIiJyDGVWRURERERExHYUrIqIiIiIiIjtKFgVkQYtPz+fu+++m7vvvpv8/PxgL0dEREREiihYFZEGze1288orr/DKK6/gdruDvRwRERERKaIGSyLSoIWFhTFhwoTixyIiIiJiDwpWRaRBCw8P58knnwz2MkRERETkGCoDFhEREREREdtRZlVEGjSv10tOTg4A0dHROByOIK9IRERERECZVRFp4HJycoiNjSU2NrY4aBURERGxiw8++IC//vWvDBgwgIiICBwOB1OmTKn2eTweD6+99hq9evUiKiqK5ORkrrjiCrZu3Rr4RQeIglURERERERGbeuihh3j33XfZsWMHLVq0sHyev/71r9x55514vV7uvPNO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AgKkMWPGSKdPn66+D0OSJEmSRpIkSeGexURERERERERVwgJLREREREREpDoMVomIiIiIiEh1GKwSERERERGR6jBYJSIiIiIiItVhsEpERERERESqw2CViIiIiIiIVIfBKhEREREREakOg1UiIiIiIiJSHQarRES3nD9/Hm+++SYGDhyIJk2awMPDAx4eHggJCUFUVBTeffddnD9/3mqb/v37Q6PRmB8JCQmuaXwVTJw40eozbNu2rdQ6p0+fxoQJExAaGgqDwWBe19/fHwCwdOlSq33MmTOnWj9DVYSFhVm1vSYo3l57H2XtIywszHUfxglc+f9yzpw5VsdeunSpXdvb8v+RiKiucHd1A4iIXC0vLw8vv/wyPv30UxQWFpZ6PykpCUlJSdi4cSPeffddpKSkuKCVrnPt2jX06tULycnJrm6KzRISEtCsWTPzz5GRkbzoJyIiqmEYrBJRnZabm4shQ4Zg586dVq/7+Pige/fu8Pb2xrVr13D48GHk5ubCZDK5qKXO06NHD2RmZpp/btCggdX7P/74o1WgWq9ePfTt2xd6vR5GoxGAyE6OHDnSvE67du2c3GrlREdH49q1a65uhl2Kf9eyAwcOIDEx0fxz27Zta9S/AxERUUkMVomoTnvqqaesAlWNRoM33ngDM2fOhIeHh/n1nJwcfPfdd/jwww9d0Ernmj59OqZPn17u+1evXrX6ed68eXj88cetXuvfvz/69+/vjOY53aeffurqJtht1apVpV6bOHEili1bZv75wQcfrFHdsYmIiErimFUiqrP+/vtvLFmyxOq1N998E3PmzLEKVAHA09MTjz32GPbv32/XMRYsWIAJEyagW7duCAkJgdFohMFgQKNGjRAZGYn58+cjIyOjzG2PHz+OJ598Eu3bt4ePjw/c3d0REBCA1q1b47777sO//vUvnD592mqb5ORkzJkzBz179kT9+vWh0+ng6+uL8PBwDBo0CK+88gr++OMPq23KGyMnj70rGfA88cQT5nUnTpwIwPYxqwcPHsSTTz6Jjh07wt/fH3q9HkFBQbjjjjvw6quvWmV4ExIS8Prrr2P48OFo3bo1GjZsCL1eD29vbzRv3hwPPvggfv31V6v9JyQkQKPRWHUBBoDt27dbta94YG3LmNXk5GS8/fbb6Nu3LwIDA6HT6VCvXj10794ds2bNwoULF8rcrqx9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\n" + }, + "metadata": {} + } + ], + "source": [ + "fig, ax1 = plt.subplots(figsize=(10,7))\n", + "ax1.plot(class_thresh_arr, bal_acc_arr_transf)\n", + "ax1.set_xlabel('Classification Thresholds', fontsize=16, fontweight='bold')\n", + "ax1.set_ylabel('Balanced Accuracy', color='b', fontsize=16, fontweight='bold')\n", + "ax1.xaxis.set_tick_params(labelsize=14)\n", + "ax1.yaxis.set_tick_params(labelsize=14)\n", + "\n", + "\n", + "ax2 = ax1.twinx()\n", + "ax2.plot(class_thresh_arr, np.abs(1.0-np.array(disp_imp_arr_transf)), color='r')\n", + "ax2.set_ylabel('abs(1-disparate impact)', color='r', fontsize=16, fontweight='bold')\n", + "ax2.axvline(np.array(class_thresh_arr)[best_ind],\n", + " color='k', linestyle=':')\n", + "ax2.yaxis.set_tick_params(labelsize=14)\n", + "ax2.grid(True)\n", + "\n", + "disp_imp_at_best_bal_acc_transf = np.abs(1.0-np.array(disp_imp_arr_transf))[best_ind]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ng19V4Hx9bJV" + }, + "source": [ + "```abs(1-disparate impact)``` must be close to zero for classifier predictions to be fair. This measure has improved using classifier trained using the transformed data compared to the original data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "srNJ5EZR9bJV" + }, + "outputs": [], + "source": [ + "### testing\n", + "assert disp_imp_at_best_bal_acc_transf < disp_imp_at_best_bal_acc_orig" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9ZArXBrz9bJV" + }, + "source": [ + "# Summary of Results\n", + "We show the optimal classification thresholds, and the fairness and accuracy metrics." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p_0dSqVO9bJV" + }, + "source": [ + "### Classification Thresholds\n", + "\n", + "| Dataset |Classification threshold|\n", + "|-|-|\n", + "|Adult|0.2674|\n", + "|German|0.6732|\n", + "|Compas|0.5148|" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "amlwNuwn9bJW" + }, + "source": [ + "### Fairness Metric: Disparate impact, Accuracy Metric: Balanced accuracy\n", + "\n", + "#### Performance\n", + "\n", + "| Dataset |Sex (Acc-Bef)|Sex (Acc-Aft)|Sex (Fair-Bef)|Sex (Fair-Aft)|Race/Age (Acc-Bef)|Race/Age (Acc-Aft)|Race/Age (Fair-Bef)|Race/Age (Fair-Aft)|\n", + "|-|-|-|-|-|-|-|-|-|\n", + "|Adult (Test)|0.7417|0.7021|0.2774|0.7729|0.7417|0.7408|0.4423|0.7645|\n", + "|German (Test)|0.6524|0.5698|0.9948|1.0664|0.6524|0.6067|0.3824|0.8228|\n", + "|Compas (Test)|0.6774|0.6606|0.6631|0.8085|0.6774|0.6790|0.6600|0.8430|\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "oiyAy22V9bJW" + }, + "outputs": [], + "source": [] + } + ], + "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.10" + }, + "colab": { + "provenance": [] } - ], - "source": [ - "# print out some labels, names, etc.\n", - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Metric for original training data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Metric for the original dataset\n", - "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(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_orig_train.mean_difference())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Train with and transform the original training data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "OP = OptimPreproc(OptTools, optim_options,\n", - " unprivileged_groups = unprivileged_groups,\n", - " privileged_groups = privileged_groups)\n", - "\n", - "OP = OP.fit(dataset_orig_train)\n", - "\n", - "# Transform training data and align features\n", - "dataset_transf_train = OP.transform(dataset_orig_train, transform_Y=True)\n", - "dataset_transf_train = dataset_orig_train.align_datasets(dataset_transf_train)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Metric with the transformed training data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "metric_transf_train = BinaryLabelDatasetMetric(dataset_transf_train, \n", - " unprivileged_groups=unprivileged_groups,\n", - " privileged_groups=privileged_groups)\n", - "display(Markdown(\"#### Transformed training dataset\"))\n", - "print(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_transf_train.mean_difference())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Optimized preprocessing has reduced the disparity in favorable outcomes between the privileged and unprivileged\n", - "groups (training data)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### Testing \n", - "assert np.abs(metric_transf_train.mean_difference()) < np.abs(metric_orig_train.mean_difference())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Load, clean up original test data and compute metric" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset_orig_test = dataset_transf_train.align_datasets(dataset_orig_test)\n", - "display(Markdown(\"#### Testing Dataset shape\"))\n", - "print(dataset_orig_test.features.shape)\n", - "\n", - "metric_orig_test = BinaryLabelDatasetMetric(dataset_orig_test, \n", - " unprivileged_groups=unprivileged_groups,\n", - " privileged_groups=privileged_groups)\n", - "display(Markdown(\"#### Original test dataset\"))\n", - "print(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_orig_test.mean_difference())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Transform test data and compute metric" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset_transf_test = OP.transform(dataset_orig_test, transform_Y = True)\n", - "dataset_transf_test = dataset_orig_test.align_datasets(dataset_transf_test)\n", - "\n", - "metric_transf_test = BinaryLabelDatasetMetric(dataset_transf_test, \n", - " unprivileged_groups=unprivileged_groups,\n", - " privileged_groups=privileged_groups)\n", - "display(Markdown(\"#### Transformed test dataset\"))\n", - "print(\"Difference in mean outcomes between unprivileged and privileged groups = %f\" % metric_transf_test.mean_difference())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Optimized preprocessing has reduced the disparity in favorable outcomes between the privileged and unprivileged\n", - "groups (test data)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### Testing \n", - "assert np.abs(metric_transf_test.mean_difference()) < np.abs(metric_orig_test.mean_difference())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Train classifier on original data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Logistic regression classifier and predictions\n", - "scale_orig = StandardScaler()\n", - "X_train = scale_orig.fit_transform(dataset_orig_train.features)\n", - "y_train = dataset_orig_train.labels.ravel()\n", - "\n", - "lmod = LogisticRegression()\n", - "lmod.fit(X_train, y_train)\n", - "y_train_pred = lmod.predict(X_train)\n", - "\n", - "# positive class index\n", - "pos_ind = np.where(lmod.classes_ == dataset_orig_train.favorable_label)[0][0]\n", - "\n", - "dataset_orig_train_pred = dataset_orig_train.copy()\n", - "dataset_orig_train_pred.labels = y_train_pred" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Obtain scores original test set" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset_orig_valid_pred = dataset_orig_valid.copy(deepcopy=True)\n", - "X_valid = scale_orig.transform(dataset_orig_valid_pred.features)\n", - "y_valid = dataset_orig_valid_pred.labels\n", - "dataset_orig_valid_pred.scores = lmod.predict_proba(X_valid)[:,pos_ind].reshape(-1,1)\n", - "\n", - "dataset_orig_test_pred = dataset_orig_test.copy(deepcopy=True)\n", - "X_test = scale_orig.transform(dataset_orig_test_pred.features)\n", - "y_test = dataset_orig_test_pred.labels\n", - "dataset_orig_test_pred.scores = lmod.predict_proba(X_test)[:,pos_ind].reshape(-1,1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Find the optimal classification threshold from the validation set" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "num_thresh = 100\n", - "ba_arr = np.zeros(num_thresh)\n", - "class_thresh_arr = np.linspace(0.01, 0.99, num_thresh)\n", - "for idx, class_thresh in enumerate(class_thresh_arr):\n", - " \n", - " fav_inds = dataset_orig_valid_pred.scores > class_thresh\n", - " dataset_orig_valid_pred.labels[fav_inds] = dataset_orig_valid_pred.favorable_label\n", - " dataset_orig_valid_pred.labels[~fav_inds] = dataset_orig_valid_pred.unfavorable_label\n", - " \n", - " classified_metric_orig_valid = ClassificationMetric(dataset_orig_valid,\n", - " dataset_orig_valid_pred, \n", - " unprivileged_groups=unprivileged_groups,\n", - " privileged_groups=privileged_groups)\n", - " \n", - " ba_arr[idx] = 0.5*(classified_metric_orig_valid.true_positive_rate()\\\n", - " +classified_metric_orig_valid.true_negative_rate())\n", - "\n", - "best_ind = np.where(ba_arr == np.max(ba_arr))[0][0]\n", - "best_class_thresh = class_thresh_arr[best_ind]\n", - "\n", - "print(\"Best balanced accuracy (no fairness constraints) = %.4f\" % np.max(ba_arr))\n", - "print(\"Optimal classification threshold (no fairness constraints) = %.4f\" % best_class_thresh)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Predictions and fairness metrics from original test set" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(\"#### Predictions from original testing data\"))\n", - "\n", - "bal_acc_arr_orig = []\n", - "disp_imp_arr_orig = []\n", - "avg_odds_diff_arr_orig = []\n", - "\n", - "display(Markdown(\"#### Testing set\"))\n", - "display(Markdown(\"##### Raw predictions - No fairness constraints\"))\n", - "\n", - "for thresh in tqdm(class_thresh_arr):\n", - " \n", - " fav_inds = dataset_orig_test_pred.scores > thresh\n", - " dataset_orig_test_pred.labels[fav_inds] = dataset_orig_test_pred.favorable_label\n", - " dataset_orig_test_pred.labels[~fav_inds] = dataset_orig_test_pred.unfavorable_label\n", - "\n", - " if (thresh == best_class_thresh):\n", - " disp = True\n", - " else:\n", - " disp = False\n", - " \n", - " metric_test_bef = compute_metrics(dataset_orig_test, dataset_orig_test_pred, \n", - " unprivileged_groups, privileged_groups, disp=disp)\n", - " \n", - " bal_acc_arr_orig.append(metric_test_bef[\"Balanced accuracy\"])\n", - " avg_odds_diff_arr_orig.append(metric_test_bef[\"Average odds difference\"])\n", - " disp_imp_arr_orig.append(metric_test_bef[\"Disparate impact\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax1 = plt.subplots(figsize=(10,7))\n", - "ax1.plot(class_thresh_arr, bal_acc_arr_orig)\n", - "ax1.set_xlabel('Classification Thresholds', fontsize=16, fontweight='bold')\n", - "ax1.set_ylabel('Balanced Accuracy', color='b', fontsize=16, fontweight='bold')\n", - "ax1.xaxis.set_tick_params(labelsize=14)\n", - "ax1.yaxis.set_tick_params(labelsize=14)\n", - "\n", - "\n", - "ax2 = ax1.twinx()\n", - "ax2.plot(class_thresh_arr, np.abs(1.0-np.array(disp_imp_arr_orig)), color='r')\n", - "ax2.set_ylabel('abs(1-disparate impact)', color='r', fontsize=16, fontweight='bold')\n", - "ax2.axvline(np.array(class_thresh_arr)[best_ind], \n", - " color='k', linestyle=':')\n", - "ax2.yaxis.set_tick_params(labelsize=14)\n", - "ax2.grid(True)\n", - "\n", - "disp_imp_at_best_bal_acc_orig = np.abs(1.0-np.array(disp_imp_arr_orig))[best_ind]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```abs(1-disparate impact)``` must be close to zero for classifier predictions to be fair." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Train classifier on transformed data and obtain predictions with its fairness metrics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "scale_transf = StandardScaler()\n", - "X_train = scale_transf.fit_transform(dataset_transf_train.features)\n", - "y_train = dataset_transf_train.labels.ravel()\n", - "\n", - "lmod = LogisticRegression()\n", - "lmod.fit(X_train, y_train)\n", - "y_train_pred = lmod.predict(X_train)\n", - "\n", - "dataset_transf_train_pred = dataset_transf_train.copy()\n", - "dataset_transf_train_pred.labels = y_train_pred" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Predictions and fairness metrics from transformed test set" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "dataset_transf_test_pred = dataset_transf_test.copy(deepcopy=True)\n", - "X_test = scale_transf.transform(dataset_transf_test_pred.features)\n", - "y_test = dataset_transf_test_pred.labels\n", - "dataset_transf_test_pred.scores = lmod.predict_proba(X_test)[:,pos_ind].reshape(-1,1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(\"#### Predictions from transformed testing data\"))\n", - "\n", - "bal_acc_arr_transf = []\n", - "disp_imp_arr_transf = []\n", - "avg_odds_diff_arr_transf = []\n", - "\n", - "display(Markdown(\"#### Testing set\"))\n", - "display(Markdown(\"##### Transformed predictions - No fairness constraints\"))\n", - "\n", - "for thresh in tqdm(class_thresh_arr):\n", - " \n", - " fav_inds = dataset_transf_test_pred.scores > thresh\n", - " dataset_transf_test_pred.labels[fav_inds] = dataset_transf_test_pred.favorable_label\n", - " dataset_transf_test_pred.labels[~fav_inds] = dataset_transf_test_pred.unfavorable_label\n", - "\n", - " if (thresh == best_class_thresh):\n", - " disp = True\n", - " else:\n", - " disp = False\n", - " \n", - " metric_test_bef = compute_metrics(dataset_transf_test, dataset_transf_test_pred, \n", - " unprivileged_groups, privileged_groups, disp=disp)\n", - " \n", - " bal_acc_arr_transf.append(metric_test_bef[\"Balanced accuracy\"])\n", - " avg_odds_diff_arr_transf.append(metric_test_bef[\"Average odds difference\"])\n", - " disp_imp_arr_transf.append(metric_test_bef[\"Disparate impact\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax1 = plt.subplots(figsize=(10,7))\n", - "ax1.plot(class_thresh_arr, bal_acc_arr_transf)\n", - "ax1.set_xlabel('Classification Thresholds', fontsize=16, fontweight='bold')\n", - "ax1.set_ylabel('Balanced Accuracy', color='b', fontsize=16, fontweight='bold')\n", - "ax1.xaxis.set_tick_params(labelsize=14)\n", - "ax1.yaxis.set_tick_params(labelsize=14)\n", - "\n", - "\n", - "ax2 = ax1.twinx()\n", - "ax2.plot(class_thresh_arr, np.abs(1.0-np.array(disp_imp_arr_transf)), color='r')\n", - "ax2.set_ylabel('abs(1-disparate impact)', color='r', fontsize=16, fontweight='bold')\n", - "ax2.axvline(np.array(class_thresh_arr)[best_ind], \n", - " color='k', linestyle=':')\n", - "ax2.yaxis.set_tick_params(labelsize=14)\n", - "ax2.grid(True)\n", - "\n", - "disp_imp_at_best_bal_acc_transf = np.abs(1.0-np.array(disp_imp_arr_transf))[best_ind]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```abs(1-disparate impact)``` must be close to zero for classifier predictions to be fair. This measure has improved using classifier trained using the transformed data compared to the original data.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### testing\n", - "assert disp_imp_at_best_bal_acc_transf < disp_imp_at_best_bal_acc_orig" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Summary of Results\n", - "We show the optimal classification thresholds, and the fairness and accuracy metrics." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Classification Thresholds\n", - "\n", - "| Dataset |Classification threshold|\n", - "|-|-|\n", - "|Adult|0.2674|\n", - "|German|0.6732|\n", - "|Compas|0.5148|" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Fairness Metric: Disparate impact, Accuracy Metric: Balanced accuracy\n", - "\n", - "#### Performance\n", - "\n", - "| Dataset |Sex (Acc-Bef)|Sex (Acc-Aft)|Sex (Fair-Bef)|Sex (Fair-Aft)|Race/Age (Acc-Bef)|Race/Age (Acc-Aft)|Race/Age (Fair-Bef)|Race/Age (Fair-Aft)|\n", - "|-|-|-|-|-|-|-|-|-|\n", - "|Adult (Test)|0.7417|0.7021|0.2774|0.7729|0.7417|0.7408|0.4423|0.7645|\n", - "|German (Test)|0.6524|0.5698|0.9948|1.0664|0.6524|0.6067|0.3824|0.8228|\n", - "|Compas (Test)|0.6774|0.6606|0.6631|0.8085|0.6774|0.6790|0.6600|0.8430|\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 0 }