{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd \n", "import matplotlib.pylab as plt\n", "\n", "from sklearn.datasets import load_boston\n", "from sklearn.pipeline import Pipeline\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.metrics import mean_squared_error\n", "\n", "from sklego.preprocessing import InformationFilter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Fairness \n", "\n", "Scikit learn comes with the boston housing dataset. We can make a simple pipeline with it and make us a small model. We can even write the code to also make a plot that can convince us that we're doing well." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X, y = load_boston(return_X_y=True)\n", "\n", "pipe = Pipeline([\n", " (\"scale\", StandardScaler()),\n", " (\"model\", LinearRegression())\n", "])\n", "\n", "plt.scatter(pipe.fit(X, y).predict(X), y)\n", "plt.xlabel(\"predictions\")\n", "plt.ylabel(\"actual\")\n", "plt.title(\"plot that suggests it's not bad\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We could stop our research here if we think that our MSE is \"good enough\" but this would be dangerous. To find out why, we should look at the variables that are being used in our model. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ".. _boston_dataset:\n", "\n", "Boston house prices dataset\n", "---------------------------\n", "\n", "**Data Set Characteristics:** \n", "\n", " :Number of Instances: 506 \n", "\n", " :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.\n", "\n", " :Attribute Information (in order):\n", " - CRIM per capita crime rate by town\n", " - ZN proportion of residential land zoned for lots over 25,000 sq.ft.\n", " - INDUS proportion of non-retail business acres per town\n", " - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n", " - NOX nitric oxides concentration (parts per 10 million)\n", " - RM average number of rooms per dwelling\n", " - AGE proportion of owner-occupied units built prior to 1940\n", " - DIS weighted distances to five Boston employment centres\n", " - RAD index of accessibility to radial highways\n", " - TAX full-value property-tax rate per $10,000\n", " - PTRATIO pupil-teacher ratio by town\n", " - B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town\n", " - LSTAT % lower status of the population\n", " - MEDV Median value of owner\n" ] } ], "source": [ "print(load_boston()['DESCR'][:1200])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This dataset contains features like \"lower status of population\" and \"the proportion of blacks by town\". This is bad. There's a real possibility that our model will overfit on MSE and underfit on fairness when we want to apply it. Scikit-Lego has some support to deal with fairness issues like this one. \n", "\n", "Dealing with issues such as fairness in machine learning can in general be done in three ways: \n", "\n", "- Data preprocessing\n", "- Model constraints\n", "- Prediction postprocessing.\n", "\n", "But before we can dive into methods for getting more fair predictions, we first need to define how to measure fairness\n", "\n", "\n", "## Measuring fairness for Regression\n", "\n", "\n", "Measuring fairness can be done in many ways but we'll consider one definition: the output of the model is fair with regards to groups $A$ and $B$ if prediction has a distribution independent of group $A$ or $B$. In laymans terms: if group $A$ and $B$ don't get the same predictions: no bueno. \n", "\n", "Formally, how much the _means_ of the distributions differ can be written as:\n", "\n", "$$fairness = \\left\\lvert \\frac{1}{|Z_1|} \\sum_{i \\in Z_1} \\hat{y}_{i} - \\frac{1}{|Z_0|} \\sum_{i \\in Z_0} \\hat{y}_{i} \\right\\rvert$$\n", "\n", "where $Z_1$ is the subset of the population where our sensitive attribute is true, and $Z_0$ the subset of the population where the sensitive attribute is false\n", "\n", "To estimate this we'll use bootstrap sampling to measure the models bias.\n", "\n", "\n", "## Measuring fairness for Classification\n", "\n", "A common method for measuring fairness is __demographic parity__[1](#fn1), for example through the p-percent metric. \n", "The idea is that a decision — such as accepting or denying a loan application — ought to be independent of the protected attribute. In other words, we expect the __positive__ rate in both groups to be the same. In the case of a binary decision $\\hat{y}$ and a binary protected attribute $z$, this constraint can be formalized by asking that\n", "\n", "$$P(\\hat{y}=1 | z=0)=P(\\hat{y}=1 | z=1)$$\n", "\n", "You can turn this into a metric by calculating how far short the decision process falls of this exact equality. This metric is called the p% score\n", "\n", "$$\\text{p% score} = \\min \\left(\\frac{P(\\hat{y}=1 | z=1)}{P(\\hat{y}=1 | z=0)}, \\frac{P(\\hat{y}=1 | z=0)}{P(\\hat{y}=1 | z=1)}\\right)$$\n", "\n", "In other words, membership in a protected class should have no correlation with the decision.\n", "\n", "In `sklego` this metric is implemented in `sklego.metrics.p_percent_score` and it works as follows:\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p_percent_score: 0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/vincent/Development/scikit-lego/sklego/metrics.py:77: RuntimeWarning: No samples with y_hat == 1 for x2 == 1, returning 0\n", " RuntimeWarning,\n" ] } ], "source": [ "from sklego.metrics import p_percent_score\n", "from sklearn.linear_model import LogisticRegression\n", "\n", "sensitive_classification_dataset = pd.DataFrame({\n", " \"x1\": [1, 0, 1, 0, 1, 0, 1, 1],\n", " \"x2\": [0, 0, 0, 0, 0, 1, 1, 1],\n", " \"y\": [1, 1, 1, 0, 1, 0, 0, 0]}\n", ")\n", "\n", "X, y = sensitive_classification_dataset.drop(columns='y'), sensitive_classification_dataset['y']\n", "mod_unfair = LogisticRegression(solver='lbfgs').fit(X, y)\n", "\n", "print('p_percent_score:', p_percent_score(sensitive_column=\"x2\")(mod_unfair, X))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Of course, no metric is perfect. If, for example, we used this in a loan approval situation the demographic parity only looks at loans made and not at the rate at which loans are repaid. That might result in a lower percentage of qualified people who are given loans in one population than in another. Another way of measuring fairness could therefore be to measure __equal opportunity__[2](#fn2). This constraint would boil down to:\n", "\n", "$$P(\\hat{y}=1 | z=0, y=1)=P(\\hat{y}=1 | z=1, y=1)$$\n", "\n", "and be turned into a metric in the same way as above:\n", "\n", "$$\\text{equality of opportunity} = \\min \\left(\\frac{P(\\hat{y}=1 | z=1, y=1)}{P(\\hat{y}=1 | z=0, y=1)}, \\frac{P(\\hat{y}=1 | z=0, y=1)}{P(\\hat{y}=1 | z=1, y=1)}\\right)$$\n", "\n", "We can see in the example below that the equal opportunity score does not differ for the models as long as the records where `y_true = 1` are predicted correctly." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "equal_opportunity_score: 0.75\n", "equal_opportunity_score: 0.75\n", "equal_opportunity_score: 0.0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/Users/vincent/Development/scikit-lego/sklego/metrics.py:151: RuntimeWarning: divide by zero encountered in double_scalars\n", " score = np.minimum(p_y1_z1 / p_y1_z0, p_y1_z0 / p_y1_z1)\n" ] } ], "source": [ "from sklego.metrics import equal_opportunity_score\n", "from sklearn.linear_model import LogisticRegression\n", "import types\n", "\n", "sensitive_classification_dataset = pd.DataFrame({\n", " \"x1\": [1, 0, 1, 0, 1, 0, 1, 1],\n", " \"x2\": [0, 0, 0, 0, 0, 1, 1, 1],\n", " \"y\": [1, 1, 1, 0, 1, 0, 0, 1]}\n", ")\n", "\n", "X, y = sensitive_classification_dataset.drop(columns='y'), sensitive_classification_dataset['y']\n", "\n", "mod_1 = types.SimpleNamespace()\n", "\n", "mod_1.predict = lambda X: np.array([1, 0, 1, 0, 1, 0, 1, 1])\n", "print('equal_opportunity_score:', equal_opportunity_score(sensitive_column=\"x2\")(mod_1, X, y))\n", "\n", "mod_1.predict = lambda X: np.array([1, 0, 1, 0, 1, 0, 0, 1])\n", "print('equal_opportunity_score:', equal_opportunity_score(sensitive_column=\"x2\")(mod_1, X, y))\n", "\n", "mod_1.predict = lambda X: np.array([1, 0, 1, 0, 1, 0, 0, 0])\n", "\n", "print('equal_opportunity_score:', equal_opportunity_score(sensitive_column=\"x2\")(mod_1, X, y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "## Data preprocessing\n", "When doing data preprocessing we're trying to remove any bias caused by the sensitive variable from the input dataset. By doing this, we remain flexible in our choice of models.\n", "\n", "### Information Filter\n", "\n", "This is a great opportunity to use the `InformationFilter` which can filter the information of these two sensitive columns away as a transformation step. It does this by projecting all vectors away such that the remaining dataset is orthogonal to the sensitive columns.\n", "\n", "#### How it Works \n", "\n", "The `InformationFilter` uses a variant of the [gram smidt process](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process) to filter information out of the dataset. We can make it visual in two dimensions;\n", "\n", "![proj«img](_static/projections.png)\n", "\n", "To explain what occurs in higher dimensions we need to resort to maths. Take a training matrix $X$ that contains columns $x_1, ..., x_k$. If we assume columns $x_1$ and $x_2$ to be the sensitive columns then the information filter will filter out information using this approach; \n", "\n", "$$\n", "\\begin{split}\n", "v_1 & = x_1 \\\\\n", "v_2 & = x_2 - \\frac{x_2 v_1}{v_1 v_1}\\\\\n", "v_3 & = x_3 - \\frac{x_3 v_1}{v_1 v_1} - \\frac{x_3 v_2}{v_2 v_2}\\\\\n", "... \\\\ \n", "v_k & = x_k - \\frac{x_k v_1}{v_1 v_1} - \\frac{x_k' v_2}{v_2 v_2}\n", "\\end{split}\n", "$$\n", "\n", "Concatenating our vectors (but removing the sensitive ones) gives us a new training matrix $X_{\\text{more fair}} = [v_3, ..., v_k]$. \n", "\n", "#### Experiment \n", "\n", "We will demonstrate the effect of applying this by benchmarking three things: \n", "\n", "1. Keep $X$ as is. \n", "2. Drop the two columns that are sensitive.\n", "3. Use the information filter\n", "\n", "We'll use the regression metric defined above to show the differences in fairness" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "X, y = load_boston(return_X_y=True)\n", "df = pd.DataFrame(X, columns=['crim','zn','indus','chas','nox',\n", " 'rm','age','dis','rad','tax','ptratio',\n", " 'b','lstat'])\n", "X_drop = df.drop(columns=[\"lstat\", \"b\"])\n", "X_fair = InformationFilter([\"lstat\", \"b\"]).fit_transform(df)\n", "X_fair = pd.DataFrame(X_fair, \n", " columns=[n for n in df.columns if n not in ['b', 'lstat']])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def simple_mod():\n", " return Pipeline([(\"scale\", StandardScaler()), (\"mod\", LinearRegression())])\n", "\n", "base_mod = simple_mod().fit(X, y)\n", "drop_mod = simple_mod().fit(X_drop, y)\n", "fair_mod = simple_mod().fit(X_fair, y)\n", "\n", "base_pred = base_mod.predict(X)\n", "drop_pred = drop_mod.predict(X_drop)\n", "fair_pred = fair_mod.predict(X_fair)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that the coefficients of the three models are indeed different." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
crimzninduschasnoxrmagedisradtaxptratioblstat
0-0.9281461.0815690.1409000.681740-2.0567182.6742300.019466-3.1040442.662218-2.076782-2.0606070.849268-3.743627
1-1.5813960.911004-0.2900740.884936-2.5678704.264702-1.270735-3.3318362.215737-2.056246-2.154600NaNNaN
2-0.7635681.0280510.0613930.697504-1.6054646.846774-0.057920-2.5376021.935058-1.779825-2.793069NaNNaN
\n", "
" ], "text/plain": [ " crim zn indus chas nox rm age \\\n", "0 -0.928146 1.081569 0.140900 0.681740 -2.056718 2.674230 0.019466 \n", "1 -1.581396 0.911004 -0.290074 0.884936 -2.567870 4.264702 -1.270735 \n", "2 -0.763568 1.028051 0.061393 0.697504 -1.605464 6.846774 -0.057920 \n", "\n", " dis rad tax ptratio b lstat \n", "0 -3.104044 2.662218 -2.076782 -2.060607 0.849268 -3.743627 \n", "1 -3.331836 2.215737 -2.056246 -2.154600 NaN NaN \n", "2 -2.537602 1.935058 -1.779825 -2.793069 NaN NaN " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame([base_mod.steps[1][1].coef_, drop_mod.steps[1][1].coef_, fair_mod.steps[1][1].coef_], columns=df.columns)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# we're using lstat to select the group to keep things simple\n", "selector = df[\"lstat\"] > np.quantile(df[\"lstat\"], 0.5)\n", "\n", "def bootstrap_means(preds, selector, n=2500, k=25):\n", " grp1 = np.random.choice(preds[selector], (n, k)).mean(axis=1)\n", " grp2 = np.random.choice(preds[~selector], (n, k)).mean(axis=1)\n", " return grp1 - grp2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Original Situation" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 5))\n", "plt.subplot(121)\n", "plt.scatter(base_pred, y)\n", "plt.title(f\"MSE: {mean_squared_error(y, base_pred)}\")\n", "plt.subplot(122)\n", "plt.hist(bootstrap_means(base_pred, selector), bins=30, density=True, alpha=0.8)\n", "plt.title(f\"Fairness Proxy\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Drop two columns" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 5))\n", "plt.subplot(121)\n", "plt.scatter(drop_pred, y)\n", "plt.title(f\"MSE: {mean_squared_error(y, drop_pred)}\")\n", "plt.subplot(122)\n", "plt.hist(bootstrap_means(base_pred, selector), bins=30, density=True, alpha=0.8)\n", "plt.hist(bootstrap_means(drop_pred, selector), bins=30, density=True, alpha=0.8)\n", "plt.title(f\"Fairness Proxy\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Use the Information Filter" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10, 5))\n", "plt.subplot(121)\n", "plt.scatter(fair_pred, y)\n", "plt.title(f\"MSE: {mean_squared_error(y, fair_pred)}\")\n", "plt.subplot(122)\n", "plt.hist(bootstrap_means(base_pred, selector), bins=30, density=True, alpha=0.8)\n", "plt.hist(bootstrap_means(fair_pred, selector), bins=30, density=True, alpha=0.8)\n", "plt.title(f\"Fairness Proxy\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There definitely is a balance between fairness and model accuracy. Which model you'll use depends on the world you want to create by applying your model. \n", "\n", "Note that you can combine models here to make an ensemble too. You can also use the difference between the 1st and last model as a proxy for bias." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model constraints\n", "\n", "Another way we could tackle this fairness problem would be to explicitly take fairness into account when optimizing the parameters of our model. This is implemented in the `DemographicParityClassifier` as well as the `EqualOpportunityClassifier`.\n", "\n", "Both these models are built as an extension of basic logistic regression. Where logistic regression optimizes the following problem:\n", "\n", "$$\\begin{array}{cl}\n", "{\\operatorname{minimize}} & -\\sum_{i=1}^{N} \\log p\\left(y_{i} | \\mathbf{x}_{i},\\boldsymbol{\\theta}\\right)\n", "\\end{array}\n", "$$\n", "\n", "We would like to instead optimize this:\n", "\n", "$$\\begin{array}{cl}{\\operatorname{minimize}} & -\\sum_{i=1}^{N} \\log p\\left(y_{i} | \\mathbf{x}_{i},\n", " \\boldsymbol{\\theta}\\right)\\\\\n", "{\\text { subject to }} & \\text{fairness} \\geq \\mathbf{c}\\end{array} $$ \n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Demographic Parity Classifier\n", "\n", "The p% score discussed above is a nice metric but unfortunately it is rather hard to directly implement in the formulation into our model as it is a non-convex function making it difficult to optimize directly. Also, as the p% rule only depends on which side of the decision boundary an observation lies, it is invariant in small changes in the decision boundary. This causes large saddle points in the objective making optimization even more difficult\n", "\n", "Instead of optimizing for the p% directly, we approximate it by taking the covariance between the users’ sensitive\n", "attributes, $z$m, and the decision boundary. This results in the following formulation of our `DemographicParityClassifier`.\n", "\n", "$$\\begin{array}{cl}{\\operatorname{minimize}} & -\\sum_{i=1}^{N} \\log p\\left(y_{i} | \\mathbf{x}_{i},\n", " \\boldsymbol{\\theta}\\right)\\\\\n", "{\\text { subject to }} & {\\frac{1}{N} \\sum_{i=1}^{N}\\left(\\mathbf{z}_{i}-\\overline{\\mathbf{z}}\\right) d_\n", " \\boldsymbol{\\theta}\\left(\\mathbf{x}_{i}\\right) \\leq \\mathbf{c}} \\\\\n", " {} & {\\frac{1}{N} \\sum_{i=1}^{N}\\left(\\mathbf{z}_{i}-\\overline{\\mathbf{z}}\\right)\n", " d_{\\boldsymbol{\\theta}}\\left(\\mathbf{x}_{i}\\right) \\geq-\\mathbf{c}}\\end{array} $$ \n", " \n", "Let's see what the effect of this is. As this is a Classifier and not a Regressor, we transform the target to a binary variable indicating whether it is above or below the median. Our p% metric also assumes a binary indicator for sensitive columns so we do the same for our `lstat` column. \n", "\n", "Fitting the model is as easy as fitting a normal sklearn model. We just need to supply the columns that should be treated as sensitive to the model, as well as the maximum covariance we want to have. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/vincent/Development/scikit-lego/venv/lib/python3.6/site-packages/sklearn/linear_model/logistic.py:947: ConvergenceWarning: lbfgs failed to converge. Increase the number of iterations.\n", " \"of iterations.\", ConvergenceWarning)\n" ] } ], "source": [ "from sklego.linear_model import DemographicParityClassifier\n", "from sklearn.linear_model import LogisticRegression\n", "from sklego.metrics import p_percent_score\n", "\n", "from sklearn.metrics import accuracy_score, make_scorer\n", "from sklearn.model_selection import GridSearchCV\n", "\n", "df_clf = df.assign(lstat=lambda d: d['lstat'] > np.median(d['lstat']))\n", "y_clf = y > np.median(y)\n", "\n", "normal_classifier = LogisticRegression(solver='lbfgs')\n", "normal_classifier.fit(df_clf, y_clf)\n", "fair_classifier = DemographicParityClassifier(sensitive_cols=\"lstat\", covariance_threshold=0.5)\n", "fair_classifier.fit(df_clf, y_clf);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comparing the two models on their p% scores also shows that the fair classifier has a much higher fairness score at a slight cost in accuracy.\n", "\n", "We'll compare these two models by doing a gridsearch on the effect of the `covariance_threshold`. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "\n", "fair_classifier = GridSearchCV(estimator=DemographicParityClassifier(sensitive_cols=\"lstat\", \n", " covariance_threshold=0.5),\n", " param_grid={\"estimator__covariance_threshold\": \n", " np.linspace(0.01, 1.00, 20)},\n", " cv=5,\n", " refit=\"accuracy_score\",\n", " return_train_score=True,\n", " scoring={\"p_percent_score\": p_percent_score('lstat'),\n", " \"accuracy_score\": make_scorer(accuracy_score)})\n", "\n", "with warnings.catch_warnings():\n", " warnings.simplefilter(\"ignore\")\n", " fair_classifier.fit(df_clf, y_clf);\n", "\n", " pltr = (pd.DataFrame(fair_classifier.cv_results_)\n", " .set_index(\"param_estimator__covariance_threshold\"))\n", "\n", " p_score = p_percent_score('lstat')(normal_classifier, df_clf, y_clf)\n", " acc_score = accuracy_score(normal_classifier.predict(df_clf), y_clf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results of the grid search are shown below. Note that the logistic regression results are of the train set, not the test set. We can see that the increase in fairness comes at the cost of accuracy but this might literally be a fair tradeoff. " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 3))\n", "plt.subplot(121)\n", "plt.plot(np.array(pltr.index), pltr['mean_test_p_percent_score'], label='fairclassifier')\n", "plt.plot(np.linspace(0, 1, 2), [p_score for _ in range(2)], label='logistic-regression')\n", "plt.xlabel(\"covariance threshold\")\n", "plt.legend()\n", "plt.title(\"p% score\")\n", "plt.subplot(122)\n", "plt.plot(np.array(pltr.index), pltr['mean_test_accuracy_score'], label='fairclassifier')\n", "plt.plot(np.linspace(0, 1, 2), [acc_score for _ in range(2)], label='logistic-regression')\n", "plt.xlabel(\"covariance threshold\")\n", "plt.legend()\n", "plt.title(\"accuracy\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Equal opportunity\n", "\n", "In the same spirit as the `DemographicParityClassifier` discussed above, there is also an `EqualOpportunityClassifier` which optimizes\n", "\n", "$$\\begin{array}{cl}{\\operatorname{minimize}} & -\\sum_{i=1}^{N} \\log p\\left(y_{i} | \\mathbf{x}_{i},\n", " \\boldsymbol{\\theta}\\right) \\\\\n", " {\\text { subject to }} & {\\frac{1}{POS} \\sum_{i=1}^{POS}\\left(\\mathbf{z}_{i}-\\overline{\\mathbf{z}}\\right) d\n", " \\boldsymbol{\\theta}\\left(\\mathbf{x}_{i}\\right) \\leq \\mathbf{c}} \\\\\n", " {} & {\\frac{1}{POS} \\sum_{i=1}^{POS}\\left(\\mathbf{z}_{i}-\\overline{\\mathbf{z}}\\right)\n", " d_{\\boldsymbol{\\theta}}\\left(\\mathbf{x}_{i}\\right) \\geq-\\mathbf{c}}\\end{array}$$\n", "\n", "where POS is the subset of the population where `y_true = positive_target`" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "from sklego.linear_model import EqualOpportunityClassifier\n", "\n", "fair_classifier = GridSearchCV(\n", " estimator=EqualOpportunityClassifier(\n", " sensitive_cols=\"lstat\", \n", " covariance_threshold=0.5,\n", " positive_target=True,\n", " ),\n", " param_grid={\"estimator__covariance_threshold\": np.linspace(0.001, 1.00, 20)},\n", " cv=5,\n", " n_jobs=-1,\n", " refit=\"accuracy_score\",\n", " return_train_score=True,\n", " scoring={\"p_percent_score\": p_percent_score('lstat'),\n", " \"equal_opportunity_score\": equal_opportunity_score('lstat'),\n", " \"accuracy_score\": make_scorer(accuracy_score)}\n", ")\n", "\n", "with warnings.catch_warnings():\n", " warnings.simplefilter(\"ignore\")\n", " fair_classifier.fit(df_clf, y_clf);\n", "\n", " pltr = (pd.DataFrame(fair_classifier.cv_results_)\n", " .set_index(\"param_estimator__covariance_threshold\"))\n", "\n", " p_score = p_percent_score('lstat')(normal_classifier, df_clf, y_clf)\n", " acc_score = accuracy_score(normal_classifier.predict(df_clf), y_clf)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(12, 3))\n", "plt.subplot(121)\n", "plt.plot(np.array(pltr.index), pltr['mean_test_equal_opportunity_score'], label='fairclassifier')\n", "plt.plot(np.linspace(0, 1, 2), [p_score for _ in range(2)], label='logistic-regression')\n", "plt.xlabel(\"covariance threshold\")\n", "plt.legend()\n", "plt.title(\"equal opportunity score\")\n", "plt.subplot(122)\n", "plt.plot(np.array(pltr.index), pltr['mean_test_accuracy_score'], label='fairclassifier')\n", "plt.plot(np.linspace(0, 1, 2), [acc_score for _ in range(2)], label='logistic-regression')\n", "plt.xlabel(\"covariance threshold\")\n", "plt.legend()\n", "plt.title(\"accuracy\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sources\n", "\n", "
    \n", "
  1. M. Zafar et al. (2017), Fairness Constraints: Mechanisms for Fair Classification
  2. \n", "
  3. M. Hardt, E. Price and N. Srebro (2016), Equality of Opportunity in Supervised Learning
  4. \n", "
\n", " " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 4 }