diff --git a/examples/demo_gerryfair.ipynb b/examples/demo_gerryfair.ipynb index efdb5983..daaabbe1 100644 --- a/examples/demo_gerryfair.ipynb +++ b/examples/demo_gerryfair.ipynb @@ -1,884 +1,998 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "import warnings\n", - "warnings.filterwarnings(\"ignore\")\n", - "import sys\n", - "sys.path.append(\"../\")\n", - "from aif360.algorithms.inprocessing import GerryFairClassifier\n", - "from aif360.algorithms.inprocessing.gerryfair.clean import array_to_tuple\n", - "from aif360.algorithms.inprocessing.gerryfair.auditor import Auditor\n", - "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult\n", - "from sklearn import svm\n", - "from sklearn import tree\n", - "from sklearn.kernel_ridge import KernelRidge\n", - "from sklearn import linear_model\n", - "from aif360.metrics import BinaryLabelDatasetMetric\n", - "from IPython.display import Image\n", - "import pickle\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# load data set\n", - "data_set = load_preproc_data_adult(sub_samp=1000, balance=True)\n", - "max_iterations = 500" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**instantiate, fit, and predict** \n", - "\n", - "\n", - "We first demonstrate how to instantiate a `GerryFairClassifier`, `train` it with respect to rich subgroup fairness, and `predict` the label of a new example. We remark that when we set the `print_flag = True` at each iteration of the algorithm we print the error, fairness violation, and violated group size of most recent model. The error is the classification error of the classifier. At each round the Learner tries to find a classifier that minimizes the classification error plus a weighted sum of the fairness disparities on all the groups that the Auditor has found up until that point. By contrast the Auditor tries to find the group at each round with the greatest rich subgroup disparity with respect to the Learner's model. We define `violated group size` as the size (as a fraction of the dataset size) of this group, and the `fairness violation` as the `violated group size` times the difference in the statistical rate (FP or FN rate) on the group vs. the whole population. \n", - "\n", - "In the example below we set `max_iterations=500` which is an order of magnitude less than the time to convergence observed in [the rich subgroup fairness empirical paper](https://arxiv.org/abs/1808.08166), but advise that this can be highly dataset dependent. Our target $\\gamma$-disparity is $\\gamma = .005$, our statistical rate is false positive rate or `FP`, and our cost-sensitive classification oracle is linear regression (more on that below). \n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 1, error: 0.263, fairness violation: 0.028780000000000007, violated group size: 0.217\n", - "iteration: 2, error: 0.3815, fairness violation: 0.014390000000000003, violated group size: 0.217\n", - "iteration: 3, error: 0.42099999999999993, fairness violation: 0.009593333333333339, violated group size: 0.283\n", - "iteration: 4, error: 0.44075, fairness violation: 0.007195000000000002, violated group size: 0.217\n", - "iteration: 5, error: 0.45260000000000006, fairness violation: 0.005756000000000001, violated group size: 0.217\n", - "iteration: 6, error: 0.4605000000000001, fairness violation: 0.004796666666666668, violated group size: 0.283\n", - "iteration: 7, error: 0.4661428571428572, fairness violation: 0.004111428571428572, violated group size: 0.217\n", - "iteration: 8, error: 0.470375, fairness violation: 0.0035975000000000017, violated group size: 0.217\n", - "iteration: 9, error: 0.4691111111111112, fairness violation: 0.0033906666666666677, violated group size: 0.283\n", - "iteration: 10, error: 0.4681, fairness violation: 0.003225200000000001, violated group size: 0.283\n", - "iteration: 11, error: 0.4672727272727271, fairness violation: 0.0030898181818181836, violated group size: 0.283\n", - "iteration: 12, error: 0.4665833333333333, fairness violation: 0.0029769999999999996, violated group size: 0.217\n", - "iteration: 13, error: 0.466, fairness violation: 0.0028815384615384627, violated group size: 0.283\n", - "iteration: 14, error: 0.4655000000000001, fairness violation: 0.0027997142857142865, violated group size: 0.217\n", - "iteration: 15, error: 0.46506666666666674, fairness violation: 0.002728800000000001, violated group size: 0.217\n", - "iteration: 16, error: 0.4646875, fairness violation: 0.0026667500000000007, violated group size: 0.217\n", - "iteration: 17, error: 0.4643529411764707, fairness violation: 0.002612000000000001, violated group size: 0.283\n", - "iteration: 18, error: 0.46405555555555567, fairness violation: 0.002563333333333334, violated group size: 0.217\n", - "iteration: 19, error: 0.4637894736842106, fairness violation: 0.0025197894736842096, violated group size: 0.217\n", - "iteration: 20, error: 0.46354999999999996, fairness violation: 0.0024806000000000008, violated group size: 0.283\n", - "iteration: 21, error: 0.4633333333333334, fairness violation: 0.0024451428571428584, violated group size: 0.217\n", - "iteration: 22, error: 0.4631363636363638, fairness violation: 0.0024129090909090914, violated group size: 0.283\n", - "iteration: 23, error: 0.46295652173913054, fairness violation: 0.002383478260869566, violated group size: 0.217\n", - "iteration: 24, error: 0.4627916666666667, fairness violation: 0.002356500000000001, violated group size: 0.283\n", - "iteration: 25, error: 0.4626400000000001, fairness violation: 0.0023316800000000018, violated group size: 0.283\n", - "iteration: 26, error: 0.4625000000000001, fairness violation: 0.0023087692307692314, violated group size: 0.217\n", - "iteration: 27, error: 0.4623703703703705, fairness violation: 0.0022875555555555557, violated group size: 0.217\n", - "iteration: 28, error: 0.46224999999999994, fairness violation: 0.0022678571428571426, violated group size: 0.217\n", - "iteration: 29, error: 0.46213793103448264, fairness violation: 0.0022495172413793106, violated group size: 0.217\n", - "iteration: 30, error: 0.46203333333333335, fairness violation: 0.0022324000000000003, violated group size: 0.217\n", - "iteration: 31, error: 0.46193548387096783, fairness violation: 0.0022163870967741935, violated group size: 0.217\n", - "iteration: 32, error: 0.46184375, fairness violation: 0.0022013749999999993, violated group size: 0.217\n", - "iteration: 33, error: 0.459969696969697, fairness violation: 0.0023319393939393944, violated group size: 0.283\n", - "iteration: 34, error: 0.4582058823529412, fairness violation: 0.002454823529411765, violated group size: 0.217\n", - "iteration: 35, error: 0.45654285714285714, fairness violation: 0.0025706857142857144, violated group size: 0.217\n", - "iteration: 36, error: 0.4549722222222221, fairness violation: 0.0026801111111111114, violated group size: 0.283\n", - "iteration: 37, error: 0.4534864864864866, fairness violation: 0.0027836216216216214, violated group size: 0.283\n", - "iteration: 38, error: 0.45207894736842097, fairness violation: 0.0028816842105263162, violated group size: 0.283\n", - "iteration: 39, error: 0.4507435897435898, fairness violation: 0.0029747179487179492, violated group size: 0.217\n", - "iteration: 40, error: 0.44947499999999996, fairness violation: 0.0030631000000000005, violated group size: 0.217\n", - "iteration: 41, error: 0.44826829268292684, fairness violation: 0.0031471707317073175, violated group size: 0.283\n", - "iteration: 42, error: 0.4471190476190476, fairness violation: 0.0032272380952380955, violated group size: 0.217\n", - "iteration: 43, error: 0.44602325581395347, fairness violation: 0.0033035813953488386, violated group size: 0.283\n", - "iteration: 44, error: 0.44497727272727267, fairness violation: 0.0033764545454545453, violated group size: 0.283\n", - "iteration: 45, error: 0.4439777777777778, fairness violation: 0.003446088888888888, violated group size: 0.217\n", - "iteration: 46, error: 0.44302173913043474, fairness violation: 0.0035126956521739122, violated group size: 0.217\n", - "iteration: 47, error: 0.44210638297872346, fairness violation: 0.0035764680851063826, violated group size: 0.217\n", - "iteration: 48, error: 0.4412291666666666, fairness violation: 0.003637583333333332, violated group size: 0.217\n", - "iteration: 49, error: 0.4403877551020407, fairness violation: 0.0036962040816326523, violated group size: 0.217\n", - "iteration: 50, error: 0.4395600000000001, fairness violation: 0.0037524800000000003, violated group size: 0.217\n", - "iteration: 51, error: 0.43876470588235295, fairness violation: 0.0038065490196078425, violated group size: 0.217\n", - "iteration: 52, error: 0.438, fairness violation: 0.003858538461538461, violated group size: 0.283\n", - "iteration: 53, error: 0.4372641509433963, fairness violation: 0.003908566037735848, violated group size: 0.217\n", - "iteration: 54, error: 0.4365555555555556, fairness violation: 0.003956740740740741, violated group size: 0.283\n", - "iteration: 55, error: 0.4358181818181819, fairness violation: 0.004003163636363636, violated group size: 0.217\n", - "iteration: 56, error: 0.4351071428571429, fairness violation: 0.004047928571428571, violated group size: 0.217\n", - "iteration: 57, error: 0.4344736842105262, fairness violation: 0.004091122807017543, violated group size: 0.217\n", - "iteration: 58, error: 0.43381034482758624, fairness violation: 0.004132827586206895, violated group size: 0.217\n", - "iteration: 59, error: 0.4331694915254237, fairness violation: 0.0041731186440677965, violated group size: 0.283\n", - "iteration: 60, error: 0.43254999999999993, fairness violation: 0.004212066666666666, violated group size: 0.217\n", - "iteration: 61, error: 0.4319508196721312, fairness violation: 0.004249737704918031, violated group size: 0.217\n", - "iteration: 62, error: 0.4313709677419356, fairness violation: 0.004286193548387096, violated group size: 0.217\n", - "iteration: 63, error: 0.43080952380952386, fairness violation: 0.004321492063492062, violated group size: 0.283\n", - "iteration: 64, error: 0.430265625, fairness violation: 0.004355687499999999, violated group size: 0.283\n", - "iteration: 65, error: 0.4297384615384615, fairness violation: 0.004388830769230769, violated group size: 0.283\n", - "iteration: 66, error: 0.42922727272727274, fairness violation: 0.004420969696969697, violated group size: 0.217\n", - "iteration: 67, error: 0.42873134328358203, fairness violation: 0.004452149253731343, violated group size: 0.217\n", - "iteration: 68, error: 0.42824999999999996, fairness violation: 0.0044824117647058815, violated group size: 0.283\n", - "iteration: 69, error: 0.42778260869565227, fairness violation: 0.004511797101449274, violated group size: 0.217\n", - "iteration: 70, error: 0.42732857142857145, fairness violation: 0.004540342857142856, violated group size: 0.283\n", - "iteration: 71, error: 0.42688732394366197, fairness violation: 0.004568084507042252, violated group size: 0.217\n", - "iteration: 72, error: 0.4264583333333332, fairness violation: 0.004595055555555555, violated group size: 0.283\n", - "iteration: 73, error: 0.42604109589041106, fairness violation: 0.004621287671232876, violated group size: 0.217\n", - "iteration: 74, error: 0.4256351351351351, fairness violation: 0.0046468108108108095, violated group size: 0.283\n", - "iteration: 75, error: 0.42524, fairness violation: 0.004671653333333331, violated group size: 0.217\n", - "iteration: 76, error: 0.4248552631578947, fairness violation: 0.004695842105263155, violated group size: 0.217\n", - "iteration: 77, error: 0.42448051948051946, fairness violation: 0.004719402597402596, violated group size: 0.217\n", - "iteration: 78, error: 0.4239871794871795, fairness violation: 0.00475905128205128, violated group size: 0.217\n", - "iteration: 79, error: 0.42363291139240505, fairness violation: 0.004781215189873418, violated group size: 0.283\n", - "iteration: 80, error: 0.42328750000000015, fairness violation: 0.004802824999999999, violated group size: 0.283\n" - ] + "cell_type": "markdown", + "metadata": { + }, + "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_gerryfair.ipynb)\n" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 81, error: 0.4229506172839506, fairness violation: 0.004823901234567901, violated group size: 0.283\n", - "iteration: 82, error: 0.4226219512195123, fairness violation: 0.004844463414634145, violated group size: 0.217\n", - "iteration: 83, error: 0.4221807228915662, fairness violation: 0.004880216867469879, violated group size: 0.217\n", - "iteration: 84, error: 0.42175, fairness violation: 0.004915119047619047, violated group size: 0.217\n", - "iteration: 85, error: 0.4214470588235294, fairness violation: 0.004933882352941174, violated group size: 0.217\n", - "iteration: 86, error: 0.4210348837209302, fairness violation: 0.004967348837209301, violated group size: 0.217\n", - "iteration: 87, error: 0.420632183908046, fairness violation: 0.005000045977011494, violated group size: 0.283\n", - "iteration: 88, error: 0.42035227272727277, fairness violation: 0.0050172045454545434, violated group size: 0.217\n", - "iteration: 89, error: 0.4200786516853933, fairness violation: 0.005033977528089887, violated group size: 0.217\n", - "iteration: 90, error: 0.4198111111111112, fairness violation: 0.005050377777777776, violated group size: 0.283\n", - "iteration: 91, error: 0.4195824175824176, fairness violation: 0.0050664175824175805, violated group size: 0.217\n", - "iteration: 92, error: 0.4193695652173913, fairness violation: 0.005082108695652173, violated group size: 0.217\n", - "iteration: 93, error: 0.41916129032258065, fairness violation: 0.005097462365591397, violated group size: 0.217\n", - "iteration: 94, error: 0.41895744680851066, fairness violation: 0.005112489361702126, violated group size: 0.217\n", - "iteration: 95, error: 0.41875789473684216, fairness violation: 0.005127199999999998, violated group size: 0.217\n", - "iteration: 96, error: 0.41856250000000006, fairness violation: 0.005141604166666665, violated group size: 0.283\n", - "iteration: 97, error: 0.418979381443299, fairness violation: 0.005106494845360823, violated group size: 0.217\n", - "iteration: 98, error: 0.41938775510204085, fairness violation: 0.005072102040816325, violated group size: 0.217\n", - "iteration: 99, error: 0.4197878787878788, fairness violation: 0.0050384040404040376, violated group size: 0.217\n", - "iteration: 100, error: 0.42018000000000005, fairness violation: 0.0050053799999999985, violated group size: 0.217\n", - "iteration: 101, error: 0.42056435643564366, fairness violation: 0.004973009900990098, violated group size: 0.217\n", - "iteration: 102, error: 0.42094117647058826, fairness violation: 0.00494127450980392, violated group size: 0.217\n", - "iteration: 103, error: 0.4213106796116506, fairness violation: 0.004910155339805824, violated group size: 0.217\n", - "iteration: 104, error: 0.4216730769230769, fairness violation: 0.004879634615384614, violated group size: 0.217\n", - "iteration: 105, error: 0.4220285714285715, fairness violation: 0.004849695238095237, violated group size: 0.217\n", - "iteration: 106, error: 0.4223773584905662, fairness violation: 0.004820320754716981, violated group size: 0.283\n", - "iteration: 107, error: 0.42271962616822434, fairness violation: 0.004791495327102803, violated group size: 0.217\n", - "iteration: 108, error: 0.4230555555555556, fairness violation: 0.0047632037037037035, violated group size: 0.217\n", - "iteration: 109, error: 0.4233853211009175, fairness violation: 0.00473543119266055, violated group size: 0.217\n", - "iteration: 110, error: 0.4237090909090908, fairness violation: 0.004708163636363636, violated group size: 0.217\n", - "iteration: 111, error: 0.424027027027027, fairness violation: 0.004681387387387387, violated group size: 0.283\n", - "iteration: 112, error: 0.42433928571428586, fairness violation: 0.004655089285714286, violated group size: 0.283\n", - "iteration: 113, error: 0.4241238938053097, fairness violation: 0.004671504424778761, violated group size: 0.217\n", - "iteration: 114, error: 0.42442982456140343, fairness violation: 0.004645754385964912, violated group size: 0.283\n", - "iteration: 115, error: 0.42473043478260875, fairness violation: 0.0046204521739130425, violated group size: 0.283\n", - "iteration: 116, error: 0.42502586206896553, fairness violation: 0.0045955862068965524, violated group size: 0.283\n", - "iteration: 117, error: 0.42481196581196584, fairness violation: 0.004611948717948717, violated group size: 0.217\n", - "iteration: 118, error: 0.4251016949152542, fairness violation: 0.004587576271186439, violated group size: 0.217\n", - "iteration: 119, error: 0.42489075630252104, fairness violation: 0.004603731092436974, violated group size: 0.217\n", - "iteration: 120, error: 0.4251750000000001, fairness violation: 0.0045798333333333325, violated group size: 0.217\n", - "iteration: 121, error: 0.4249669421487604, fairness violation: 0.004595785123966942, violated group size: 0.283\n", - "iteration: 122, error: 0.4247622950819671, fairness violation: 0.0046114754098360656, violated group size: 0.217\n", - "iteration: 123, error: 0.42456097560975614, fairness violation: 0.00462691056910569, violated group size: 0.217\n", - "iteration: 124, error: 0.42436290322580644, fairness violation: 0.004642096774193548, violated group size: 0.217\n", - "iteration: 125, error: 0.4241680000000001, fairness violation: 0.00465704, violated group size: 0.217\n", - "iteration: 126, error: 0.4239761904761905, fairness violation: 0.004671746031746031, violated group size: 0.217\n", - "iteration: 127, error: 0.42425196850393704, fairness violation: 0.004648629921259842, violated group size: 0.217\n", - "iteration: 128, error: 0.4240625, fairness violation: 0.004663171874999999, violated group size: 0.217\n", - "iteration: 129, error: 0.4238759689922481, fairness violation: 0.004677488372093024, violated group size: 0.283\n", - "iteration: 130, error: 0.42369230769230776, fairness violation: 0.004691584615384614, violated group size: 0.217\n", - "iteration: 131, error: 0.42351145038167937, fairness violation: 0.004705465648854962, violated group size: 0.217\n", - "iteration: 132, error: 0.4233333333333333, fairness violation: 0.004719136363636364, violated group size: 0.283\n", - "iteration: 133, error: 0.423157894736842, fairness violation: 0.0047326015037594, violated group size: 0.217\n", - "iteration: 134, error: 0.4229850746268656, fairness violation: 0.004745865671641791, violated group size: 0.217\n", - "iteration: 135, error: 0.42281481481481475, fairness violation: 0.004758933333333335, violated group size: 0.283\n", - "iteration: 136, error: 0.4226470588235294, fairness violation: 0.004771808823529411, violated group size: 0.217\n", - "iteration: 137, error: 0.42248175182481745, fairness violation: 0.004784496350364964, violated group size: 0.283\n", - "iteration: 138, error: 0.42231884057971014, fairness violation: 0.004797000000000002, violated group size: 0.283\n", - "iteration: 139, error: 0.42215827338129497, fairness violation: 0.004809323741007196, violated group size: 0.283\n", - "iteration: 140, error: 0.42200000000000004, fairness violation: 0.004821471428571429, violated group size: 0.217\n", - "iteration: 141, error: 0.4218439716312057, fairness violation: 0.0048334468085106394, violated group size: 0.217\n", - "iteration: 142, error: 0.42169014084507045, fairness violation: 0.004845253521126761, violated group size: 0.283\n", - "iteration: 143, error: 0.4215384615384616, fairness violation: 0.004856895104895106, violated group size: 0.283\n", - "iteration: 144, error: 0.4213888888888888, fairness violation: 0.004868375, violated group size: 0.217\n", - "iteration: 145, error: 0.42124137931034483, fairness violation: 0.004879696551724138, violated group size: 0.217\n", - "iteration: 146, error: 0.4210958904109589, fairness violation: 0.00489086301369863, violated group size: 0.217\n", - "iteration: 147, error: 0.4209523809523809, fairness violation: 0.004901877551020409, violated group size: 0.217\n", - "iteration: 148, error: 0.42081081081081084, fairness violation: 0.004912743243243244, violated group size: 0.217\n", - "iteration: 149, error: 0.42067114093959734, fairness violation: 0.004923463087248323, violated group size: 0.283\n", - "iteration: 150, error: 0.4205333333333334, fairness violation: 0.004934040000000001, violated group size: 0.217\n", - "iteration: 151, error: 0.4203973509933776, fairness violation: 0.004944476821192053, violated group size: 0.217\n", - "iteration: 152, error: 0.4202631578947368, fairness violation: 0.0049547763157894754, violated group size: 0.283\n", - "iteration: 153, error: 0.4201307189542483, fairness violation: 0.00496494117647059, violated group size: 0.283\n", - "iteration: 154, error: 0.42, fairness violation: 0.004974974025974027, violated group size: 0.283\n", - "iteration: 155, error: 0.4198709677419355, fairness violation: 0.0049848774193548395, violated group size: 0.217\n", - "iteration: 156, error: 0.4197435897435898, fairness violation: 0.004994653846153847, violated group size: 0.217\n", - "iteration: 157, error: 0.4196178343949045, fairness violation: 0.0050043057324840766, violated group size: 0.217\n" - ] + "cell_type": "code", + "source": [ + "!pip install aif360" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nTdJbsvOhAeU", + "outputId": "3da8ff56-8a28-47a3-c8e9-b751018039c6" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting aif360\n", + " Downloading aif360-0.5.0-py3-none-any.whl (214 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m214.1/214.1 kB\u001b[0m \u001b[31m2.1 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" + ] + } + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 158, error: 0.4194936708860761, fairness violation: 0.005013835443037975, violated group size: 0.217\n", - "iteration: 159, error: 0.41937106918239, fairness violation: 0.005023245283018869, violated group size: 0.283\n", - "iteration: 160, error: 0.41925000000000007, fairness violation: 0.0050325375, violated group size: 0.217\n", - "iteration: 161, error: 0.4191304347826087, fairness violation: 0.005041714285714285, violated group size: 0.217\n", - "iteration: 162, error: 0.41901234567901235, fairness violation: 0.005050777777777778, violated group size: 0.283\n", - "iteration: 163, error: 0.41889570552147243, fairness violation: 0.005059730061349694, violated group size: 0.283\n", - "iteration: 164, error: 0.4191402439024391, fairness violation: 0.005039463414634148, violated group size: 0.283\n", - "iteration: 165, error: 0.41938181818181824, fairness violation: 0.005019442424242424, violated group size: 0.217\n", - "iteration: 166, error: 0.4192650602409639, fairness violation: 0.005028421686746988, violated group size: 0.217\n", - "iteration: 167, error: 0.41950299401197605, fairness violation: 0.005008706586826348, violated group size: 0.217\n", - "iteration: 168, error: 0.41973809523809513, fairness violation: 0.004989226190476189, violated group size: 0.217\n", - "iteration: 169, error: 0.41997041420118336, fairness violation: 0.0049699763313609474, violated group size: 0.283\n", - "iteration: 170, error: 0.4202, fairness violation: 0.00495095294117647, violated group size: 0.283\n", - "iteration: 171, error: 0.4204269005847953, fairness violation: 0.004932152046783625, violated group size: 0.217\n", - "iteration: 172, error: 0.42065116279069764, fairness violation: 0.00491356976744186, violated group size: 0.217\n", - "iteration: 173, error: 0.4208728323699421, fairness violation: 0.004895202312138728, violated group size: 0.217\n", - "iteration: 174, error: 0.42109195402298855, fairness violation: 0.004877045977011494, violated group size: 0.217\n", - "iteration: 175, error: 0.4213085714285715, fairness violation: 0.004859097142857142, violated group size: 0.217\n", - "iteration: 176, error: 0.42152272727272727, fairness violation: 0.0048413522727272715, violated group size: 0.217\n", - "iteration: 177, error: 0.42173446327683617, fairness violation: 0.00482380790960452, violated group size: 0.217\n", - "iteration: 178, error: 0.42161235955056187, fairness violation: 0.004833280898876404, violated group size: 0.217\n", - "iteration: 179, error: 0.42182122905027924, fairness violation: 0.004815977653631285, violated group size: 0.217\n", - "iteration: 180, error: 0.4220277777777778, fairness violation: 0.004798866666666665, violated group size: 0.217\n", - "iteration: 181, error: 0.42223204419889504, fairness violation: 0.004781944751381214, violated group size: 0.283\n", - "iteration: 182, error: 0.4224340659340659, fairness violation: 0.004765208791208789, violated group size: 0.217\n", - "iteration: 183, error: 0.4226338797814208, fairness violation: 0.004748655737704917, violated group size: 0.217\n", - "iteration: 184, error: 0.4228315217391304, fairness violation: 0.004732282608695651, violated group size: 0.217\n", - "iteration: 185, error: 0.4230270270270271, fairness violation: 0.004716086486486487, violated group size: 0.217\n", - "iteration: 186, error: 0.4229032258064515, fairness violation: 0.0047257311827957, violated group size: 0.283\n", - "iteration: 187, error: 0.4230962566844919, fairness violation: 0.0047097433155080205, violated group size: 0.217\n", - "iteration: 188, error: 0.4229734042553191, fairness violation: 0.00471931914893617, violated group size: 0.283\n", - "iteration: 189, error: 0.4231640211640213, fairness violation: 0.004703534391534391, violated group size: 0.217\n", - "iteration: 190, error: 0.42304210526315794, fairness violation: 0.004713042105263158, violated group size: 0.217\n", - "iteration: 191, error: 0.4232303664921467, fairness violation: 0.004697455497382198, violated group size: 0.217\n", - "iteration: 192, error: 0.42310937499999995, fairness violation: 0.004706895833333333, violated group size: 0.217\n", - "iteration: 193, error: 0.42329533678756476, fairness violation: 0.004691502590673575, violated group size: 0.283\n", - "iteration: 194, error: 0.4231752577319588, fairness violation: 0.004700876288659792, violated group size: 0.217\n", - "iteration: 195, error: 0.4230564102564103, fairness violation: 0.004710153846153845, violated group size: 0.217\n", - "iteration: 196, error: 0.4229387755102041, fairness violation: 0.004719336734693878, violated group size: 0.283\n", - "iteration: 197, error: 0.4228223350253807, fairness violation: 0.004728426395939086, violated group size: 0.283\n", - "iteration: 198, error: 0.4227070707070707, fairness violation: 0.004737424242424242, violated group size: 0.217\n", - "iteration: 199, error: 0.4228894472361809, fairness violation: 0.004722341708542713, violated group size: 0.217\n", - "iteration: 200, error: 0.42277499999999996, fairness violation: 0.004731279999999999, violated group size: 0.217\n", - "iteration: 201, error: 0.4226616915422886, fairness violation: 0.004740129353233829, violated group size: 0.217\n", - "iteration: 202, error: 0.4225495049504951, fairness violation: 0.00474889108910891, violated group size: 0.217\n", - "iteration: 203, error: 0.42243842364532025, fairness violation: 0.004757566502463053, violated group size: 0.283\n", - "iteration: 204, error: 0.42232843137254905, fairness violation: 0.004766156862745097, violated group size: 0.283\n", - "iteration: 205, error: 0.422219512195122, fairness violation: 0.004774663414634145, violated group size: 0.217\n", - "iteration: 206, error: 0.422111650485437, fairness violation: 0.004783087378640775, violated group size: 0.217\n", - "iteration: 207, error: 0.4220048309178744, fairness violation: 0.00479142995169082, violated group size: 0.217\n", - "iteration: 208, error: 0.4218990384615385, fairness violation: 0.004799692307692306, violated group size: 0.217\n", - "iteration: 209, error: 0.42179425837320567, fairness violation: 0.004807875598086124, violated group size: 0.217\n", - "iteration: 210, error: 0.4216904761904762, fairness violation: 0.004815980952380952, violated group size: 0.217\n", - "iteration: 211, error: 0.42158767772511846, fairness violation: 0.0048240094786729856, violated group size: 0.217\n", - "iteration: 212, error: 0.42148584905660386, fairness violation: 0.004831962264150944, violated group size: 0.217\n", - "iteration: 213, error: 0.4213849765258215, fairness violation: 0.004839840375586855, violated group size: 0.283\n", - "iteration: 214, error: 0.421285046728972, fairness violation: 0.0048476448598130835, violated group size: 0.217\n", - "iteration: 215, error: 0.42118604651162794, fairness violation: 0.004855376744186045, violated group size: 0.217\n", - "iteration: 216, error: 0.4210879629629629, fairness violation: 0.004863037037037037, violated group size: 0.283\n", - "iteration: 217, error: 0.42099078341013824, fairness violation: 0.004870626728110601, violated group size: 0.283\n", - "iteration: 218, error: 0.42089449541284396, fairness violation: 0.004878146788990825, violated group size: 0.217\n", - "iteration: 219, error: 0.42079908675799094, fairness violation: 0.004885598173515983, violated group size: 0.283\n", - "iteration: 220, error: 0.4207045454545455, fairness violation: 0.004892981818181818, violated group size: 0.283\n", - "iteration: 221, error: 0.4206108597285068, fairness violation: 0.004900298642533936, violated group size: 0.283\n", - "iteration: 222, error: 0.4205180180180179, fairness violation: 0.004907549549549549, violated group size: 0.217\n", - "iteration: 223, error: 0.4204260089686098, fairness violation: 0.004914735426008968, violated group size: 0.217\n", - "iteration: 224, error: 0.4203348214285714, fairness violation: 0.004921857142857143, violated group size: 0.283\n", - "iteration: 225, error: 0.4202444444444444, fairness violation: 0.004928915555555555, violated group size: 0.217\n", - "iteration: 226, error: 0.42015486725663725, fairness violation: 0.004935911504424777, violated group size: 0.217\n", - "iteration: 227, error: 0.4200660792951542, fairness violation: 0.004942845814977973, violated group size: 0.217\n", - "iteration: 228, error: 0.4199780701754386, fairness violation: 0.004949719298245614, violated group size: 0.217\n", - "iteration: 229, error: 0.4198908296943231, fairness violation: 0.004956532751091703, violated group size: 0.283\n", - "iteration: 230, error: 0.419804347826087, fairness violation: 0.004963286956521739, violated group size: 0.283\n", - "iteration: 231, error: 0.4197186147186147, fairness violation: 0.004969982683982686, violated group size: 0.283\n", - "iteration: 232, error: 0.4196336206896552, fairness violation: 0.004976620689655175, violated group size: 0.283\n", - "iteration: 233, error: 0.419549356223176, fairness violation: 0.004983201716738197, violated group size: 0.283\n", - "iteration: 234, error: 0.419465811965812, fairness violation: 0.0049897264957264945, violated group size: 0.217\n" - ] + "cell_type": "code", + "execution_count": 5, + "metadata": { + "pycharm": { + "is_executing": false + }, + "id": "8MX9m3k_g9Ft" + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\")\n", + "import sys\n", + "sys.path.append(\"../\")\n", + "from aif360.algorithms.inprocessing import GerryFairClassifier\n", + "from aif360.algorithms.inprocessing.gerryfair.clean import array_to_tuple\n", + "from aif360.algorithms.inprocessing.gerryfair.auditor import Auditor\n", + "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult\n", + "from sklearn import svm\n", + "from sklearn import tree\n", + "from sklearn.kernel_ridge import KernelRidge\n", + "from sklearn import linear_model\n", + "from aif360.metrics import BinaryLabelDatasetMetric\n", + "from IPython.display import Image\n", + "import pickle\n", + "import matplotlib.pyplot as plt" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 235, error: 0.4193829787234044, fairness violation: 0.00499619574468085, violated group size: 0.217\n", - "iteration: 236, error: 0.41930084745762713, fairness violation: 0.005002610169491525, violated group size: 0.283\n", - "iteration: 237, error: 0.4192194092827004, fairness violation: 0.005008970464135021, violated group size: 0.283\n", - "iteration: 238, error: 0.41913865546218493, fairness violation: 0.00501527731092437, violated group size: 0.283\n", - "iteration: 239, error: 0.4190585774058578, fairness violation: 0.005021531380753138, violated group size: 0.283\n", - "iteration: 240, error: 0.4189791666666667, fairness violation: 0.005027733333333333, violated group size: 0.217\n", - "iteration: 241, error: 0.41890041493775937, fairness violation: 0.005033883817427385, violated group size: 0.217\n", - "iteration: 242, error: 0.4188223140495868, fairness violation: 0.0050399834710743805, violated group size: 0.217\n", - "iteration: 243, error: 0.4187448559670781, fairness violation: 0.005046032921810699, violated group size: 0.217\n", - "iteration: 244, error: 0.41890983606557386, fairness violation: 0.005032467213114753, violated group size: 0.217\n", - "iteration: 245, error: 0.419073469387755, fairness violation: 0.005019012244897959, violated group size: 0.217\n", - "iteration: 246, error: 0.41923577235772364, fairness violation: 0.005005666666666667, violated group size: 0.283\n", - "iteration: 247, error: 0.4191578947368422, fairness violation: 0.005011757085020243, violated group size: 0.217\n", - "iteration: 248, error: 0.41908064516129034, fairness violation: 0.005017798387096774, violated group size: 0.283\n", - "iteration: 249, error: 0.4192409638554217, fairness violation: 0.005004618473895581, violated group size: 0.217\n", - "iteration: 250, error: 0.4194000000000001, fairness violation: 0.004991544, violated group size: 0.217\n", - "iteration: 251, error: 0.4195577689243028, fairness violation: 0.004978573705179282, violated group size: 0.283\n", - "iteration: 252, error: 0.4197142857142857, fairness violation: 0.004965706349206349, violated group size: 0.217\n", - "iteration: 253, error: 0.4198695652173912, fairness violation: 0.00495294071146245, violated group size: 0.217\n", - "iteration: 254, error: 0.42002362204724414, fairness violation: 0.00494027559055118, violated group size: 0.217\n", - "iteration: 255, error: 0.4201764705882353, fairness violation: 0.004927709803921568, violated group size: 0.217\n", - "iteration: 256, error: 0.420328125, fairness violation: 0.004915242187499999, violated group size: 0.217\n", - "iteration: 257, error: 0.42047859922178993, fairness violation: 0.004902871595330739, violated group size: 0.217\n", - "iteration: 258, error: 0.42062790697674424, fairness violation: 0.004890596899224807, violated group size: 0.217\n", - "iteration: 259, error: 0.4207760617760617, fairness violation: 0.004878416988416988, violated group size: 0.283\n", - "iteration: 260, error: 0.42069615384615383, fairness violation: 0.004884692307692307, violated group size: 0.217\n", - "iteration: 261, error: 0.42061685823754785, fairness violation: 0.004890919540229886, violated group size: 0.283\n", - "iteration: 262, error: 0.42076335877862603, fairness violation: 0.004878877862595419, violated group size: 0.217\n", - "iteration: 263, error: 0.4209087452471483, fairness violation: 0.004866927756653992, violated group size: 0.217\n", - "iteration: 264, error: 0.4208295454545454, fairness violation: 0.004873151515151516, violated group size: 0.283\n", - "iteration: 265, error: 0.4209735849056603, fairness violation: 0.004861313207547171, violated group size: 0.283\n", - "iteration: 266, error: 0.4211165413533834, fairness violation: 0.004849563909774436, violated group size: 0.217\n", - "iteration: 267, error: 0.42125842696629223, fairness violation: 0.0048379026217228475, violated group size: 0.217\n", - "iteration: 268, error: 0.42139925373134324, fairness violation: 0.004826328358208956, violated group size: 0.283\n", - "iteration: 269, error: 0.42131970260223045, fairness violation: 0.0048325873605947955, violated group size: 0.217\n", - "iteration: 270, error: 0.42145925925925937, fairness violation: 0.00482111851851852, violated group size: 0.283\n", - "iteration: 271, error: 0.42159778597785963, fairness violation: 0.004809734317343174, violated group size: 0.217\n", - "iteration: 272, error: 0.42173529411764704, fairness violation: 0.004798433823529413, violated group size: 0.283\n", - "iteration: 273, error: 0.4216556776556777, fairness violation: 0.004804703296703296, violated group size: 0.217\n", - "iteration: 274, error: 0.42157664233576647, fairness violation: 0.00481092700729927, violated group size: 0.217\n", - "iteration: 275, error: 0.42171272727272724, fairness violation: 0.004799745454545455, violated group size: 0.217\n", - "iteration: 276, error: 0.42184782608695653, fairness violation: 0.004788644927536233, violated group size: 0.217\n", - "iteration: 277, error: 0.4219819494584837, fairness violation: 0.004777624548736462, violated group size: 0.217\n", - "iteration: 278, error: 0.42190287769784157, fairness violation: 0.004783856115107913, violated group size: 0.217\n", - "iteration: 279, error: 0.42182437275985674, fairness violation: 0.004790043010752689, violated group size: 0.217\n", - "iteration: 280, error: 0.42174642857142863, fairness violation: 0.004796185714285715, violated group size: 0.283\n", - "iteration: 281, error: 0.42166903914590753, fairness violation: 0.0048022846975088965, violated group size: 0.283\n", - "iteration: 282, error: 0.4218014184397163, fairness violation: 0.00479141134751773, violated group size: 0.217\n", - "iteration: 283, error: 0.42172438162544174, fairness violation: 0.0047974840989399295, violated group size: 0.217\n", - "iteration: 284, error: 0.4216478873239437, fairness violation: 0.004803514084507042, violated group size: 0.217\n", - "iteration: 285, error: 0.42157192982456126, fairness violation: 0.004809501754385964, violated group size: 0.217\n", - "iteration: 286, error: 0.4217027972027972, fairness violation: 0.004798755244755245, violated group size: 0.217\n", - "iteration: 287, error: 0.4218327526132404, fairness violation: 0.004788083623693379, violated group size: 0.283\n", - "iteration: 288, error: 0.4219618055555556, fairness violation: 0.004777486111111113, violated group size: 0.283\n", - "iteration: 289, error: 0.4218858131487888, fairness violation: 0.004783480968858131, violated group size: 0.217\n", - "iteration: 290, error: 0.4218103448275861, fairness violation: 0.004789434482758621, violated group size: 0.217\n", - "iteration: 291, error: 0.42193814432989696, fairness violation: 0.004778941580756014, violated group size: 0.283\n", - "iteration: 292, error: 0.42186301369863016, fairness violation: 0.0047848698630136985, violated group size: 0.217\n", - "iteration: 293, error: 0.4217883959044368, fairness violation: 0.004790757679180888, violated group size: 0.217\n", - "iteration: 294, error: 0.42171428571428576, fairness violation: 0.004796605442176871, violated group size: 0.217\n", - "iteration: 295, error: 0.4216406779661017, fairness violation: 0.004802413559322035, violated group size: 0.217\n", - "iteration: 296, error: 0.4215675675675675, fairness violation: 0.004808182432432432, violated group size: 0.217\n", - "iteration: 297, error: 0.4214949494949495, fairness violation: 0.00481391245791246, violated group size: 0.283\n", - "iteration: 298, error: 0.4214228187919464, fairness violation: 0.0048196040268456385, violated group size: 0.217\n", - "iteration: 299, error: 0.42135117056856186, fairness violation: 0.0048252575250836115, violated group size: 0.217\n", - "iteration: 300, error: 0.42128, fairness violation: 0.004830873333333335, violated group size: 0.283\n", - "iteration: 301, error: 0.42120930232558146, fairness violation: 0.004836451827242525, violated group size: 0.217\n", - "iteration: 302, error: 0.42113907284768215, fairness violation: 0.004841993377483444, violated group size: 0.217\n", - "iteration: 303, error: 0.42106930693069305, fairness violation: 0.004847498349834984, violated group size: 0.217\n", - "iteration: 304, error: 0.4211940789473684, fairness violation: 0.004837263157894738, violated group size: 0.283\n", - "iteration: 305, error: 0.4211245901639345, fairness violation: 0.004842747540983607, violated group size: 0.283\n", - "iteration: 306, error: 0.4210555555555555, fairness violation: 0.004848196078431373, violated group size: 0.217\n", - "iteration: 307, error: 0.42098697068403895, fairness violation: 0.004853609120521175, violated group size: 0.283\n", - "iteration: 308, error: 0.4209188311688312, fairness violation: 0.004858987012987015, violated group size: 0.283\n", - "iteration: 309, error: 0.42085113268608415, fairness violation: 0.00486433009708738, violated group size: 0.283\n" - ] + "cell_type": "code", + "source": [ + "import os\n", + "import urllib\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": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "R7RtdPi0hmfH", + "outputId": "190a4308-9e85-4da3-96cb-ae042eb09453" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Some files are missing. Downloading now.\n" + ] + } + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 310, error: 0.4207838709677419, fairness violation: 0.00486963870967742, violated group size: 0.283\n", - "iteration: 311, error: 0.420717041800643, fairness violation: 0.004874913183279744, violated group size: 0.217\n", - "iteration: 312, error: 0.42065064102564104, fairness violation: 0.0048801538461538466, violated group size: 0.217\n", - "iteration: 313, error: 0.42058466453674115, fairness violation: 0.0048853610223642185, violated group size: 0.217\n", - "iteration: 314, error: 0.42051910828025474, fairness violation: 0.004890535031847135, violated group size: 0.217\n", - "iteration: 315, error: 0.4204539682539683, fairness violation: 0.004895676190476191, violated group size: 0.217\n", - "iteration: 316, error: 0.4203892405063292, fairness violation: 0.004900784810126583, violated group size: 0.217\n", - "iteration: 317, error: 0.4203249211356468, fairness violation: 0.004905861198738172, violated group size: 0.283\n", - "iteration: 318, error: 0.4202610062893082, fairness violation: 0.00491090566037736, violated group size: 0.217\n", - "iteration: 319, error: 0.4201974921630094, fairness violation: 0.004915918495297806, violated group size: 0.217\n", - "iteration: 320, error: 0.4201343749999999, fairness violation: 0.004920900000000002, violated group size: 0.217\n", - "iteration: 321, error: 0.4200716510903427, fairness violation: 0.004925850467289721, violated group size: 0.217\n", - "iteration: 322, error: 0.4200093167701862, fairness violation: 0.0049307701863354056, violated group size: 0.283\n", - "iteration: 323, error: 0.4199473684210526, fairness violation: 0.00493565944272446, violated group size: 0.283\n", - "iteration: 324, error: 0.41988580246913576, fairness violation: 0.004940518518518519, violated group size: 0.217\n", - "iteration: 325, error: 0.41982461538461535, fairness violation: 0.004945347692307694, violated group size: 0.217\n", - "iteration: 326, error: 0.4197638036809816, fairness violation: 0.004950147239263805, violated group size: 0.283\n", - "iteration: 327, error: 0.4197033639143731, fairness violation: 0.004954917431192661, violated group size: 0.283\n", - "iteration: 328, error: 0.4196432926829268, fairness violation: 0.004959658536585366, violated group size: 0.217\n", - "iteration: 329, error: 0.41958358662613987, fairness violation: 0.004964370820668694, violated group size: 0.283\n", - "iteration: 330, error: 0.41952424242424236, fairness violation: 0.004969054545454545, violated group size: 0.217\n", - "iteration: 331, error: 0.41946525679758306, fairness violation: 0.00497370996978852, violated group size: 0.217\n", - "iteration: 332, error: 0.41940662650602417, fairness violation: 0.004978337349397591, violated group size: 0.217\n", - "iteration: 333, error: 0.4193483483483482, fairness violation: 0.004982936936936937, violated group size: 0.217\n", - "iteration: 334, error: 0.4192904191616766, fairness violation: 0.004987508982035928, violated group size: 0.217\n", - "iteration: 335, error: 0.4192328358208956, fairness violation: 0.004992053731343284, violated group size: 0.283\n", - "iteration: 336, error: 0.4191755952380953, fairness violation: 0.00499657142857143, violated group size: 0.283\n", - "iteration: 337, error: 0.4191186943620178, fairness violation: 0.0050010623145400595, violated group size: 0.217\n", - "iteration: 338, error: 0.41906213017751476, fairness violation: 0.005005526627218935, violated group size: 0.217\n", - "iteration: 339, error: 0.4190058997050148, fairness violation: 0.005009964601769911, violated group size: 0.217\n", - "iteration: 340, error: 0.41894999999999993, fairness violation: 0.005014376470588236, violated group size: 0.283\n", - "iteration: 341, error: 0.41889442815249267, fairness violation: 0.005018762463343108, violated group size: 0.217\n", - "iteration: 342, error: 0.41883918128654973, fairness violation: 0.005023122807017544, violated group size: 0.217\n", - "iteration: 343, error: 0.41878425655976675, fairness violation: 0.0050274577259475225, violated group size: 0.283\n", - "iteration: 344, error: 0.4187296511627907, fairness violation: 0.005031767441860465, violated group size: 0.217\n", - "iteration: 345, error: 0.4186753623188406, fairness violation: 0.005036052173913045, violated group size: 0.283\n", - "iteration: 346, error: 0.4186213872832369, fairness violation: 0.005040312138728323, violated group size: 0.217\n", - "iteration: 347, error: 0.41856772334293946, fairness violation: 0.005044547550432276, violated group size: 0.283\n", - "iteration: 348, error: 0.41851436781609197, fairness violation: 0.005048758620689655, violated group size: 0.217\n", - "iteration: 349, error: 0.418461318051576, fairness violation: 0.005052945558739255, violated group size: 0.283\n", - "iteration: 350, error: 0.4185771428571428, fairness violation: 0.005043468571428572, violated group size: 0.283\n", - "iteration: 351, error: 0.4186923076923077, fairness violation: 0.005034045584045584, violated group size: 0.217\n", - "iteration: 352, error: 0.4188068181818182, fairness violation: 0.005024676136363637, violated group size: 0.283\n", - "iteration: 353, error: 0.4189206798866855, fairness violation: 0.005015359773371105, violated group size: 0.217\n", - "iteration: 354, error: 0.41903389830508475, fairness violation: 0.005006096045197741, violated group size: 0.283\n", - "iteration: 355, error: 0.41914647887323936, fairness violation: 0.004996884507042254, violated group size: 0.283\n", - "iteration: 356, error: 0.4192584269662922, fairness violation: 0.004987724719101122, violated group size: 0.217\n", - "iteration: 357, error: 0.41936974789915965, fairness violation: 0.0049786162464986, violated group size: 0.217\n", - "iteration: 358, error: 0.41948044692737424, fairness violation: 0.004969558659217878, violated group size: 0.217\n", - "iteration: 359, error: 0.41959052924791085, fairness violation: 0.004960551532033426, violated group size: 0.283\n", - "iteration: 360, error: 0.4195361111111111, fairness violation: 0.004964855555555557, violated group size: 0.283\n", - "iteration: 361, error: 0.4196454293628808, fairness violation: 0.004955911357340723, violated group size: 0.283\n", - "iteration: 362, error: 0.4197541436464089, fairness violation: 0.004947016574585636, violated group size: 0.217\n", - "iteration: 363, error: 0.4198622589531681, fairness violation: 0.004938170798898072, violated group size: 0.283\n", - "iteration: 364, error: 0.41996978021978026, fairness violation: 0.004929373626373626, violated group size: 0.217\n", - "iteration: 365, error: 0.42007671232876714, fairness violation: 0.004920624657534246, violated group size: 0.217\n", - "iteration: 366, error: 0.42018306010928963, fairness violation: 0.004911923497267759, violated group size: 0.217\n", - "iteration: 367, error: 0.4202888283378746, fairness violation: 0.004903269754768393, violated group size: 0.217\n", - "iteration: 368, error: 0.42039402173913043, fairness violation: 0.00489466304347826, violated group size: 0.217\n", - "iteration: 369, error: 0.4204986449864499, fairness violation: 0.00488610298102981, violated group size: 0.283\n", - "iteration: 370, error: 0.4206027027027027, fairness violation: 0.0048775891891891885, violated group size: 0.217\n", - "iteration: 371, error: 0.4207061994609164, fairness violation: 0.004869121293800538, violated group size: 0.217\n", - "iteration: 372, error: 0.4208091397849463, fairness violation: 0.004860698924731182, violated group size: 0.217\n", - "iteration: 373, error: 0.420911528150134, fairness violation: 0.004852321715817694, violated group size: 0.217\n", - "iteration: 374, error: 0.420855614973262, fairness violation: 0.004856754010695187, violated group size: 0.217\n", - "iteration: 375, error: 0.4209573333333334, fairness violation: 0.004848432, violated group size: 0.217\n", - "iteration: 376, error: 0.42105851063829786, fairness violation: 0.004840154255319148, violated group size: 0.217\n", - "iteration: 377, error: 0.4211591511936339, fairness violation: 0.004831920424403182, violated group size: 0.217\n", - "iteration: 378, error: 0.4211031746031746, fairness violation: 0.004836359788359788, violated group size: 0.217\n", - "iteration: 379, error: 0.42120316622691284, fairness violation: 0.004828179419525066, violated group size: 0.217\n", - "iteration: 380, error: 0.42130263157894726, fairness violation: 0.004820042105263157, violated group size: 0.217\n", - "iteration: 381, error: 0.42124671916010503, fairness violation: 0.004824477690288715, violated group size: 0.283\n", - "iteration: 382, error: 0.42134554973821986, fairness violation: 0.004816392670157068, violated group size: 0.283\n", - "iteration: 383, error: 0.42144386422976504, fairness violation: 0.004808349869451696, violated group size: 0.217\n", - "iteration: 384, error: 0.42154166666666676, fairness violation: 0.004800348958333333, violated group size: 0.283\n" - ] + "cell_type": "code", + "source": [ + "# load data set\n", + "data_set = load_preproc_data_adult(sub_samp=1000, balance=True)\n", + "max_iterations = 500" + ], + "metadata": { + "id": "KZhYY9zVhp1i" + }, + "execution_count": 6, + "outputs": [] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 385, error: 0.4214857142857143, fairness violation: 0.00480478961038961, violated group size: 0.217\n", - "iteration: 386, error: 0.4215829015544041, fairness violation: 0.0047968393782383415, violated group size: 0.217\n", - "iteration: 387, error: 0.42152713178294576, fairness violation: 0.004801266149870801, violated group size: 0.283\n", - "iteration: 388, error: 0.4216237113402061, fairness violation: 0.004793365979381444, violated group size: 0.283\n", - "iteration: 389, error: 0.42171979434447304, fairness violation: 0.004785506426735219, violated group size: 0.217\n", - "iteration: 390, error: 0.4218153846153847, fairness violation: 0.00477768717948718, violated group size: 0.217\n", - "iteration: 391, error: 0.4219104859335038, fairness violation: 0.004769907928388747, violated group size: 0.217\n", - "iteration: 392, error: 0.4218545918367348, fairness violation: 0.00477434693877551, violated group size: 0.217\n", - "iteration: 393, error: 0.42194910941475816, fairness violation: 0.004766615776081424, violated group size: 0.217\n", - "iteration: 394, error: 0.42204314720812186, fairness violation: 0.004758923857868021, violated group size: 0.283\n", - "iteration: 395, error: 0.4221367088607595, fairness violation: 0.00475127088607595, violated group size: 0.217\n", - "iteration: 396, error: 0.42208080808080806, fairness violation: 0.004755712121212122, violated group size: 0.283\n", - "iteration: 397, error: 0.42202518891687657, fairness violation: 0.004760130982367758, violated group size: 0.217\n", - "iteration: 398, error: 0.42196984924623115, fairness violation: 0.004764527638190955, violated group size: 0.283\n", - "iteration: 399, error: 0.42191478696741846, fairness violation: 0.004768902255639098, violated group size: 0.217\n", - "iteration: 400, error: 0.42186, fairness violation: 0.004773255, violated group size: 0.217\n", - "iteration: 401, error: 0.4218054862842893, fairness violation: 0.004777586034912718, violated group size: 0.283\n", - "iteration: 402, error: 0.4217512437810945, fairness violation: 0.00478189552238806, violated group size: 0.217\n", - "iteration: 403, error: 0.4218436724565757, fairness violation: 0.0047743374689826305, violated group size: 0.283\n", - "iteration: 404, error: 0.42178960396039605, fairness violation: 0.004778633663366336, violated group size: 0.217\n", - "iteration: 405, error: 0.4217358024691357, fairness violation: 0.004782908641975308, violated group size: 0.217\n", - "iteration: 406, error: 0.4216822660098523, fairness violation: 0.004787162561576355, violated group size: 0.217\n", - "iteration: 407, error: 0.4216289926289926, fairness violation: 0.004791395577395577, violated group size: 0.283\n", - "iteration: 408, error: 0.421575980392157, fairness violation: 0.004795607843137254, violated group size: 0.217\n", - "iteration: 409, error: 0.4215232273838631, fairness violation: 0.004799799511002444, violated group size: 0.217\n", - "iteration: 410, error: 0.42147073170731714, fairness violation: 0.004803970731707317, violated group size: 0.283\n", - "iteration: 411, error: 0.4214184914841849, fairness violation: 0.0048081216545012165, violated group size: 0.217\n", - "iteration: 412, error: 0.4213665048543689, fairness violation: 0.004812252427184466, violated group size: 0.283\n", - "iteration: 413, error: 0.42131476997578693, fairness violation: 0.004816363196125908, violated group size: 0.217\n", - "iteration: 414, error: 0.42126328502415455, fairness violation: 0.004820454106280194, violated group size: 0.217\n", - "iteration: 415, error: 0.4212120481927711, fairness violation: 0.004824525301204821, violated group size: 0.283\n", - "iteration: 416, error: 0.42116105769230766, fairness violation: 0.004828576923076923, violated group size: 0.217\n", - "iteration: 417, error: 0.4211103117505996, fairness violation: 0.004832609112709832, violated group size: 0.283\n", - "iteration: 418, error: 0.42105980861244025, fairness violation: 0.004836622009569378, violated group size: 0.283\n", - "iteration: 419, error: 0.42100954653937933, fairness violation: 0.004840615751789977, violated group size: 0.217\n", - "iteration: 420, error: 0.42110000000000003, fairness violation: 0.0048332238095238084, violated group size: 0.217\n", - "iteration: 421, error: 0.42104988123515436, fairness violation: 0.004837206650831354, violated group size: 0.217\n", - "iteration: 422, error: 0.42100000000000004, fairness violation: 0.004841170616113744, violated group size: 0.217\n", - "iteration: 423, error: 0.420950354609929, fairness violation: 0.004845115839243499, violated group size: 0.217\n", - "iteration: 424, error: 0.42104009433962253, fairness violation: 0.004837783018867924, violated group size: 0.217\n", - "iteration: 425, error: 0.4209905882352941, fairness violation: 0.004841717647058822, violated group size: 0.217\n", - "iteration: 426, error: 0.42094131455399053, fairness violation: 0.004845633802816901, violated group size: 0.217\n", - "iteration: 427, error: 0.42089227166276344, fairness violation: 0.004849531615925057, violated group size: 0.217\n", - "iteration: 428, error: 0.4208434579439252, fairness violation: 0.004853411214953271, violated group size: 0.217\n", - "iteration: 429, error: 0.4207948717948717, fairness violation: 0.0048572727272727274, violated group size: 0.283\n", - "iteration: 430, error: 0.42074651162790694, fairness violation: 0.004861116279069767, violated group size: 0.217\n", - "iteration: 431, error: 0.4206983758700697, fairness violation: 0.004864941995359629, violated group size: 0.283\n", - "iteration: 432, error: 0.420650462962963, fairness violation: 0.00486875, violated group size: 0.217\n", - "iteration: 433, error: 0.42060277136258656, fairness violation: 0.0048725404157043874, violated group size: 0.217\n", - "iteration: 434, error: 0.42055529953917054, fairness violation: 0.0048763133640553, violated group size: 0.283\n", - "iteration: 435, error: 0.42050804597701147, fairness violation: 0.004880068965517241, violated group size: 0.217\n", - "iteration: 436, error: 0.4204610091743119, fairness violation: 0.004883807339449542, violated group size: 0.217\n", - "iteration: 437, error: 0.4204141876430207, fairness violation: 0.004887528604118992, violated group size: 0.217\n", - "iteration: 438, error: 0.42036757990867574, fairness violation: 0.004891232876712329, violated group size: 0.217\n", - "iteration: 439, error: 0.4203211845102506, fairness violation: 0.0048949202733485206, violated group size: 0.283\n", - "iteration: 440, error: 0.42027499999999995, fairness violation: 0.00489859090909091, violated group size: 0.283\n", - "iteration: 441, error: 0.42022902494331066, fairness violation: 0.004902244897959184, violated group size: 0.283\n", - "iteration: 442, error: 0.42018325791855204, fairness violation: 0.004905882352941177, violated group size: 0.217\n", - "iteration: 443, error: 0.42013769751693003, fairness violation: 0.004909503386004516, violated group size: 0.283\n", - "iteration: 444, error: 0.42009234234234244, fairness violation: 0.004913108108108108, violated group size: 0.217\n", - "iteration: 445, error: 0.420047191011236, fairness violation: 0.004916696629213483, violated group size: 0.217\n", - "iteration: 446, error: 0.42000224215246645, fairness violation: 0.004920269058295964, violated group size: 0.217\n", - "iteration: 447, error: 0.4199574944071588, fairness violation: 0.004923825503355704, violated group size: 0.217\n", - "iteration: 448, error: 0.41991294642857147, fairness violation: 0.004927366071428571, violated group size: 0.217\n", - "iteration: 449, error: 0.41986859688195993, fairness violation: 0.004930890868596881, violated group size: 0.217\n", - "iteration: 450, error: 0.41982444444444433, fairness violation: 0.004934399999999999, violated group size: 0.217\n", - "iteration: 451, error: 0.41978048780487814, fairness violation: 0.004937893569844789, violated group size: 0.217\n", - "iteration: 452, error: 0.41973672566371684, fairness violation: 0.004941371681415928, violated group size: 0.217\n", - "iteration: 453, error: 0.41969315673289187, fairness violation: 0.0049448344370860925, violated group size: 0.217\n", - "iteration: 454, error: 0.41964977973568285, fairness violation: 0.004948281938325991, violated group size: 0.283\n", - "iteration: 455, error: 0.41960659340659345, fairness violation: 0.004951714285714286, violated group size: 0.283\n", - "iteration: 456, error: 0.41956359649122804, fairness violation: 0.004955131578947367, violated group size: 0.217\n", - "iteration: 457, error: 0.41952078774617063, fairness violation: 0.0049585339168490145, violated group size: 0.217\n", - "iteration: 458, error: 0.41947816593886456, fairness violation: 0.004961921397379911, violated group size: 0.217\n", - "iteration: 459, error: 0.4194357298474945, fairness violation: 0.00496529411764706, violated group size: 0.283\n", - "iteration: 460, error: 0.4193934782608696, fairness violation: 0.004968652173913044, violated group size: 0.283\n", - "iteration: 461, error: 0.41935140997830805, fairness violation: 0.004971995661605205, violated group size: 0.283\n", - "iteration: 462, error: 0.41930952380952374, fairness violation: 0.0049753246753246735, violated group size: 0.217\n", - "iteration: 463, error: 0.41926781857451406, fairness violation: 0.004978639308855291, violated group size: 0.217\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "MEge2s2Wg9Fu" + }, + "source": [ + "**instantiate, fit, and predict**\n", + "\n", + "\n", + "We first demonstrate how to instantiate a `GerryFairClassifier`, `train` it with respect to rich subgroup fairness, and `predict` the label of a new example. We remark that when we set the `print_flag = True` at each iteration of the algorithm we print the error, fairness violation, and violated group size of most recent model. The error is the classification error of the classifier. At each round the Learner tries to find a classifier that minimizes the classification error plus a weighted sum of the fairness disparities on all the groups that the Auditor has found up until that point. By contrast the Auditor tries to find the group at each round with the greatest rich subgroup disparity with respect to the Learner's model. We define `violated group size` as the size (as a fraction of the dataset size) of this group, and the `fairness violation` as the `violated group size` times the difference in the statistical rate (FP or FN rate) on the group vs. the whole population.\n", + "\n", + "In the example below we set `max_iterations=500` which is an order of magnitude less than the time to convergence observed in [the rich subgroup fairness empirical paper](https://arxiv.org/abs/1808.08166), but advise that this can be highly dataset dependent. Our target $\\gamma$-disparity is $\\gamma = .005$, our statistical rate is false positive rate or `FP`, and our cost-sensitive classification oracle is linear regression (more on that below).\n" + ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "iteration: 464, error: 0.41922629310344817, fairness violation: 0.004981939655172413, violated group size: 0.217\n", - "iteration: 465, error: 0.41918494623655916, fairness violation: 0.004985225806451612, violated group size: 0.217\n", - "iteration: 466, error: 0.4191437768240344, fairness violation: 0.004988497854077254, violated group size: 0.283\n", - "iteration: 467, error: 0.41910278372591, fairness violation: 0.004991755888650964, violated group size: 0.283\n", - "iteration: 468, error: 0.4190619658119658, fairness violation: 0.004994999999999998, violated group size: 0.217\n", - "iteration: 469, error: 0.4190213219616205, fairness violation: 0.0049982302771855, violated group size: 0.217\n", - "iteration: 470, error: 0.41898085106382993, fairness violation: 0.005001446808510636, violated group size: 0.283\n", - "iteration: 471, error: 0.41894055201698516, fairness violation: 0.005004649681528661, violated group size: 0.217\n", - "iteration: 472, error: 0.41890042372881364, fairness violation: 0.005007838983050847, violated group size: 0.283\n", - "iteration: 473, error: 0.4188604651162791, fairness violation: 0.005011014799154333, violated group size: 0.217\n", - "iteration: 474, error: 0.41882067510548526, fairness violation: 0.005014177215189871, violated group size: 0.217\n", - "iteration: 475, error: 0.41878105263157905, fairness violation: 0.0050173263157894735, violated group size: 0.283\n", - "iteration: 476, error: 0.41874159663865557, fairness violation: 0.0050204621848739485, violated group size: 0.217\n", - "iteration: 477, error: 0.4188259958071279, fairness violation: 0.005013576519916141, violated group size: 0.217\n", - "iteration: 478, error: 0.41878661087866115, fairness violation: 0.005016707112970709, violated group size: 0.217\n", - "iteration: 479, error: 0.4188705636743216, fairness violation: 0.005009858037578285, violated group size: 0.217\n", - "iteration: 480, error: 0.41883125000000004, fairness violation: 0.005012983333333334, violated group size: 0.283\n", - "iteration: 481, error: 0.4187920997920998, fairness violation: 0.005016095634095634, violated group size: 0.283\n", - "iteration: 482, error: 0.4187531120331951, fairness violation: 0.0050191950207468874, violated group size: 0.283\n", - "iteration: 483, error: 0.4188364389233955, fairness violation: 0.00501239751552795, violated group size: 0.217\n", - "iteration: 484, error: 0.41891942148760325, fairness violation: 0.005005628099173555, violated group size: 0.283\n", - "iteration: 485, error: 0.4190020618556701, fairness violation: 0.004998886597938144, violated group size: 0.283\n", - "iteration: 486, error: 0.41896296296296304, fairness violation: 0.005001995884773661, violated group size: 0.217\n", - "iteration: 487, error: 0.4190451745379877, fairness violation: 0.004995289527720739, violated group size: 0.283\n", - "iteration: 488, error: 0.4191270491803279, fairness violation: 0.004988610655737704, violated group size: 0.283\n", - "iteration: 489, error: 0.4192085889570552, fairness violation: 0.004981959100204497, violated group size: 0.217\n", - "iteration: 490, error: 0.41916938775510204, fairness violation: 0.004985077551020407, violated group size: 0.283\n", - "iteration: 491, error: 0.4192505091649695, fairness violation: 0.004978460285132381, violated group size: 0.217\n", - "iteration: 492, error: 0.4192113821138212, fairness violation: 0.004981573170731706, violated group size: 0.217\n", - "iteration: 493, error: 0.41917241379310355, fairness violation: 0.004984673427991887, violated group size: 0.283\n", - "iteration: 494, error: 0.41913360323886634, fairness violation: 0.004987761133603237, violated group size: 0.217\n", - "iteration: 495, error: 0.4192141414141415, fairness violation: 0.004981191919191918, violated group size: 0.217\n", - "iteration: 496, error: 0.4192943548387097, fairness violation: 0.004974649193548386, violated group size: 0.217\n", - "iteration: 497, error: 0.419374245472837, fairness violation: 0.004968132796780683, violated group size: 0.217\n", - "iteration: 498, error: 0.4194538152610441, fairness violation: 0.004961642570281124, violated group size: 0.217\n", - "iteration: 499, error: 0.41953306613226454, fairness violation: 0.0049551783567134255, violated group size: 0.217\n" - ] - } - ], - "source": [ - "C = 100\n", - "print_flag = True\n", - "gamma = .005\n", - "\n", - "\n", - "fair_model = GerryFairClassifier(C=C, printflag=print_flag, gamma=gamma, fairness_def='FP',\n", - " max_iters=max_iterations, heatmapflag=False)\n", - "\n", - "# fit method\n", - "fair_model.fit(data_set, early_termination=True)\n", - "\n", - "# predict method. If threshold in (0, 1) produces binary predictions\n", - "\n", - "dataset_yhat = fair_model.predict(data_set, threshold=False)\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**3-d heatmaps**\n", - "\n", - "We now show to generate a 3d-heatmap of unfairness using the `generate_heatmap` method. The $X-Y$ axes in the plot represent the coefficients of the linear threshold function that defines a protected subgroup with respect to the first two sensitive attributes. Which $2$ attributes are considered sensitive can be overwritten with the `col_index` argument. The $Z$-axes is the $\\gamma$-disparity (FP) of the corresponding subgroup defined by the linear threshold function. This is important because it allows us to (1) visualize convergence as the heatmap flattens and (2) brute force check the fairness in low-dimensions without relying on a heuristic auditor. See the [the rich subgroup fairness empirical paper](https://arxiv.org/abs/1808.08166) for a discussion of these plots. Note that in the below plot no group has a $\\gamma$-disparity of greater than $.005$, which we would expect since the set of linear threshold functions on two attributes is a subset of the set of linear threshold functions on all protected attributes, and the final model is $\\gamma$-fair. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ + "cell_type": "code", + "execution_count": 7, + "metadata": { + "pycharm": { + "is_executing": true + }, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qEigaAI9g9Fv", + "outputId": "5a2852d9-132a-4ed0-a0c3-7eb96686c9e8" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "iteration: 1, error: 0.257, fairness violation: 0.041308000000000004, violated group size: 0.263\n", + "iteration: 2, error: 0.3785, fairness violation: 0.020654000000000002, violated group size: 0.263\n", + "iteration: 3, error: 0.419, fairness violation: 0.013769333333333342, violated group size: 0.263\n", + "iteration: 4, error: 0.43925, fairness violation: 0.010327000000000001, violated group size: 0.263\n", + "iteration: 5, error: 0.4514, fairness violation: 0.008261600000000001, violated group size: 0.237\n", + "iteration: 6, error: 0.4595000000000001, fairness violation: 0.006884666666666671, violated group size: 0.263\n", + "iteration: 7, error: 0.4652857142857143, fairness violation: 0.005901142857142857, violated group size: 0.237\n", + "iteration: 8, error: 0.469625, fairness violation: 0.005163500000000002, violated group size: 0.237\n", + "iteration: 9, error: 0.47300000000000003, fairness violation: 0.00458977777777778, violated group size: 0.237\n", + "iteration: 10, error: 0.4757000000000001, fairness violation: 0.0041308000000000004, violated group size: 0.237\n", + "iteration: 11, error: 0.47790909090909084, fairness violation: 0.0037552727272727273, violated group size: 0.263\n", + "iteration: 12, error: 0.47974999999999995, fairness violation: 0.0034423333333333354, violated group size: 0.263\n", + "iteration: 13, error: 0.4813076923076924, fairness violation: 0.0031775384615384643, violated group size: 0.263\n", + "iteration: 14, error: 0.48264285714285726, fairness violation: 0.0029505714285714296, violated group size: 0.237\n", + "iteration: 15, error: 0.48380000000000006, fairness violation: 0.0027538666666666674, violated group size: 0.237\n", + "iteration: 16, error: 0.4848125, fairness violation: 0.002581750000000001, violated group size: 0.237\n", + "iteration: 17, error: 0.4857058823529412, fairness violation: 0.0024298823529411775, violated group size: 0.237\n", + "iteration: 18, error: 0.4865, fairness violation: 0.00229488888888889, violated group size: 0.237\n", + "iteration: 19, error: 0.48721052631578954, fairness violation: 0.002174105263157895, violated group size: 0.237\n", + "iteration: 20, error: 0.4878499999999999, fairness violation: 0.0020654000000000015, violated group size: 0.263\n", + "iteration: 21, error: 0.4884285714285715, fairness violation: 0.001967047619047619, violated group size: 0.237\n", + "iteration: 22, error: 0.48895454545454553, fairness violation: 0.0018776363636363643, violated group size: 0.237\n", + "iteration: 23, error: 0.4894347826086957, fairness violation: 0.0017960000000000012, violated group size: 0.263\n", + "iteration: 24, error: 0.48987500000000006, fairness violation: 0.0017211666666666686, violated group size: 0.263\n", + "iteration: 25, error: 0.49028000000000016, fairness violation: 0.0016523200000000003, violated group size: 0.237\n", + "iteration: 26, error: 0.49065384615384616, fairness violation: 0.0015887692307692321, violated group size: 0.263\n", + "iteration: 27, error: 0.4910000000000001, fairness violation: 0.0015299259259259272, violated group size: 0.263\n", + "iteration: 28, error: 0.49132142857142846, fairness violation: 0.0014752857142857144, violated group size: 0.237\n", + "iteration: 29, error: 0.4916206896551723, fairness violation: 0.0014244137931034486, violated group size: 0.237\n", + "iteration: 30, error: 0.49190000000000006, fairness violation: 0.0013769333333333335, violated group size: 0.237\n", + "iteration: 31, error: 0.49216129032258077, fairness violation: 0.0013325161290322588, violated group size: 0.263\n", + "iteration: 32, error: 0.49240625, fairness violation: 0.0012908750000000006, violated group size: 0.237\n", + "iteration: 33, error: 0.4926363636363636, fairness violation: 0.001251757575757576, violated group size: 0.237\n", + "iteration: 34, error: 0.49285294117647066, fairness violation: 0.0012149411764705886, violated group size: 0.237\n", + "iteration: 35, error: 0.49305714285714286, fairness violation: 0.0011802285714285717, violated group size: 0.237\n", + "iteration: 36, error: 0.4932499999999999, fairness violation: 0.001147444444444445, violated group size: 0.237\n", + "iteration: 37, error: 0.49343243243243257, fairness violation: 0.0011164324324324328, violated group size: 0.237\n", + "iteration: 38, error: 0.49360526315789466, fairness violation: 0.0010870526315789476, violated group size: 0.237\n", + "iteration: 39, error: 0.4937692307692308, fairness violation: 0.001059179487179488, violated group size: 0.263\n", + "iteration: 40, error: 0.4939249999999999, fairness violation: 0.0010327000000000008, violated group size: 0.263\n", + "iteration: 41, error: 0.4940731707317074, fairness violation: 0.0010075121951219515, violated group size: 0.237\n", + "iteration: 42, error: 0.4942142857142858, fairness violation: 0.0009835238095238096, violated group size: 0.237\n", + "iteration: 43, error: 0.4943488372093023, fairness violation: 0.0009606511627906982, violated group size: 0.263\n", + "iteration: 44, error: 0.49447727272727265, fairness violation: 0.0009388181818181818, violated group size: 0.263\n", + "iteration: 45, error: 0.49460000000000004, fairness violation: 0.000917955555555556, violated group size: 0.263\n", + "iteration: 46, error: 0.4947173913043478, fairness violation: 0.0008980000000000004, violated group size: 0.263\n", + "iteration: 47, error: 0.49482978723404264, fairness violation: 0.0008788936170212767, violated group size: 0.263\n", + "iteration: 48, error: 0.4949374999999999, fairness violation: 0.0008605833333333339, violated group size: 0.263\n", + "iteration: 49, error: 0.49504081632653046, fairness violation: 0.0008430204081632653, violated group size: 0.237\n", + "iteration: 50, error: 0.49514, fairness violation: 0.0008261600000000004, violated group size: 0.263\n", + "iteration: 51, error: 0.49523529411764705, fairness violation: 0.0008099607843137258, violated group size: 0.263\n", + "iteration: 52, error: 0.49532692307692294, fairness violation: 0.0007943846153846153, violated group size: 0.263\n", + "iteration: 53, error: 0.4954150943396228, fairness violation: 0.0007793962264150945, violated group size: 0.263\n", + "iteration: 54, error: 0.4936111111111111, fairness violation: 0.0009580740740740742, violated group size: 0.237\n", + "iteration: 55, error: 0.49372727272727274, fairness violation: 0.0009406545454545454, violated group size: 0.263\n", + "iteration: 56, error: 0.4938392857142857, fairness violation: 0.0009238571428571433, violated group size: 0.263\n", + "iteration: 57, error: 0.49394736842105263, fairness violation: 0.0009076491228070175, violated group size: 0.237\n", + "iteration: 58, error: 0.49405172413793097, fairness violation: 0.0008920000000000001, violated group size: 0.237\n", + "iteration: 59, error: 0.49415254237288136, fairness violation: 0.0008768813559322037, violated group size: 0.263\n", + "iteration: 60, error: 0.4942499999999999, fairness violation: 0.0008622666666666666, violated group size: 0.237\n", + "iteration: 61, error: 0.49434426229508205, fairness violation: 0.0008481311475409838, violated group size: 0.237\n", + "iteration: 62, error: 0.4942741935483872, fairness violation: 0.000834451612903226, violated group size: 0.237\n", + "iteration: 63, error: 0.4943650793650794, fairness violation: 0.0008212063492063492, violated group size: 0.263\n", + "iteration: 64, error: 0.492859375, fairness violation: 0.0009861250000000002, violated group size: 0.263\n", + "iteration: 65, error: 0.49250769230769237, fairness violation: 0.0010365846153846153, violated group size: 0.237\n", + "iteration: 66, error: 0.4923787878787878, fairness violation: 0.0010352424242424242, violated group size: 0.237\n", + "iteration: 67, error: 0.49249253731343284, fairness violation: 0.0010197910447761196, violated group size: 0.263\n", + "iteration: 68, error: 0.4926029411764706, fairness violation: 0.0010047941176470586, violated group size: 0.237\n", + "iteration: 69, error: 0.49271014492753634, fairness violation: 0.000990231884057971, violated group size: 0.237\n", + "iteration: 70, error: 0.4928142857142858, fairness violation: 0.0009760857142857143, violated group size: 0.237\n", + "iteration: 71, error: 0.491338028169014, fairness violation: 0.0011225633802816905, violated group size: 0.237\n", + "iteration: 72, error: 0.4901249999999999, fairness violation: 0.001251805555555556, violated group size: 0.237\n", + "iteration: 73, error: 0.49004109589041106, fairness violation: 0.0012476438356164388, violated group size: 0.263\n", + "iteration: 74, error: 0.48977027027027026, fairness violation: 0.0012884324324324327, violated group size: 0.237\n", + "iteration: 75, error: 0.4884266666666666, fairness violation: 0.0014166133333333335, violated group size: 0.237\n", + "iteration: 76, error: 0.4879736842105262, fairness violation: 0.0014665789473684216, violated group size: 0.263\n", + "iteration: 77, error: 0.4868831168831168, fairness violation: 0.001582961038961039, violated group size: 0.237\n", + "iteration: 78, error: 0.4856153846153846, fairness violation: 0.001696358974358975, violated group size: 0.263\n", + "iteration: 79, error: 0.484506329113924, fairness violation: 0.001806886075949368, violated group size: 0.263\n", + "iteration: 80, error: 0.48330000000000006, fairness violation: 0.0019265000000000005, violated group size: 0.237\n", + "iteration: 81, error: 0.4821234567901235, fairness violation: 0.002043160493827161, violated group size: 0.263\n", + "iteration: 82, error: 0.4811707317073171, fairness violation: 0.0021454146341463418, violated group size: 0.237\n", + "iteration: 83, error: 0.48024096385542164, fairness violation: 0.002245204819277109, violated group size: 0.237\n", + "iteration: 84, error: 0.4791428571428571, fairness violation: 0.002353904761904763, violated group size: 0.237\n", + "iteration: 85, error: 0.4782705882352941, fairness violation: 0.002454470588235295, violated group size: 0.237\n", + "iteration: 86, error: 0.477406976744186, fairness violation: 0.0025471860465116286, violated group size: 0.237\n", + "iteration: 87, error: 0.47637931034482767, fairness violation: 0.0026486666666666677, violated group size: 0.237\n", + "iteration: 88, error: 0.47537499999999994, fairness violation: 0.0027478409090909107, violated group size: 0.263\n", + "iteration: 89, error: 0.4743932584269664, fairness violation: 0.002844786516853933, violated group size: 0.263\n", + "iteration: 90, error: 0.4736222222222222, fairness violation: 0.002934311111111111, violated group size: 0.237\n", + "iteration: 91, error: 0.47268131868131874, fairness violation: 0.0030270769230769236, violated group size: 0.237\n", + "iteration: 92, error: 0.4717608695652174, fairness violation: 0.003117826086956522, violated group size: 0.237\n", + "iteration: 93, error: 0.4708602150537634, fairness violation: 0.0032066236559139794, violated group size: 0.263\n", + "iteration: 94, error: 0.46997872340425534, fairness violation: 0.003293531914893617, violated group size: 0.237\n", + "iteration: 95, error: 0.46911578947368426, fairness violation: 0.003378610526315791, violated group size: 0.263\n", + "iteration: 96, error: 0.46827083333333336, fairness violation: 0.0034619166666666674, violated group size: 0.263\n", + "iteration: 97, error: 0.46744329896907216, fairness violation: 0.0035435051546391766, violated group size: 0.237\n", + "iteration: 98, error: 0.46663265306122453, fairness violation: 0.003623428571428572, violated group size: 0.237\n", + "iteration: 99, error: 0.46583838383838383, fairness violation: 0.003701737373737375, violated group size: 0.237\n", + "iteration: 100, error: 0.4650599999999999, fairness violation: 0.0037784800000000016, violated group size: 0.237\n", + "iteration: 101, error: 0.4642970297029704, fairness violation: 0.003853702970297031, violated group size: 0.237\n", + "iteration: 102, error: 0.4635490196078431, fairness violation: 0.003927450980392159, violated group size: 0.237\n", + "iteration: 103, error: 0.46281553398058256, fairness violation: 0.003999766990291263, violated group size: 0.237\n", + "iteration: 104, error: 0.4620961538461538, fairness violation: 0.00407069230769231, violated group size: 0.237\n", + "iteration: 105, error: 0.46139047619047613, fairness violation: 0.004140266666666668, violated group size: 0.237\n", + "iteration: 106, error: 0.46069811320754717, fairness violation: 0.004208528301886796, violated group size: 0.263\n", + "iteration: 107, error: 0.4595607476635515, fairness violation: 0.00434639252336449, violated group size: 0.263\n", + "iteration: 108, error: 0.4588981481481481, fairness violation: 0.004411481481481484, violated group size: 0.263\n", + "iteration: 109, error: 0.45780733944954133, fairness violation: 0.004536256880733949, violated group size: 0.263\n", + "iteration: 110, error: 0.4567272727272727, fairness violation: 0.004667381818181821, violated group size: 0.237\n", + "iteration: 111, error: 0.45610810810810815, fairness violation: 0.004727819819819823, violated group size: 0.263\n", + "iteration: 112, error: 0.4550625, fairness violation: 0.004854892857142861, violated group size: 0.237\n", + "iteration: 113, error: 0.45446902654867255, fairness violation: 0.004912601769911508, violated group size: 0.237\n", + "iteration: 114, error: 0.45345614035087717, fairness violation: 0.005035824561403512, violated group size: 0.237\n", + "iteration: 115, error: 0.4528869565217391, fairness violation: 0.005090956521739133, violated group size: 0.237\n", + "iteration: 116, error: 0.4523275862068965, fairness violation: 0.005145137931034486, violated group size: 0.237\n", + "iteration: 117, error: 0.45176923076923076, fairness violation: 0.0051943418803418835, violated group size: 0.237\n", + "iteration: 118, error: 0.4516271186440677, fairness violation: 0.005198525423728817, violated group size: 0.237\n", + "iteration: 119, error: 0.45189915966386557, fairness violation: 0.0051628067226890785, violated group size: 0.237\n", + "iteration: 120, error: 0.45144999999999996, fairness violation: 0.005206683333333338, violated group size: 0.237\n", + "iteration: 121, error: 0.4518512396694215, fairness violation: 0.005163652892561989, violated group size: 0.237\n", + "iteration: 122, error: 0.45224590163934414, fairness violation: 0.005121327868852463, violated group size: 0.237\n", + "iteration: 123, error: 0.4526341463414635, fairness violation: 0.005079691056910574, violated group size: 0.263\n", + "iteration: 124, error: 0.453016129032258, fairness violation: 0.005038725806451616, violated group size: 0.237\n", + "iteration: 125, error: 0.4533920000000001, fairness violation: 0.004998416000000004, violated group size: 0.237\n", + "iteration: 126, error: 0.45376190476190476, fairness violation: 0.004958746031746036, violated group size: 0.237\n", + "iteration: 127, error: 0.45412598425196843, fairness violation: 0.004919700787401579, violated group size: 0.237\n", + "iteration: 128, error: 0.454484375, fairness violation: 0.004881265625000004, violated group size: 0.263\n", + "iteration: 129, error: 0.4548372093023255, fairness violation: 0.004843426356589152, violated group size: 0.237\n", + "iteration: 130, error: 0.4551846153846153, fairness violation: 0.004806169230769234, violated group size: 0.237\n", + "iteration: 131, error: 0.45552671755725194, fairness violation: 0.004769480916030538, violated group size: 0.237\n", + "iteration: 132, error: 0.45544696969696963, fairness violation: 0.004776439393939399, violated group size: 0.263\n", + "iteration: 133, error: 0.45570676691729317, fairness violation: 0.004740526315789478, violated group size: 0.263\n", + "iteration: 134, error: 0.4560373134328357, fairness violation: 0.004705149253731347, violated group size: 0.263\n", + "iteration: 135, error: 0.4563629629629629, fairness violation: 0.004670296296296301, violated group size: 0.263\n", + "iteration: 136, error: 0.4566838235294117, fairness violation: 0.004635955882352945, violated group size: 0.237\n", + "iteration: 137, error: 0.45699999999999996, fairness violation: 0.004602116788321174, violated group size: 0.263\n", + "iteration: 138, error: 0.45731159420289863, fairness violation: 0.004568768115942034, violated group size: 0.263\n", + "iteration: 139, error: 0.4571007194244604, fairness violation: 0.004580230215827343, violated group size: 0.237\n", + "iteration: 140, error: 0.45740714285714285, fairness violation: 0.00454751428571429, violated group size: 0.263\n", + "iteration: 141, error: 0.4575957446808511, fairness violation: 0.004521985815602841, violated group size: 0.263\n", + "iteration: 142, error: 0.4571056338028169, fairness violation: 0.004570253521126764, violated group size: 0.237\n", + "iteration: 143, error: 0.45681118881118876, fairness violation: 0.004607902097902102, violated group size: 0.263\n", + "iteration: 144, error: 0.45699999999999996, fairness violation: 0.004582486111111115, violated group size: 0.237\n", + "iteration: 145, error: 0.4567103448275862, fairness violation: 0.004619531034482763, violated group size: 0.237\n", + "iteration: 146, error: 0.45700684931506846, fairness violation: 0.004587890410958908, violated group size: 0.237\n", + "iteration: 147, error: 0.45697959183673464, fairness violation: 0.0045889251700680315, violated group size: 0.237\n", + "iteration: 148, error: 0.45727027027027034, fairness violation: 0.004557918918918922, violated group size: 0.237\n", + "iteration: 149, error: 0.4575570469798658, fairness violation: 0.004527328859060408, violated group size: 0.263\n", + "iteration: 150, error: 0.45784, fairness violation: 0.004497146666666673, violated group size: 0.263\n", + "iteration: 151, error: 0.4581192052980132, fairness violation: 0.0044673642384106, violated group size: 0.263\n", + "iteration: 152, error: 0.4583947368421052, fairness violation: 0.00443797368421053, violated group size: 0.237\n", + "iteration: 153, error: 0.4585555555555555, fairness violation: 0.0044120653594771275, violated group size: 0.237\n", + "iteration: 154, error: 0.45882467532467525, fairness violation: 0.00438341558441559, violated group size: 0.263\n", + "iteration: 155, error: 0.45909032258064514, fairness violation: 0.0043551354838709715, violated group size: 0.237\n", + "iteration: 156, error: 0.4590897435897436, fairness violation: 0.004357602564102568, violated group size: 0.237\n", + "iteration: 157, error: 0.45869426751592357, fairness violation: 0.004399286624203826, violated group size: 0.263\n", + "iteration: 158, error: 0.458759493670886, fairness violation: 0.004401443037974688, violated group size: 0.263\n", + "iteration: 159, error: 0.4588301886792453, fairness violation: 0.004400591194968558, violated group size: 0.263\n", + "iteration: 160, error: 0.45845, fairness violation: 0.004438262500000003, violated group size: 0.263\n", + "iteration: 161, error: 0.45841614906832295, fairness violation: 0.004440136645962736, violated group size: 0.237\n", + "iteration: 162, error: 0.4586728395061729, fairness violation: 0.004412728395061732, violated group size: 0.263\n", + "iteration: 163, error: 0.45892638036809813, fairness violation: 0.004385656441717795, violated group size: 0.263\n", + "iteration: 164, error: 0.4586829268292683, fairness violation: 0.004399378048780492, violated group size: 0.237\n", + "iteration: 165, error: 0.4584969696969697, fairness violation: 0.00441006060606061, violated group size: 0.237\n", + "iteration: 166, error: 0.4584156626506024, fairness violation: 0.004417759036144582, violated group size: 0.263\n", + "iteration: 167, error: 0.4579940119760479, fairness violation: 0.004459425149700603, violated group size: 0.263\n", + "iteration: 168, error: 0.45776190476190465, fairness violation: 0.004472380952380955, violated group size: 0.237\n", + "iteration: 169, error: 0.4574023668639053, fairness violation: 0.004510426035502962, violated group size: 0.237\n", + "iteration: 170, error: 0.4570529411764706, fairness violation: 0.0045452352941176485, violated group size: 0.263\n", + "iteration: 171, error: 0.45670760233918134, fairness violation: 0.004579637426900589, violated group size: 0.263\n", + "iteration: 172, error: 0.45630813953488364, fairness violation: 0.0046191511627907, violated group size: 0.237\n", + "iteration: 173, error: 0.4559132947976877, fairness violation: 0.00465820809248555, violated group size: 0.237\n", + "iteration: 174, error: 0.45567816091954016, fairness violation: 0.004688643678160922, violated group size: 0.263\n", + "iteration: 175, error: 0.45534857142857144, fairness violation: 0.004726857142857145, violated group size: 0.237\n", + "iteration: 176, error: 0.4556022727272728, fairness violation: 0.004700000000000003, violated group size: 0.263\n", + "iteration: 177, error: 0.4552203389830508, fairness violation: 0.004732361581920906, violated group size: 0.237\n", + "iteration: 178, error: 0.45484269662921345, fairness violation: 0.004769685393258429, violated group size: 0.237\n", + "iteration: 179, error: 0.4545307262569832, fairness violation: 0.004803944134078216, violated group size: 0.263\n", + "iteration: 180, error: 0.45416111111111107, fairness violation: 0.004840455555555557, violated group size: 0.237\n", + "iteration: 181, error: 0.4537955801104972, fairness violation: 0.004876563535911605, violated group size: 0.263\n", + "iteration: 182, error: 0.4534340659340659, fairness violation: 0.004912274725274727, violated group size: 0.263\n", + "iteration: 183, error: 0.45343169398907107, fairness violation: 0.004916513661202187, violated group size: 0.237\n", + "iteration: 184, error: 0.45307608695652174, fairness violation: 0.004951619565217393, violated group size: 0.263\n", + "iteration: 185, error: 0.4527243243243243, fairness violation: 0.004986345945945949, violated group size: 0.263\n", + "iteration: 186, error: 0.4527311827956989, fairness violation: 0.0049875698924731204, violated group size: 0.263\n", + "iteration: 187, error: 0.4523850267379678, fairness violation: 0.005021732620320858, violated group size: 0.263\n", + "iteration: 188, error: 0.4520425531914894, fairness violation: 0.005055531914893619, violated group size: 0.263\n", + "iteration: 189, error: 0.4517089947089947, fairness violation: 0.00508646560846561, violated group size: 0.237\n", + "iteration: 190, error: 0.4515842105263158, fairness violation: 0.005092126315789474, violated group size: 0.237\n", + "iteration: 191, error: 0.4514607329842931, fairness violation: 0.005097727748691103, violated group size: 0.263\n", + "iteration: 192, error: 0.45163020833333334, fairness violation: 0.005076114583333335, violated group size: 0.263\n", + "iteration: 193, error: 0.4516373056994819, fairness violation: 0.00507437305699482, violated group size: 0.237\n", + "iteration: 194, error: 0.4518865979381443, fairness violation: 0.005048216494845362, violated group size: 0.263\n", + "iteration: 195, error: 0.45213333333333333, fairness violation: 0.005022328205128207, violated group size: 0.263\n", + "iteration: 196, error: 0.45237755102040805, fairness violation: 0.004996704081632655, violated group size: 0.237\n", + "iteration: 197, error: 0.45261928934010154, fairness violation: 0.004971340101522845, violated group size: 0.237\n", + "iteration: 198, error: 0.4528585858585858, fairness violation: 0.0049462323232323255, violated group size: 0.237\n", + "iteration: 199, error: 0.4530954773869348, fairness violation: 0.004921376884422113, violated group size: 0.263\n", + "iteration: 200, error: 0.45333, fairness violation: 0.004896770000000002, violated group size: 0.263\n", + "iteration: 201, error: 0.4535621890547263, fairness violation: 0.004872407960199008, violated group size: 0.263\n", + "iteration: 202, error: 0.45379207920792075, fairness violation: 0.004848287128712874, violated group size: 0.263\n", + "iteration: 203, error: 0.4540197044334975, fairness violation: 0.004824403940886701, violated group size: 0.263\n", + "iteration: 204, error: 0.4542450980392157, fairness violation: 0.004800754901960786, violated group size: 0.263\n", + "iteration: 205, error: 0.4544682926829269, fairness violation: 0.004777336585365856, violated group size: 0.237\n", + "iteration: 206, error: 0.4546893203883495, fairness violation: 0.004754145631067963, violated group size: 0.263\n", + "iteration: 207, error: 0.4549082125603864, fairness violation: 0.004731178743961353, violated group size: 0.263\n", + "iteration: 208, error: 0.455125, fairness violation: 0.004708432692307694, violated group size: 0.263\n", + "iteration: 209, error: 0.4551961722488037, fairness violation: 0.004706315789473685, violated group size: 0.237\n", + "iteration: 210, error: 0.4554095238095238, fairness violation: 0.004683904761904762, violated group size: 0.237\n", + "iteration: 211, error: 0.4556208530805687, fairness violation: 0.004661706161137443, violated group size: 0.263\n", + "iteration: 212, error: 0.4558301886792453, fairness violation: 0.004639716981132077, violated group size: 0.237\n", + "iteration: 213, error: 0.45603755868544593, fairness violation: 0.004617934272300471, violated group size: 0.263\n", + "iteration: 214, error: 0.4557663551401869, fairness violation: 0.004645084112149534, violated group size: 0.237\n", + "iteration: 215, error: 0.45597209302325586, fairness violation: 0.004623479069767443, violated group size: 0.237\n", + "iteration: 216, error: 0.45617592592592593, fairness violation: 0.004602074074074076, violated group size: 0.263\n", + "iteration: 217, error: 0.45630414746543785, fairness violation: 0.004585235023041476, violated group size: 0.237\n", + "iteration: 218, error: 0.4559908256880733, fairness violation: 0.004612036697247707, violated group size: 0.237\n", + "iteration: 219, error: 0.45619178082191786, fairness violation: 0.004590977168949774, violated group size: 0.263\n", + "iteration: 220, error: 0.4563909090909091, fairness violation: 0.004570109090909093, violated group size: 0.237\n", + "iteration: 221, error: 0.45644796380090497, fairness violation: 0.0045708778280543, violated group size: 0.263\n", + "iteration: 222, error: 0.4565675675675675, fairness violation: 0.004552423423423426, violated group size: 0.263\n", + "iteration: 223, error: 0.45644394618834083, fairness violation: 0.004561766816143499, violated group size: 0.237\n", + "iteration: 224, error: 0.4566339285714286, fairness violation: 0.004543517857142857, violated group size: 0.237\n", + "iteration: 225, error: 0.456751111111111, fairness violation: 0.0045254311111111115, violated group size: 0.237\n", + "iteration: 226, error: 0.4569424778761062, fairness violation: 0.004505407079646018, violated group size: 0.237\n", + "iteration: 227, error: 0.45713215859030837, fairness violation: 0.0044855594713656384, violated group size: 0.237\n", + "iteration: 228, error: 0.45682894736842095, fairness violation: 0.004515780701754388, violated group size: 0.263\n", + "iteration: 229, error: 0.45701746724890835, fairness violation: 0.0044960611353711795, violated group size: 0.237\n", + "iteration: 230, error: 0.4567130434782609, fairness violation: 0.004523913043478262, violated group size: 0.237\n", + "iteration: 231, error: 0.4566969696969697, fairness violation: 0.004528952380952382, violated group size: 0.263\n", + "iteration: 232, error: 0.4568836206896552, fairness violation: 0.004509431034482759, violated group size: 0.263\n", + "iteration: 233, error: 0.45706866952789704, fairness violation: 0.0044900772532188845, violated group size: 0.263\n", + "iteration: 234, error: 0.45705128205128204, fairness violation: 0.0044911452991453, violated group size: 0.263\n", + "iteration: 235, error: 0.4567574468085106, fairness violation: 0.00452044255319149, violated group size: 0.237\n", + "iteration: 236, error: 0.45694067796610166, fairness violation: 0.004501288135593223, violated group size: 0.263\n", + "iteration: 237, error: 0.4568902953586497, fairness violation: 0.004506295358649791, violated group size: 0.263\n", + "iteration: 238, error: 0.4566008403361344, fairness violation: 0.004535159663865547, violated group size: 0.237\n", + "iteration: 239, error: 0.4564435146443515, fairness violation: 0.00454394979079498, violated group size: 0.263\n", + "iteration: 240, error: 0.45620000000000005, fairness violation: 0.004568466666666667, violated group size: 0.237\n", + "iteration: 241, error: 0.45591701244813276, fairness violation: 0.004596713692946059, violated group size: 0.263\n", + "iteration: 242, error: 0.4558057851239669, fairness violation: 0.0046051404958677685, violated group size: 0.263\n", + "iteration: 243, error: 0.4559218106995884, fairness violation: 0.004590090534979424, violated group size: 0.263\n", + "iteration: 244, error: 0.4561024590163935, fairness violation: 0.0045712786885245904, violated group size: 0.237\n", + "iteration: 245, error: 0.455930612244898, fairness violation: 0.00459518367346939, violated group size: 0.263\n", + "iteration: 246, error: 0.4558414634146341, fairness violation: 0.004601552845528456, violated group size: 0.237\n", + "iteration: 247, error: 0.4555668016194332, fairness violation: 0.00462897975708502, violated group size: 0.237\n", + "iteration: 248, error: 0.45541935483870977, fairness violation: 0.00463707258064516, violated group size: 0.237\n", + "iteration: 249, error: 0.45521285140562245, fairness violation: 0.004660329317269079, violated group size: 0.263\n", + "iteration: 250, error: 0.45498400000000006, fairness violation: 0.004687192, violated group size: 0.237\n", + "iteration: 251, error: 0.4547171314741036, fairness violation: 0.004713840637450199, violated group size: 0.263\n", + "iteration: 252, error: 0.4544563492063492, fairness violation: 0.004738396825396826, violated group size: 0.263\n", + "iteration: 253, error: 0.454189723320158, fairness violation: 0.004762758893280632, violated group size: 0.263\n", + "iteration: 254, error: 0.4540905511811024, fairness violation: 0.004770133858267717, violated group size: 0.263\n", + "iteration: 255, error: 0.45383529411764706, fairness violation: 0.004794180392156863, violated group size: 0.263\n", + "iteration: 256, error: 0.453640625, fairness violation: 0.0048161875, violated group size: 0.237\n", + "iteration: 257, error: 0.45363813229571986, fairness violation: 0.004815891050583657, violated group size: 0.263\n", + "iteration: 258, error: 0.45342248062015506, fairness violation: 0.004841317829457365, violated group size: 0.263\n", + "iteration: 259, error: 0.4531737451737452, fairness violation: 0.004864718146718148, violated group size: 0.263\n", + "iteration: 260, error: 0.4529615384615384, fairness violation: 0.004886115384615385, violated group size: 0.263\n", + "iteration: 261, error: 0.4527164750957854, fairness violation: 0.004909164750957853, violated group size: 0.237\n", + "iteration: 262, error: 0.45253053435114504, fairness violation: 0.004930229007633589, violated group size: 0.263\n", + "iteration: 263, error: 0.45232319391634984, fairness violation: 0.004954737642585551, violated group size: 0.237\n", + "iteration: 264, error: 0.45207954545454543, fairness violation: 0.0049790606060606075, violated group size: 0.263\n", + "iteration: 265, error: 0.45195471698113204, fairness violation: 0.00498531320754717, violated group size: 0.263\n", + "iteration: 266, error: 0.451751879699248, fairness violation: 0.005009338345864661, violated group size: 0.237\n", + "iteration: 267, error: 0.4517528089887641, fairness violation: 0.005010104868913857, violated group size: 0.237\n", + "iteration: 268, error: 0.45155223880597023, fairness violation: 0.005030320895522388, violated group size: 0.237\n", + "iteration: 269, error: 0.45142750929368036, fairness violation: 0.005034527881040892, violated group size: 0.237\n", + "iteration: 270, error: 0.45119259259259265, fairness violation: 0.005058014814814815, violated group size: 0.237\n", + "iteration: 271, error: 0.4509630996309963, fairness violation: 0.005079579335793357, violated group size: 0.263\n", + "iteration: 272, error: 0.45114338235294116, fairness violation: 0.005060904411764706, violated group size: 0.263\n", + "iteration: 273, error: 0.4513223443223443, fairness violation: 0.0050423663003663, violated group size: 0.237\n", + "iteration: 274, error: 0.45112773722627747, fairness violation: 0.00506202189781022, violated group size: 0.263\n", + "iteration: 275, error: 0.451069090909091, fairness violation: 0.005064298181818182, violated group size: 0.263\n", + "iteration: 276, error: 0.45124637681159424, fairness violation: 0.00504594927536232, violated group size: 0.263\n", + "iteration: 277, error: 0.45136462093862817, fairness violation: 0.005031155234657041, violated group size: 0.263\n", + "iteration: 278, error: 0.45153956834532366, fairness violation: 0.005013057553956834, violated group size: 0.237\n", + "iteration: 279, error: 0.4517132616487456, fairness violation: 0.0049950896057347665, violated group size: 0.263\n", + "iteration: 280, error: 0.45188571428571433, fairness violation: 0.004977250000000001, violated group size: 0.263\n", + "iteration: 281, error: 0.4520569395017794, fairness violation: 0.004959537366548043, violated group size: 0.263\n", + "iteration: 282, error: 0.45222695035460997, fairness violation: 0.004941950354609928, violated group size: 0.237\n", + "iteration: 283, error: 0.45239575971731455, fairness violation: 0.0049244876325088335, violated group size: 0.237\n", + "iteration: 284, error: 0.45256338028169013, fairness violation: 0.004907147887323943, violated group size: 0.263\n", + "iteration: 285, error: 0.4527298245614035, fairness violation: 0.004889929824561404, violated group size: 0.263\n", + "iteration: 286, error: 0.45289510489510487, fairness violation: 0.004872832167832167, violated group size: 0.237\n", + "iteration: 287, error: 0.4530592334494773, fairness violation: 0.004855853658536585, violated group size: 0.237\n", + "iteration: 288, error: 0.4532222222222223, fairness violation: 0.004838993055555554, violated group size: 0.237\n", + "iteration: 289, error: 0.45338408304498273, fairness violation: 0.004822249134948096, violated group size: 0.237\n", + "iteration: 290, error: 0.45332413793103443, fairness violation: 0.004826868965517241, violated group size: 0.237\n", + "iteration: 291, error: 0.45348453608247424, fairness violation: 0.00481028178694158, violated group size: 0.263\n", + "iteration: 292, error: 0.45364383561643834, fairness violation: 0.004793808219178081, violated group size: 0.237\n", + "iteration: 293, error: 0.45380204778156996, fairness violation: 0.0047774470989761075, violated group size: 0.263\n", + "iteration: 294, error: 0.45395918367346944, fairness violation: 0.004761197278911563, violated group size: 0.263\n", + "iteration: 295, error: 0.4541152542372881, fairness violation: 0.004745057627118644, violated group size: 0.263\n", + "iteration: 296, error: 0.4542702702702703, fairness violation: 0.0047290270270270275, violated group size: 0.263\n", + "iteration: 297, error: 0.45442424242424245, fairness violation: 0.004713104377104377, violated group size: 0.263\n", + "iteration: 298, error: 0.4545771812080538, fairness violation: 0.004697288590604027, violated group size: 0.263\n", + "iteration: 299, error: 0.45472909698996655, fairness violation: 0.004681578595317724, violated group size: 0.237\n", + "iteration: 300, error: 0.45488, fairness violation: 0.0046659733333333335, violated group size: 0.263\n", + "iteration: 301, error: 0.45502990033222596, fairness violation: 0.004650471760797341, violated group size: 0.263\n", + "iteration: 302, error: 0.4551788079470199, fairness violation: 0.004635072847682119, violated group size: 0.263\n", + "iteration: 303, error: 0.4553267326732674, fairness violation: 0.004619775577557755, violated group size: 0.263\n", + "iteration: 304, error: 0.45547368421052636, fairness violation: 0.004604578947368419, violated group size: 0.237\n", + "iteration: 305, error: 0.4556196721311475, fairness violation: 0.004589481967213113, violated group size: 0.237\n", + "iteration: 306, error: 0.4556633986928105, fairness violation: 0.004589973856209149, violated group size: 0.237\n", + "iteration: 307, error: 0.4557524429967426, fairness violation: 0.004576566775244298, violated group size: 0.237\n", + "iteration: 308, error: 0.45589610389610397, fairness violation: 0.004561707792207791, violated group size: 0.237\n", + "iteration: 309, error: 0.4559838187702266, fairness violation: 0.004548478964401294, violated group size: 0.263\n", + "iteration: 310, error: 0.45607096774193545, fairness violation: 0.004535335483870968, violated group size: 0.263\n", + "iteration: 311, error: 0.4560353697749196, fairness violation: 0.004539041800643086, violated group size: 0.237\n", + "iteration: 312, error: 0.45617628205128213, fairness violation: 0.004524493589743589, violated group size: 0.263\n", + "iteration: 313, error: 0.45631629392971246, fairness violation: 0.004510038338658147, violated group size: 0.263\n", + "iteration: 314, error: 0.45628025477707, fairness violation: 0.004513789808917198, violated group size: 0.263\n", + "iteration: 315, error: 0.4564190476190476, fairness violation: 0.004499460317460317, violated group size: 0.263\n", + "iteration: 316, error: 0.45650632911392414, fairness violation: 0.004488221518987341, violated group size: 0.237\n", + "iteration: 317, error: 0.45664353312302836, fairness violation: 0.004474063091482649, violated group size: 0.237\n", + "iteration: 318, error: 0.4567295597484277, fairness violation: 0.004462974842767294, violated group size: 0.237\n", + "iteration: 319, error: 0.4568652037617556, fairness violation: 0.004448984326018807, violated group size: 0.237\n", + "iteration: 320, error: 0.45699999999999996, fairness violation: 0.00443508125, violated group size: 0.263\n", + "iteration: 321, error: 0.4571339563862929, fairness violation: 0.0044212647975077875, violated group size: 0.263\n", + "iteration: 322, error: 0.4572670807453416, fairness violation: 0.004407534161490681, violated group size: 0.237\n", + "iteration: 323, error: 0.4573993808049535, fairness violation: 0.004393888544891641, violated group size: 0.263\n", + "iteration: 324, error: 0.4575308641975308, fairness violation: 0.004380327160493826, violated group size: 0.237\n", + "iteration: 325, error: 0.45751692307692304, fairness violation: 0.00438435076923077, violated group size: 0.263\n", + "iteration: 326, error: 0.4576472392638037, fairness violation: 0.0043709018404907984, violated group size: 0.263\n", + "iteration: 327, error: 0.45751376146788997, fairness violation: 0.0043894250764525975, violated group size: 0.237\n", + "iteration: 328, error: 0.4576432926829267, fairness violation: 0.004376042682926829, violated group size: 0.237\n", + "iteration: 329, error: 0.4577203647416414, fairness violation: 0.004364182370820668, violated group size: 0.237\n", + "iteration: 330, error: 0.45753939393939397, fairness violation: 0.004382557575757575, violated group size: 0.237\n", + "iteration: 331, error: 0.45757401812688814, fairness violation: 0.004383637462235649, violated group size: 0.237\n", + "iteration: 332, error: 0.4575602409638555, fairness violation: 0.004387566265060242, violated group size: 0.263\n", + "iteration: 333, error: 0.4573513513513513, fairness violation: 0.004408552552552551, violated group size: 0.237\n", + "iteration: 334, error: 0.4571766467065869, fairness violation: 0.004427994011976048, violated group size: 0.237\n", + "iteration: 335, error: 0.4570179104477612, fairness violation: 0.00444590447761194, violated group size: 0.263\n", + "iteration: 336, error: 0.4568928571428572, fairness violation: 0.00446229761904762, violated group size: 0.263\n", + "iteration: 337, error: 0.45668842729970327, fairness violation: 0.004482813056379821, violated group size: 0.263\n", + "iteration: 338, error: 0.4568165680473372, fairness violation: 0.004469550295857987, violated group size: 0.237\n", + "iteration: 339, error: 0.4569439528023599, fairness violation: 0.004456365781710914, violated group size: 0.263\n", + "iteration: 340, error: 0.45683235294117647, fairness violation: 0.004462776470588236, violated group size: 0.263\n", + "iteration: 341, error: 0.4569589442815249, fairness violation: 0.0044496891495601175, violated group size: 0.263\n", + "iteration: 342, error: 0.4569970760233918, fairness violation: 0.004449152046783626, violated group size: 0.263\n", + "iteration: 343, error: 0.45712244897959176, fairness violation: 0.004436180758017492, violated group size: 0.263\n", + "iteration: 344, error: 0.45721802325581407, fairness violation: 0.004423284883720929, violated group size: 0.237\n", + "iteration: 345, error: 0.45734202898550724, fairness violation: 0.0044104637681159405, violated group size: 0.237\n", + "iteration: 346, error: 0.4573294797687861, fairness violation: 0.004411416184971097, violated group size: 0.263\n", + "iteration: 347, error: 0.45726512968299704, fairness violation: 0.004415095100864553, violated group size: 0.263\n", + "iteration: 348, error: 0.4570948275862069, fairness violation: 0.0044323735632183885, violated group size: 0.237\n", + "iteration: 349, error: 0.45721776504298, fairness violation: 0.004422389684813753, violated group size: 0.263\n", + "iteration: 350, error: 0.4570685714285714, fairness violation: 0.004438194285714283, violated group size: 0.237\n", + "iteration: 351, error: 0.4568717948717949, fairness violation: 0.004457960113960113, violated group size: 0.237\n", + "iteration: 352, error: 0.45676136363636366, fairness violation: 0.004462801136363637, violated group size: 0.263\n", + "iteration: 353, error: 0.4565665722379603, fairness violation: 0.004482385269121813, violated group size: 0.263\n", + "iteration: 354, error: 0.45668926553672323, fairness violation: 0.0044697231638418065, violated group size: 0.263\n", + "iteration: 355, error: 0.45673521126760563, fairness violation: 0.004461138028169011, violated group size: 0.237\n", + "iteration: 356, error: 0.4565421348314607, fairness violation: 0.0044805617977528075, violated group size: 0.237\n", + "iteration: 357, error: 0.45653221288515405, fairness violation: 0.004481288515406163, violated group size: 0.263\n", + "iteration: 358, error: 0.45660893854748597, fairness violation: 0.004471418994413408, violated group size: 0.263\n", + "iteration: 359, error: 0.45641782729805014, fairness violation: 0.004490651810584957, violated group size: 0.237\n", + "iteration: 360, error: 0.45638611111111105, fairness violation: 0.004493977777777778, violated group size: 0.263\n", + "iteration: 361, error: 0.4563102493074792, fairness violation: 0.00449991135734072, violated group size: 0.263\n", + "iteration: 362, error: 0.456232044198895, fairness violation: 0.004504502762430939, violated group size: 0.263\n", + "iteration: 363, error: 0.45615426997245184, fairness violation: 0.004509068870523414, violated group size: 0.263\n", + "iteration: 364, error: 0.455967032967033, fairness violation: 0.004527934065934064, violated group size: 0.237\n", + "iteration: 365, error: 0.4557808219178083, fairness violation: 0.0045466958904109575, violated group size: 0.263\n", + "iteration: 366, error: 0.45590163934426237, fairness violation: 0.004534273224043714, violated group size: 0.237\n", + "iteration: 367, error: 0.4558937329700272, fairness violation: 0.004534833787465939, violated group size: 0.263\n", + "iteration: 368, error: 0.4557092391304348, fairness violation: 0.004553423913043478, violated group size: 0.263\n", + "iteration: 369, error: 0.4558292682926829, fairness violation: 0.004541084010840108, violated group size: 0.237\n", + "iteration: 370, error: 0.455672972972973, fairness violation: 0.004556994594594594, violated group size: 0.237\n", + "iteration: 371, error: 0.4555202156334232, fairness violation: 0.004574097035040431, violated group size: 0.263\n", + "iteration: 372, error: 0.4553387096774194, fairness violation: 0.0045923817204301075, violated group size: 0.263\n", + "iteration: 373, error: 0.45537801608579087, fairness violation: 0.004591506702412869, violated group size: 0.263\n", + "iteration: 374, error: 0.4553743315508022, fairness violation: 0.004593171122994652, violated group size: 0.237\n", + "iteration: 375, error: 0.45530133333333334, fairness violation: 0.004597354666666665, violated group size: 0.237\n", + "iteration: 376, error: 0.45514893617021285, fairness violation: 0.004615382978723405, violated group size: 0.263\n", + "iteration: 377, error: 0.455, fairness violation: 0.004632058355437666, violated group size: 0.263\n", + "iteration: 378, error: 0.4548492063492063, fairness violation: 0.00464989947089947, violated group size: 0.237\n", + "iteration: 379, error: 0.4546728232189973, fairness violation: 0.004667646437994721, violated group size: 0.263\n", + "iteration: 380, error: 0.4545236842105263, fairness violation: 0.004682805263157895, violated group size: 0.263\n", + "iteration: 381, error: 0.45437270341207353, fairness violation: 0.004699128608923883, violated group size: 0.237\n", + "iteration: 382, error: 0.45419895287958123, fairness violation: 0.004716607329842932, violated group size: 0.237\n", + "iteration: 383, error: 0.4540261096605745, fairness violation: 0.004733994778067884, violated group size: 0.237\n", + "iteration: 384, error: 0.45385416666666667, fairness violation: 0.004751291666666666, violated group size: 0.237\n", + "iteration: 385, error: 0.4537116883116883, fairness violation: 0.004767267532467533, violated group size: 0.263\n", + "iteration: 386, error: 0.4535414507772021, fairness violation: 0.00478438860103627, violated group size: 0.263\n", + "iteration: 387, error: 0.45337209302325576, fairness violation: 0.004801421188630492, violated group size: 0.263\n", + "iteration: 388, error: 0.4532036082474227, fairness violation: 0.004818365979381443, violated group size: 0.263\n", + "iteration: 389, error: 0.4530359897172237, fairness violation: 0.004835223650385605, violated group size: 0.237\n", + "iteration: 390, error: 0.45286923076923075, fairness violation: 0.004851994871794871, violated group size: 0.237\n", + "iteration: 391, error: 0.45272890025575446, fairness violation: 0.004868680306905372, violated group size: 0.263\n", + "iteration: 392, error: 0.45266836734693877, fairness violation: 0.0048731887755102034, violated group size: 0.237\n", + "iteration: 393, error: 0.45257251908396945, fairness violation: 0.004886117048346056, violated group size: 0.237\n", + "iteration: 394, error: 0.45240862944162424, fairness violation: 0.004900182741116752, violated group size: 0.263\n", + "iteration: 395, error: 0.45226835443037977, fairness violation: 0.004915377215189875, violated group size: 0.263\n", + "iteration: 396, error: 0.45210606060606057, fairness violation: 0.00493169191919192, violated group size: 0.237\n", + "iteration: 397, error: 0.45194458438287155, fairness violation: 0.004947924433249372, violated group size: 0.263\n", + "iteration: 398, error: 0.45178391959799, fairness violation: 0.004964075376884422, violated group size: 0.237\n", + "iteration: 399, error: 0.4517017543859648, fairness violation: 0.0049682656641604015, violated group size: 0.237\n", + "iteration: 400, error: 0.4515699999999999, fairness violation: 0.004983100000000003, violated group size: 0.263\n", + "iteration: 401, error: 0.4514139650872818, fairness violation: 0.004997860349127184, violated group size: 0.263\n", + "iteration: 402, error: 0.45125621890547263, fairness violation: 0.005013726368159207, violated group size: 0.263\n", + "iteration: 403, error: 0.45116377171215877, fairness violation: 0.005027161290322582, violated group size: 0.237\n", + "iteration: 404, error: 0.45108415841584154, fairness violation: 0.0050311435643564375, violated group size: 0.237\n", + "iteration: 405, error: 0.4509283950617283, fairness violation: 0.005046809876543212, violated group size: 0.237\n", + "iteration: 406, error: 0.4507733990147783, fairness violation: 0.005062399014778328, violated group size: 0.263\n", + "iteration: 407, error: 0.4506437346437346, fairness violation: 0.0050755823095823115, violated group size: 0.237\n", + "iteration: 408, error: 0.4504926470588236, fairness violation: 0.005089862745098043, violated group size: 0.263\n", + "iteration: 409, error: 0.45036430317848414, fairness violation: 0.005102914425427874, violated group size: 0.263\n", + "iteration: 410, error: 0.45048536585365856, fairness violation: 0.005090468292682928, violated group size: 0.237\n", + "iteration: 411, error: 0.45036009732360094, fairness violation: 0.0051046082725060855, violated group size: 0.263\n", + "iteration: 412, error: 0.4504805825242718, fairness violation: 0.005092218446601944, violated group size: 0.237\n", + "iteration: 413, error: 0.4504891041162228, fairness violation: 0.005092513317191287, violated group size: 0.263\n", + "iteration: 414, error: 0.4506086956521739, fairness violation: 0.005080212560386476, violated group size: 0.237\n", + "iteration: 415, error: 0.450689156626506, fairness violation: 0.005070255421686748, violated group size: 0.237\n", + "iteration: 416, error: 0.4505624999999999, fairness violation: 0.005083134615384617, violated group size: 0.263\n", + "iteration: 417, error: 0.4506091127098321, fairness violation: 0.005081175059952039, violated group size: 0.237\n", + "iteration: 418, error: 0.45072727272727275, fairness violation: 0.005069019138755984, violated group size: 0.237\n", + "iteration: 419, error: 0.4508448687350835, fairness violation: 0.00505692124105012, violated group size: 0.237\n", + "iteration: 420, error: 0.4509619047619047, fairness violation: 0.0050448809523809535, violated group size: 0.263\n", + "iteration: 421, error: 0.45107838479809986, fairness violation: 0.0050328978622327806, violated group size: 0.237\n", + "iteration: 422, error: 0.45119431279620853, fairness violation: 0.005020971563981045, violated group size: 0.263\n", + "iteration: 423, error: 0.4513096926713947, fairness violation: 0.005009101654846337, violated group size: 0.237\n", + "iteration: 424, error: 0.45142452830188673, fairness violation: 0.0049972877358490575, violated group size: 0.237\n", + "iteration: 425, error: 0.45153882352941177, fairness violation: 0.004985529411764709, violated group size: 0.263\n", + "iteration: 426, error: 0.45165258215962434, fairness violation: 0.0049738262910798145, violated group size: 0.263\n", + "iteration: 427, error: 0.45176580796252924, fairness violation: 0.004962177985948481, violated group size: 0.263\n", + "iteration: 428, error: 0.4518785046728972, fairness violation: 0.004950584112149535, violated group size: 0.263\n", + "iteration: 429, error: 0.451990675990676, fairness violation: 0.004939044289044292, violated group size: 0.263\n", + "iteration: 430, error: 0.4521023255813953, fairness violation: 0.004927558139534886, violated group size: 0.263\n", + "iteration: 431, error: 0.4522134570765662, fairness violation: 0.004916125290023203, violated group size: 0.237\n", + "iteration: 432, error: 0.45232407407407416, fairness violation: 0.004904745370370373, violated group size: 0.263\n", + "iteration: 433, error: 0.4524341801385681, fairness violation: 0.004893418013856815, violated group size: 0.237\n", + "iteration: 434, error: 0.4525437788018434, fairness violation: 0.004882142857142861, violated group size: 0.263\n", + "iteration: 435, error: 0.4526528735632184, fairness violation: 0.004870919540229886, violated group size: 0.237\n", + "iteration: 436, error: 0.4527614678899081, fairness violation: 0.004859747706422021, violated group size: 0.263\n", + "iteration: 437, error: 0.4528306636155607, fairness violation: 0.0048497116704805535, violated group size: 0.263\n", + "iteration: 438, error: 0.45294063926940636, fairness violation: 0.004839721461187217, violated group size: 0.237\n", + "iteration: 439, error: 0.45304783599088844, fairness violation: 0.004828697038724374, violated group size: 0.237\n", + "iteration: 440, error: 0.4531545454545455, fairness violation: 0.00481772272727273, violated group size: 0.263\n", + "iteration: 441, error: 0.4532607709750567, fairness violation: 0.004806798185941045, violated group size: 0.263\n", + "iteration: 442, error: 0.453366515837104, fairness violation: 0.004795923076923078, violated group size: 0.263\n", + "iteration: 443, error: 0.45347178329571103, fairness violation: 0.004785097065462756, violated group size: 0.263\n", + "iteration: 444, error: 0.4535765765765766, fairness violation: 0.0047743198198198205, violated group size: 0.237\n", + "iteration: 445, error: 0.4536808988764045, fairness violation: 0.004763591011235956, violated group size: 0.237\n", + "iteration: 446, error: 0.4537847533632287, fairness violation: 0.004752910313901348, violated group size: 0.263\n", + "iteration: 447, error: 0.4538881431767337, fairness violation: 0.004742277404921701, violated group size: 0.237\n", + "iteration: 448, error: 0.4539910714285715, fairness violation: 0.004731691964285714, violated group size: 0.237\n", + "iteration: 449, error: 0.45409354120267265, fairness violation: 0.0047211536748329634, violated group size: 0.237\n", + "iteration: 450, error: 0.4541955555555555, fairness violation: 0.004710662222222223, violated group size: 0.237\n", + "iteration: 451, error: 0.4542971175166297, fairness violation: 0.004700217294900223, violated group size: 0.263\n", + "iteration: 452, error: 0.45439823008849556, fairness violation: 0.004689818584070798, violated group size: 0.263\n", + "iteration: 453, error: 0.45449889624724066, fairness violation: 0.0046794657836644596, violated group size: 0.237\n", + "iteration: 454, error: 0.4545991189427313, fairness violation: 0.00466915859030837, violated group size: 0.237\n", + "iteration: 455, error: 0.4546989010989011, fairness violation: 0.004658896703296704, violated group size: 0.263\n", + "iteration: 456, error: 0.4547982456140351, fairness violation: 0.004648679824561405, violated group size: 0.237\n", + "iteration: 457, error: 0.4548971553610503, fairness violation: 0.004638507658643327, violated group size: 0.263\n", + "iteration: 458, error: 0.45499563318777286, fairness violation: 0.0046283799126637555, violated group size: 0.237\n", + "iteration: 459, error: 0.45505882352941174, fairness violation: 0.0046203616557734225, violated group size: 0.263\n", + "iteration: 460, error: 0.4551565217391304, fairness violation: 0.004610317391304348, violated group size: 0.237\n", + "iteration: 461, error: 0.4551149674620391, fairness violation: 0.004613683297180044, violated group size: 0.237\n", + "iteration: 462, error: 0.45519047619047615, fairness violation: 0.004603696969696971, violated group size: 0.237\n", + "iteration: 463, error: 0.45528725701943845, fairness violation: 0.004593753779697626, violated group size: 0.237\n", + "iteration: 464, error: 0.4553836206896551, fairness violation: 0.004583853448275864, violated group size: 0.263\n", + "iteration: 465, error: 0.4554795698924731, fairness violation: 0.004573995698924732, violated group size: 0.263\n", + "iteration: 466, error: 0.45553862660944205, fairness violation: 0.004565197424892706, violated group size: 0.263\n", + "iteration: 467, error: 0.4555674518201284, fairness violation: 0.004565571734475376, violated group size: 0.263\n", + "iteration: 468, error: 0.4556623931623932, fairness violation: 0.00455581623931624, violated group size: 0.237\n", + "iteration: 469, error: 0.4557569296375267, fairness violation: 0.004546102345415778, violated group size: 0.237\n", + "iteration: 470, error: 0.4557872340425532, fairness violation: 0.004545506382978723, violated group size: 0.237\n", + "iteration: 471, error: 0.45588110403397036, fairness violation: 0.004535855626326964, violated group size: 0.237\n", + "iteration: 472, error: 0.4559745762711865, fairness violation: 0.004526245762711867, violated group size: 0.263\n", + "iteration: 473, error: 0.45600422832980975, fairness violation: 0.0045256955602537, violated group size: 0.237\n", + "iteration: 474, error: 0.456097046413502, fairness violation: 0.004516147679324895, violated group size: 0.237\n", + "iteration: 475, error: 0.45618947368421053, fairness violation: 0.004506640000000003, violated group size: 0.263\n", + "iteration: 476, error: 0.4562478991596639, fairness violation: 0.0044991638655462185, violated group size: 0.237\n", + "iteration: 477, error: 0.45624109014675046, fairness violation: 0.004501656184486373, violated group size: 0.237\n", + "iteration: 478, error: 0.4563138075313808, fairness violation: 0.004493230125523012, violated group size: 0.263\n", + "iteration: 479, error: 0.45637160751565764, fairness violation: 0.004485828810020879, violated group size: 0.263\n", + "iteration: 480, error: 0.4564625000000001, fairness violation: 0.004476483333333333, violated group size: 0.237\n", + "iteration: 481, error: 0.45641787941787937, fairness violation: 0.00447900207900208, violated group size: 0.263\n", + "iteration: 482, error: 0.45650829875518667, fairness violation: 0.004469709543568465, violated group size: 0.263\n", + "iteration: 483, error: 0.4565983436853003, fairness violation: 0.004460455486542443, violated group size: 0.263\n", + "iteration: 484, error: 0.4566880165289256, fairness violation: 0.004451239669421488, violated group size: 0.263\n", + "iteration: 485, error: 0.45677731958762885, fairness violation: 0.004442061855670102, violated group size: 0.237\n", + "iteration: 486, error: 0.45680246913580247, fairness violation: 0.004442674897119343, violated group size: 0.263\n", + "iteration: 487, error: 0.45679671457905546, fairness violation: 0.004444258726899385, violated group size: 0.263\n", + "iteration: 488, error: 0.4568852459016393, fairness violation: 0.004435151639344263, violated group size: 0.263\n", + "iteration: 489, error: 0.4569734151329243, fairness violation: 0.004426081799591004, violated group size: 0.263\n", + "iteration: 490, error: 0.4570612244897959, fairness violation: 0.004417048979591837, violated group size: 0.237\n", + "iteration: 491, error: 0.45714867617107935, fairness violation: 0.004408052953156824, violated group size: 0.263\n", + "iteration: 492, error: 0.45723780487804877, fairness violation: 0.004400056910569106, violated group size: 0.237\n", + "iteration: 493, error: 0.45732454361054764, fairness violation: 0.004391131845841786, violated group size: 0.237\n", + "iteration: 494, error: 0.45741093117408893, fairness violation: 0.0043822429149797575, violated group size: 0.237\n", + "iteration: 495, error: 0.45749696969696974, fairness violation: 0.0043733898989899, violated group size: 0.263\n", + "iteration: 496, error: 0.4574536290322581, fairness violation: 0.004376995967741938, violated group size: 0.263\n", + "iteration: 497, error: 0.4575392354124748, fairness violation: 0.004368189134808854, violated group size: 0.263\n", + "iteration: 498, error: 0.45759036144578313, fairness violation: 0.004360369477911648, violated group size: 0.237\n", + "iteration: 499, error: 0.4575811623246493, fairness violation: 0.004363030060120242, violated group size: 0.263\n" + ] + } + ], + "source": [ + "C = 100\n", + "print_flag = True\n", + "gamma = .005\n", + "\n", + "\n", + "fair_model = GerryFairClassifier(C=C, printflag=print_flag, gamma=gamma, fairness_def='FP',\n", + " max_iters=max_iterations, heatmapflag=False)\n", + "\n", + "# fit method\n", + "fair_model.fit(data_set, early_termination=True)\n", + "\n", + "# predict method. If threshold in (0, 1) produces binary predictions\n", + "\n", + "dataset_yhat = fair_model.predict(data_set, threshold=False)\n", + "\n", + "\n" + ] + }, { - "data": { - "image/png": "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\n", - "text/plain": [ - "" + "cell_type": "markdown", + "metadata": { + "id": "LrpRmOpVg9Fv" + }, + "source": [ + "**3-d heatmaps**\n", + "\n", + "We now show to generate a 3d-heatmap of unfairness using the `generate_heatmap` method. The $X-Y$ axes in the plot represent the coefficients of the linear threshold function that defines a protected subgroup with respect to the first two sensitive attributes. Which $2$ attributes are considered sensitive can be overwritten with the `col_index` argument. The $Z$-axes is the $\\gamma$-disparity (FP) of the corresponding subgroup defined by the linear threshold function. This is important because it allows us to (1) visualize convergence as the heatmap flattens and (2) brute force check the fairness in low-dimensions without relying on a heuristic auditor. See the [the rich subgroup fairness empirical paper](https://arxiv.org/abs/1808.08166) for a discussion of these plots. Note that in the below plot no group has a $\\gamma$-disparity of greater than $.005$, which we would expect since the set of linear threshold functions on two attributes is a subset of the set of linear threshold functions on all protected attributes, and the final model is $\\gamma$-fair." ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "# output heatmap (brute force)\n", - "# replace None with the relative path if you want to save the plot\n", - "fair_model.heatmapflag = True\n", - "fair_model.heatmap_path = 'heatmap'\n", - "fair_model.generate_heatmap(data_set, dataset_yhat.labels)\n", - "Image(filename='{}.png'.format(fair_model.heatmap_path)) \n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**black-box auditing**\n", - "\n", - "We now show to audit any black box classifier with respect to rich subgroup fairness under either FP or FN rate. Note the below auditing procedure would work for any set of (soft) predictions $\\hat{y}$, and need make no assumptions about the structure of the predictor. We note that as expected the disparity of the group found is the same as the disparity printed out in the last iteration of the `fit` method.\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.004955178356713431\n" - ] - } - ], - "source": [ - "\n", - "\n", - "gerry_metric = BinaryLabelDatasetMetric(data_set)\n", - "gamma_disparity = gerry_metric.rich_subgroup(array_to_tuple(dataset_yhat.labels), 'FP')\n", - "print(gamma_disparity)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**pareto curves**\n", - "\n", - "The `FairFictPlay` algorithm implemented in the `fit` method converges given access to perfect oracles for solving cost-sensitive classification (CSC) problems. A cost-sensitive classification problem over a hypothesis class $\\mathcal{H}$ is $$\\min_{h}\\sum_{i = 1}^{n}(1-h(x_i))c_0 + h(x_i)c_1$$\n", - "By default in this package, and in the companion [empirical](https://arxiv.org/abs/1808.08166) and [theory](https://arxiv.org/pdf/1711.05144.pdf) papers, the hypothesis class of the learner and the of the subgroups are hyperplanes. The corresponding heuristic oracle for solving the CSC problem first forms two regression problems $(x_i, c_0)$ and $(x_i, c_1)$. Then in the case of hyperplanes, trains two regressions $r_i: \\mathcal{X} \\to R$ which predict the costs of classifying a given point $x$ $0,1$ respectively. Finally the binary classifier output by the oracle is defined as $\\hat{r}(x) = \\arg\\min_{j \\in \\{0,1\\}}r_j(x)$. But of course if we are interesting in different hypothesis classes for the learner, we simply need different regressors. In this package in addition to linear regression, we've added support for regression trees, kernelized ridge regression, and support vector regression. Below we trace out Pareto curves of $\\gamma$-disparity vs. error for each of these different heuristic oracles. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ + "cell_type": "code", + "execution_count": 8, + "metadata": { + "pycharm": { + "is_executing": true + }, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 497 + }, + "id": "4kKzNgmRg9Fw", + "outputId": "f8f0f0a7-babf-4a1c-f92f-d3f46f127e92" + }, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "\n", + "# output heatmap (brute force)\n", + "# replace None with the relative path if you want to save the plot\n", + "fair_model.heatmapflag = True\n", + "fair_model.heatmap_path = 'heatmap'\n", + "fair_model.generate_heatmap(data_set, dataset_yhat.labels)\n", + "Image(filename='{}.png'.format(fair_model.heatmap_path))\n", + "\n", + "\n", + "\n" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Curr Predictor: Linear\n", - "Curr Predictor: SVR\n", - "Curr Predictor: Tree\n", - "Curr Predictor: Kernel\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "OYsi5G4Pg9Fw" + }, + "source": [ + "**black-box auditing**\n", + "\n", + "We now show to audit any black box classifier with respect to rich subgroup fairness under either FP or FN rate. Note the below auditing procedure would work for any set of (soft) predictions $\\hat{y}$, and need make no assumptions about the structure of the predictor. We note that as expected the disparity of the group found is the same as the disparity printed out in the last iteration of the `fit` method.\n", + " " + ] }, { - "data": { - "image/png": "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\n", - "text/plain": [ - "" + "cell_type": "code", + "execution_count": 9, + "metadata": { + "pycharm": { + "is_executing": true + }, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lBcmHN2zg9Fw", + "outputId": "a72d2611-a00a-41b8-d617-04a8aa7a58e7" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "0.004363030060120244\n" + ] + } + ], + "source": [ + "\n", + "\n", + "gerry_metric = BinaryLabelDatasetMetric(data_set)\n", + "gamma_disparity = gerry_metric.rich_subgroup(array_to_tuple(dataset_yhat.labels), 'FP')\n", + "print(gamma_disparity)\n" ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# set to 50 iterations for fast running of notebook - set >= 1000 when running real experiments\n", - "pareto_iters = 50\n", - "def multiple_classifiers_pareto(dataset, gamma_list=[0.002, 0.005, 0.01, 0.02, 0.05, 0.1], save_results=False, iters=pareto_iters):\n", - "\n", - " ln_predictor = linear_model.LinearRegression()\n", - " svm_predictor = svm.LinearSVR()\n", - " tree_predictor = tree.DecisionTreeRegressor(max_depth=3)\n", - " kernel_predictor = KernelRidge(alpha=1.0, gamma=1.0, kernel='rbf')\n", - " predictor_dict = {'Linear': {'predictor': ln_predictor, 'iters': iters},\n", - " 'SVR': {'predictor': svm_predictor, 'iters': iters},\n", - " 'Tree': {'predictor': tree_predictor, 'iters': iters},\n", - " 'Kernel': {'predictor': kernel_predictor, 'iters': iters}}\n", - "\n", - " results_dict = {}\n", - "\n", - " for pred in predictor_dict:\n", - " print('Curr Predictor: {}'.format(pred))\n", - " predictor = predictor_dict[pred]['predictor']\n", - " max_iters = predictor_dict[pred]['iters']\n", - " fair_clf = GerryFairClassifier(C=100, printflag=True, gamma=1, predictor=predictor, max_iters=max_iters)\n", - " fair_clf.printflag = False\n", - " fair_clf.max_iters=max_iters\n", - " errors, fp_violations, fn_violations = fair_clf.pareto(dataset, gamma_list)\n", - " results_dict[pred] = {'errors': errors, 'fp_violations': fp_violations, 'fn_violations': fn_violations}\n", - " plt.plot(errors, fp_violations, label=pred)\n", - "\n", - " if save_results:\n", - " pickle.dump(results_dict, open('results_dict_' + str(gamma_list) + '_gammas' + str(gamma_list) + '.pkl', 'wb'))\n", - "\n", - " plt.xlabel('Error')\n", - " plt.ylabel('Unfairness')\n", - " plt.legend()\n", - " plt.title('Error vs. Unfairness\\n(Adult Dataset)')\n", - " plt.savefig('gerryfair_pareto.png')\n", - " plt.close()\n", - "multiple_classifiers_pareto(data_set)\n", - "Image(filename='gerryfair_pareto.png') " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A natural question one might ask is, suppose we fix a statistical fairness definition for rich subgroup fairness like equality of false positive rates, `FP`. Does learning a classifier that is fair with respect to `FP` increase or decrease fairness with respect to false negative rates `FN`? One could see this relationship going in either direction - and indeed we submit that it is dataset dependent. In some cases, if enforcing `FP` fairness pushes the classifier towards the constant classifier, then it will also satisify `FN` rate fairness, since the constant classifier is perfectly fair. However, if the hypothesis class is sufficiently rich, then one would expect that ceteris paribus since we are optimizing for error in addition to `FP` rate fairness, the algorithm would increase `FN` rate unfairness in order to decrease error. Below we trace the FN vs. FP rate tradeoff across a range of input $\\gamma$, where the classifier is optimized only for `FP` rate fairness. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pHEF-qTag9Fw" + }, + "source": [ + "**pareto curves**\n", + "\n", + "The `FairFictPlay` algorithm implemented in the `fit` method converges given access to perfect oracles for solving cost-sensitive classification (CSC) problems. A cost-sensitive classification problem over a hypothesis class $\\mathcal{H}$ is $$\\min_{h}\\sum_{i = 1}^{n}(1-h(x_i))c_0 + h(x_i)c_1$$\n", + "By default in this package, and in the companion [empirical](https://arxiv.org/abs/1808.08166) and [theory](https://arxiv.org/pdf/1711.05144.pdf) papers, the hypothesis class of the learner and the of the subgroups are hyperplanes. The corresponding heuristic oracle for solving the CSC problem first forms two regression problems $(x_i, c_0)$ and $(x_i, c_1)$. Then in the case of hyperplanes, trains two regressions $r_i: \\mathcal{X} \\to R$ which predict the costs of classifying a given point $x$ $0,1$ respectively. Finally the binary classifier output by the oracle is defined as $\\hat{r}(x) = \\arg\\min_{j \\in \\{0,1\\}}r_j(x)$. But of course if we are interesting in different hypothesis classes for the learner, we simply need different regressors. In this package in addition to linear regression, we've added support for regression trees, kernelized ridge regression, and support vector regression. Below we trace out Pareto curves of $\\gamma$-disparity vs. error for each of these different heuristic oracles." + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "gamma: 0.001 gamma: 0.002 gamma: 0.003 gamma: 0.004 gamma: 0.005 gamma: 0.0075 gamma: 0.01 gamma: 0.02 gamma: 0.03 gamma: 0.05 " - ] + "cell_type": "code", + "execution_count": 10, + "metadata": { + "pycharm": { + "is_executing": true + }, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 568 + }, + "id": "2KbOJzJfg9Fw", + "outputId": "dbf3a216-2c8e-4711-c601-771810249fd5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Curr Predictor: Linear\n", + "Curr Predictor: SVR\n", + "Curr Predictor: Tree\n", + "Curr Predictor: Kernel\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "image/png": "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69atyMnJkY8zm82YNm2a0zkzMjLG/yK8yBP9NZxAjK3z58/jwoULeOihh+Qyh8MBAFCpVKirq/Pb2PJEX82cOfOW4wIxroYTFBSE+fPn49y5cwDgt3FFruEcQD+iVqtx3333oaSkRC5zOBwoKSlx+r/Am73yyit4+eWXceDAAWRmZo76Oo2Njbh27ZrTG4avudO+upnD4YDNZgMAJCUlIS4uzumc7e3tOH78+JjOORl5or+GE4ixlZaWhqqqKlRWVsrb6tWrkZubi8rKShgMBr+NLU/01XACMa6G09fXh6qqKrkf/DWuyEUT/RQKja+ioiKh0WjE3r17RU1NjXjqqadEZGSk/Oj/448/Lp577jm5/rZt24RarRbvv/++01IBFotFCCGExWIRzzzzjCgvLxf19fXi8OHD4t577xWpqamiu7t7Qq5xvIy1r373u9+J4uJicf78eVFTUyO2b98uVCqV2L17t1xn27ZtIjIyUnz44Yfi9OnTorCw0G+WVBjv/mJsPTfi8cM9xeqvsTXefcW4GuyrX//61+LgwYPi/Pnz4tSpU2LdunVCq9WK6upquY6/xhWNjgmgH3rttdfEjBkzhFqtFgsXLhSff/65vG/58uVi/fr18t+JiYkCwC3bli1bhBBCdHZ2iry8PBETEyOCgoJEYmKiePLJJ29ZS8pXjaWvfvWrX4mUlBSh1WpFVFSUyM7OFkVFRU7nczgcYvPmzUKv1wuNRiNWrlwp6urqvHU5Hjee/cXYWj/iscMlgP4cW+PZV4yr9fLfTz/9tFxXr9eLBx54QHz55ZdO5/PnuKLbk4QQYkJvQRIRERGRV3EOIBEREVGAYQJIREREFGCYABIREREFGCaARERERAGGCSARERFRgGECSERERBRgmAASERERBRgmgEREREQBhgkgEfmtDRs2QJKkW7aCgoKJbhoR0YRSTXQDiIg8qaCgAHv27HEq02g0w9bt6elBUFCQU5ndbodarR7z697pcURE3sA7gETk1zQaDeLi4py2qKgoAIAkSdi1axdWr16N0NBQ/Pa3v8WLL76IjIwMvPnmm0hKSoJWqwUAXLx4EYWFhQgLC0N4eDi++93vwmw2y68z0nFERJMRE0AiCmgvvvgiHn74YVRVVeEHP/gBAODcuXP45z//iX379qGyshIOhwOFhYVoaWnBJ598gkOHDuGbb77B2rVrnc5183FERJMVPwImIr/20UcfISwszKls06ZN2LRpEwDgsccewxNPPOG0326345133kFMTAwA4NChQ6iqqkJ9fT0MBgMA4J133sGcOXPwxRdfYMGCBcMeR0Q0WTEBJCK/lpubi127djmVTZkyRf49MzPzlmMSExOdkrja2loYDAY5+QOA2bNnIzIyErW1tXICePNxRESTFRNAIvJroaGhSElJue1+V8pcfS0iIl/AOYBERKNIT09HQ0MDGhoa5LKamhq0trZi9uzZE9gyIqI7wzuAROTXbDYbTCaTU5lKpUJ0dLTL5zAajZg7dy6+973vYceOHejt7cWPf/xjLF++fNiPkImIJjveASQiv3bgwAFMmzbNaVuyZMmYziFJEj788ENERUVh2bJlMBqNSE5OxnvvveehVhMReZYkhBAT3QgiIiIi8h7eASQiIiIKMEwAiYiIiAIME0AiIiKiAMMEkIiIiCjAMAEkIiIiCjBMAImIiIgCDBNAIiIiogDDBJCIiIgowDABJCIiIgowTACJiIiIAgwTQCIiIqIAwwSQiIiIKMD8P4XvwG1VmS1QAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 10 + } + ], + "source": [ + "# set to 50 iterations for fast running of notebook - set >= 1000 when running real experiments\n", + "pareto_iters = 50\n", + "def multiple_classifiers_pareto(dataset, gamma_list=[0.002, 0.005, 0.01, 0.02, 0.05, 0.1], save_results=False, iters=pareto_iters):\n", + "\n", + " ln_predictor = linear_model.LinearRegression()\n", + " svm_predictor = svm.LinearSVR()\n", + " tree_predictor = tree.DecisionTreeRegressor(max_depth=3)\n", + " kernel_predictor = KernelRidge(alpha=1.0, gamma=1.0, kernel='rbf')\n", + " predictor_dict = {'Linear': {'predictor': ln_predictor, 'iters': iters},\n", + " 'SVR': {'predictor': svm_predictor, 'iters': iters},\n", + " 'Tree': {'predictor': tree_predictor, 'iters': iters},\n", + " 'Kernel': {'predictor': kernel_predictor, 'iters': iters}}\n", + "\n", + " results_dict = {}\n", + "\n", + " for pred in predictor_dict:\n", + " print('Curr Predictor: {}'.format(pred))\n", + " predictor = predictor_dict[pred]['predictor']\n", + " max_iters = predictor_dict[pred]['iters']\n", + " fair_clf = GerryFairClassifier(C=100, printflag=True, gamma=1, predictor=predictor, max_iters=max_iters)\n", + " fair_clf.printflag = False\n", + " fair_clf.max_iters=max_iters\n", + " errors, fp_violations, fn_violations = fair_clf.pareto(dataset, gamma_list)\n", + " results_dict[pred] = {'errors': errors, 'fp_violations': fp_violations, 'fn_violations': fn_violations}\n", + " plt.plot(errors, fp_violations, label=pred)\n", + "\n", + " if save_results:\n", + " pickle.dump(results_dict, open('results_dict_' + str(gamma_list) + '_gammas' + str(gamma_list) + '.pkl', 'wb'))\n", + "\n", + " plt.xlabel('Error')\n", + " plt.ylabel('Unfairness')\n", + " plt.legend()\n", + " plt.title('Error vs. Unfairness\\n(Adult Dataset)')\n", + " plt.savefig('gerryfair_pareto.png')\n", + " plt.close()\n", + "multiple_classifiers_pareto(data_set)\n", + "Image(filename='gerryfair_pareto.png')" + ] }, { - "data": { - "image/png": "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\n", - "text/plain": [ - "" + "cell_type": "markdown", + "metadata": { + "id": "vuZlaXsgg9Fw" + }, + "source": [ + "A natural question one might ask is, suppose we fix a statistical fairness definition for rich subgroup fairness like equality of false positive rates, `FP`. Does learning a classifier that is fair with respect to `FP` increase or decrease fairness with respect to false negative rates `FN`? One could see this relationship going in either direction - and indeed we submit that it is dataset dependent. In some cases, if enforcing `FP` fairness pushes the classifier towards the constant classifier, then it will also satisify `FN` rate fairness, since the constant classifier is perfectly fair. However, if the hypothesis class is sufficiently rich, then one would expect that ceteris paribus since we are optimizing for error in addition to `FP` rate fairness, the algorithm would increase `FN` rate unfairness in order to decrease error. Below we trace the FN vs. FP rate tradeoff across a range of input $\\gamma$, where the classifier is optimized only for `FP` rate fairness." ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "pycharm": { + "is_executing": true + }, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 515 + }, + "id": "BmyF8-u9g9Fw", + "outputId": "bd958e75-a38d-43c1-bccd-f14ee0ef9fed" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "gamma: 0.001 gamma: 0.002 gamma: 0.003 gamma: 0.004 gamma: 0.005 gamma: 0.0075 gamma: 0.01 gamma: 0.02 gamma: 0.03 gamma: 0.05 " + ] + }, + { + "output_type": "execute_result", + "data": { + "image/png": "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WhoWLVqE5ORkuLu7Izg4WPkSR2JiIsTifzorO3XqhF27dmHBggWYP38+nJyccPDgQbi4uCjbzJkzBzk5OZg8eTIyMzPRuXNnBAcHQyb7p5buzp07MXXqVPTo0QNisRhDhw7F+vXrq+7AiYiIiDSgWowDWFNxHCEiIqKah9fvavAMIBERERFVLSaARERERFqGCSARERGRlmECSERERKRlmAASERERaRkmgERERERahgkgERERkZZhAkhERESkZZgAEhEREWmZalEKrqZ6XkQlOztbw5EQERFRWT2/bmtzMTQmgK/hyZMnAABbW1sNR0JERETl9eTJE5iYmGg6DI1gLeDXoFAokJSUBCMjI4hEIrVuOzs7G7a2trh//77W1imsaXjOah6es5qH56zmqY7nTBAEPHnyBDY2NhCLtfNpOPYAvgaxWIyGDRtW6j6MjY2rzT8YKhues5qH56zm4TmrearbOdPWnr/ntDPtJSIiItJiTACJiIiItAwTwGpKT08Pixcvhp6enqZDoTLiOat5eM5qHp6zmofnrHriSyBEREREWoY9gERERERahgkgERERkZZhAkhERESkZZgAEhEREWkZJoBVZOPGjbC3t4dMJoOHhwcuXrz40vb79u2Ds7MzZDIZXF1dcfjwYZXlgiBg0aJFqF+/PvT19eHt7Y24uLjKPASto+5ztn//fvTq1Qvm5uYQiUSIioqqxOi1kzrPWWFhIebOnQtXV1cYGhrCxsYGY8eORVJSUmUfhtZR97+1JUuWwNnZGYaGhqhbty68vb1x4cKFyjwEraPuc/ZvU6ZMgUgkQlBQkJqjJhUCVbrdu3cLUqlU+O6774Tr168LkyZNEkxNTYWUlJRS2589e1aQSCTCypUrhRs3bggLFiwQdHV1hatXryrbLF++XDAxMREOHjwoREdHCwMHDhQcHByEZ8+eVdVh1WqVcc527NghLF26VNi6dasAQIiMjKyio9EO6j5nmZmZgre3t7Bnzx4hJiZGCAsLEzp06CC0bdu2Kg+r1quMf2s7d+4UQkJChDt37gjXrl0TJk6cKBgbGwupqalVdVi1WmWcs+f2798vuLm5CTY2NsLatWsr+Ui0GxPAKtChQwfhww8/VH6Wy+WCjY2NEBgYWGr74cOHC/369VOZ5+HhIbz33nuCIAiCQqEQrK2thVWrVimXZ2ZmCnp6esJP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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 11 + } + ], + "source": [ + "def fp_vs_fn(dataset, gamma_list, iters):\n", + " fp_auditor = Auditor(dataset, 'FP')\n", + " fn_auditor = Auditor(dataset, 'FN')\n", + " fp_violations = []\n", + " fn_violations = []\n", + " for g in gamma_list:\n", + " print('gamma: {} '.format(g), end =\" \")\n", + " fair_model = GerryFairClassifier(C=100, printflag=False, gamma=g, max_iters=iters)\n", + " fair_model.gamma=g\n", + " fair_model.fit(dataset)\n", + " predictions = array_to_tuple((fair_model.predict(dataset)).labels)\n", + " _, fp_diff = fp_auditor.audit(predictions)\n", + " _, fn_diff = fn_auditor.audit(predictions)\n", + " fp_violations.append(fp_diff)\n", + " fn_violations.append(fn_diff)\n", + "\n", + " plt.plot(fp_violations, fn_violations, label='adult')\n", + " plt.xlabel('False Positive Disparity')\n", + " plt.ylabel('False Negative Disparity')\n", + " plt.legend()\n", + " plt.title('FP vs FN Unfairness')\n", + " plt.savefig('gerryfair_fp_fn.png')\n", + " plt.close()\n", + "\n", + "gamma_list = [0.001, 0.002, 0.003, 0.004, 0.005, 0.0075, 0.01, 0.02, 0.03, 0.05]\n", + "fp_vs_fn(data_set, gamma_list, pareto_iters)\n", + "Image(filename='gerryfair_fp_fn.png')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true + }, + "id": "NDHXlmO0g9Fx" + }, + "outputs": [], + "source": [] } - ], - "source": [ - "def fp_vs_fn(dataset, gamma_list, iters):\n", - " fp_auditor = Auditor(dataset, 'FP')\n", - " fn_auditor = Auditor(dataset, 'FN')\n", - " fp_violations = []\n", - " fn_violations = []\n", - " for g in gamma_list:\n", - " print('gamma: {} '.format(g), end =\" \")\n", - " fair_model = GerryFairClassifier(C=100, printflag=False, gamma=g, max_iters=iters)\n", - " fair_model.gamma=g\n", - " fair_model.fit(dataset)\n", - " predictions = array_to_tuple((fair_model.predict(dataset)).labels)\n", - " _, fp_diff = fp_auditor.audit(predictions)\n", - " _, fn_diff = fn_auditor.audit(predictions)\n", - " fp_violations.append(fp_diff)\n", - " fn_violations.append(fn_diff)\n", - "\n", - " plt.plot(fp_violations, fn_violations, label='adult')\n", - " plt.xlabel('False Positive Disparity')\n", - " plt.ylabel('False Negative Disparity')\n", - " plt.legend()\n", - " plt.title('FP vs FN Unfairness')\n", - " plt.savefig('gerryfair_fp_fn.png')\n", - " plt.close()\n", - "\n", - "gamma_list = [0.001, 0.002, 0.003, 0.004, 0.005, 0.0075, 0.01, 0.02, 0.03, 0.05]\n", - "fp_vs_fn(data_set, gamma_list, pareto_iters)\n", - "Image(filename='gerryfair_fp_fn.png')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { + ], + "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.9" + }, "pycharm": { - "is_executing": true + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + }, + "colab": { + "provenance": [] } - }, - "outputs": [], - "source": [] - } - ], - "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.9" }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } - } - }, - "nbformat": 4, - "nbformat_minor": 1 + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/examples/demo_json_explainers.ipynb b/examples/demo_json_explainers.ipynb index da23274c..c7879213 100644 --- a/examples/demo_json_explainers.ipynb +++ b/examples/demo_json_explainers.ipynb @@ -1,263 +1,444 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Load all necessary packages\n", - "import sys\n", - "sys.path.append(\"../\")\n", - "from collections import OrderedDict\n", - "import json\n", - "from pprint import pprint\n", - "from aif360.datasets import GermanDataset\n", - "from aif360.metrics import BinaryLabelDatasetMetric\n", - "from aif360.explainers import MetricTextExplainer, MetricJSONExplainer\n", - "from IPython.display import JSON, display_json" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Load dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "gd = GermanDataset()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Create metrics" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "priv = [{'sex': 1}]\n", - "unpriv = [{'sex': 0}]\n", - "bldm = BinaryLabelDatasetMetric(gd, unprivileged_groups=unpriv, privileged_groups=priv)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Create explainers" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "text_expl = MetricTextExplainer(bldm)\n", - "json_expl = MetricJSONExplainer(bldm)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Text explanations" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ + "cells": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of positive-outcome instances: 700.0\n" - ] - } - ], - "source": [ - "print(text_expl.num_positives())" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": { + }, + "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_json_explainers.ipynb)\n" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Mean difference (mean label value on privileged instances - mean label value on unprivileged instances): -0.0748013090229\n" - ] - } - ], - "source": [ - "print(text_expl.mean_difference())" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "source": [ + "!pip install aif360" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "zZR2TMbZ0x_l", + "outputId": "2f3e2fb5-33b8-45a7-bc79-c2c781eba163" + }, + "execution_count": 1, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting aif360\n", + " Downloading aif360-0.5.0-py3-none-any.whl (214 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m214.1/214.1 kB\u001b[0m \u001b[31m3.1 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" + ] + } + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Disparate impact (probability of favorable outcome for unprivileged instances / probability of favorable outcome for privileged instances): 0.896567328205\n" - ] - } - ], - "source": [ - "print(text_expl.disparate_impact())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### JSON Explanations" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def format_json(json_str):\n", - " return json.dumps(json.loads(json_str, object_pairs_hook=OrderedDict), indent=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VwiyXRmd0uqW", + "outputId": "b6ada560-3bb5-4dfc-ec8d-3600bb677fa5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "WARNING:root:No module named 'tempeh': LawSchoolGPADataset will be unavailable. To install, run:\n", + "pip install 'aif360[LawSchoolGPA]'\n", + "WARNING:root:No module named 'fairlearn': ExponentiatedGradientReduction will be unavailable. To install, run:\n", + "pip install 'aif360[Reductions]'\n", + "WARNING:root:No module named 'fairlearn': GridSearchReduction will be unavailable. To install, run:\n", + "pip install 'aif360[Reductions]'\n", + "WARNING:root:No module named 'fairlearn': GridSearchReduction will be unavailable. To install, run:\n", + "pip install 'aif360[Reductions]'\n" + ] + } + ], + "source": [ + "# Load all necessary packages\n", + "import sys\n", + "sys.path.append(\"../\")\n", + "from collections import OrderedDict\n", + "import json\n", + "from pprint import pprint\n", + "from aif360.datasets import GermanDataset\n", + "from aif360.metrics import BinaryLabelDatasetMetric\n", + "from aif360.explainers import MetricTextExplainer, MetricJSONExplainer\n", + "from IPython.display import JSON, display_json" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"metric\": \"num_positives\", \n", - " \"message\": \"Number of positive-outcome instances: 700.0\", \n", - " \"numPositives\": 700.0, \n", - " \"description\": \"Computed as the number of positive instances for the given (privileged or unprivileged) group.\", \n", - " \"ideal\": \"The ideal value of this metric lies in the total number of positive instances made available\"\n", - "}\n" - ] - } - ], - "source": [ - "print(format_json(json_expl.num_positives()))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ + "cell_type": "markdown", + "metadata": { + "id": "tLoVob4l0uqX" + }, + "source": [ + "##### Load dataset" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"metric\": \"mean_difference\", \n", - " \"message\": \"Mean difference (mean label value on privileged instances - mean label value on unprivileged instances): -0.0748013090229\", \n", - " \"numPositivesUnprivileged\": 201.0, \n", - " \"numInstancesUnprivileged\": 310.0, \n", - " \"numPositivesPrivileged\": 499.0, \n", - " \"numInstancesPrivileged\": 690.0, \n", - " \"description\": \"Computed as the difference of the rate of favorable outcomes received by the unprivileged group to the privileged group.\", \n", - " \"ideal\": \"The ideal value of this metric is 0.0\"\n", - "}\n" - ] - } - ], - "source": [ - "print(format_json(json_expl.mean_difference()))" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "source": [ + "import os\n", + "import urllib\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)\n", + "\n", + "\n", + "# Download german dataset\n", + "data_source_directory = \"https://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/\"\n", + "destn = os.path.join(LIB_PATH, \"aif360\", \"data\", \"raw\", \"german\")\n", + "files = [\"german.data\", \"german.doc\"]\n", + "\n", + "check_data_or_download(destn, files, data_source_directory)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pXyLozkz1AXQ", + "outputId": "1527abee-dd12-492b-eb1f-fcc551a09f29" + }, + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Adult dataset is available for us\n", + "Some files are missing. Downloading now.\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true, + "id": "lssX4aJy0uqX" + }, + "outputs": [], + "source": [ + "gd = GermanDataset()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9AwYJJX10uqX" + }, + "source": [ + "##### Create metrics" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true, + "id": "SbbDkw8j0uqX" + }, + "outputs": [], + "source": [ + "priv = [{'sex': 1}]\n", + "unpriv = [{'sex': 0}]\n", + "bldm = BinaryLabelDatasetMetric(gd, unprivileged_groups=unpriv, privileged_groups=priv)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d9ilIGpQ0uqX" + }, + "source": [ + "##### Create explainers" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true, + "id": "wDLSltK00uqY" + }, + "outputs": [], + "source": [ + "text_expl = MetricTextExplainer(bldm)\n", + "json_expl = MetricJSONExplainer(bldm)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xqKmK4Q20uqY" + }, + "source": [ + "##### Text explanations" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OF_1QgqF0uqY", + "outputId": "70207a1c-2107-4ce9-a63a-0bb42b5079a0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Number of positive-outcome instances: 700.0\n" + ] + } + ], + "source": [ + "print(text_expl.num_positives())" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"metric\": \"disparate_impact\", \n", - " \"message\": \"Disparate impact (probability of favorable outcome for unprivileged instances / probability of favorable outcome for privileged instances): 0.896567328205\", \n", - " \"numPositivePredictionsUnprivileged\": 201.0, \n", - " \"numUnprivileged\": 310.0, \n", - " \"numPositivePredictionsPrivileged\": 499.0, \n", - " \"numPrivileged\": 690.0, \n", - " \"description\": \"Computed as the ratio of likelihood of favorable outcome for the unprivileged group to that of the privileged group.\", \n", - " \"ideal\": \"The ideal value of this metric is 1.0\"\n", - "}\n" - ] + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0eeYcg-B0uqY", + "outputId": "48e9502a-972f-4d0a-9c94-6f00eef0a4a9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Mean difference (mean label value on unprivileged instances - mean label value on privileged instances): -0.07480130902290782\n" + ] + } + ], + "source": [ + "print(text_expl.mean_difference())" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JgYsTkkC0uqZ", + "outputId": "cca8e89f-ba98-43cc-a849-8661e9c53b60" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Disparate impact (probability of favorable outcome for unprivileged instances / probability of favorable outcome for privileged instances): 0.8965673282047968\n" + ] + } + ], + "source": [ + "print(text_expl.disparate_impact())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E48C_xQA0uqZ" + }, + "source": [ + "##### JSON Explanations" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true, + "id": "sOcjvBtl0uqZ" + }, + "outputs": [], + "source": [ + "def format_json(json_str):\n", + " return json.dumps(json.loads(json_str, object_pairs_hook=OrderedDict), indent=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "M3D3rFq80uqZ", + "outputId": "eb5dbff9-ff26-4960-d49f-933ffa9c916c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "{\n", + " \"metric\": \"Number Of Positives\",\n", + " \"message\": \"Number of positive-outcome instances: 700.0\",\n", + " \"numPositives\": 700.0,\n", + " \"description\": \"Computed as the number of positive instances for the given (privileged or unprivileged) group.\",\n", + " \"ideal\": \"The ideal value of this metric lies in the total number of positive instances made available\"\n", + "}\n" + ] + } + ], + "source": [ + "print(format_json(json_expl.num_positives()))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LDJv2LR80uqa", + "outputId": "e22ff853-dbee-4fa3-c817-199b27f5a219" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "{\n", + " \"metric\": \"Mean Difference\",\n", + " \"message\": \"Mean difference (mean label value on unprivileged instances - mean label value on privileged instances): -0.07480130902290782\",\n", + " \"numPositivesUnprivileged\": 201.0,\n", + " \"numInstancesUnprivileged\": 310.0,\n", + " \"numPositivesPrivileged\": 499.0,\n", + " \"numInstancesPrivileged\": 690.0,\n", + " \"description\": \"Computed as the difference of the rate of favorable outcomes received by the unprivileged group to the privileged group.\",\n", + " \"ideal\": \"The ideal value of this metric is 0.0\"\n", + "}\n" + ] + } + ], + "source": [ + "print(format_json(json_expl.mean_difference()))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2YhmXYW_0uqa", + "outputId": "8db89352-db50-44bc-f99a-cbf3ffd7b909" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "{\n", + " \"metric\": \"Disparate Impact\",\n", + " \"message\": \"Disparate impact (probability of favorable outcome for unprivileged instances / probability of favorable outcome for privileged instances): 0.8965673282047968\",\n", + " \"numPositivePredictionsUnprivileged\": 201.0,\n", + " \"numUnprivileged\": 310.0,\n", + " \"numPositivePredictionsPrivileged\": 499.0,\n", + " \"numPrivileged\": 690.0,\n", + " \"description\": \"Computed as the ratio of rate of favorable outcome for the unprivileged group to that of the privileged group.\",\n", + " \"ideal\": \"The ideal value of this metric is 1.0 A value < 1 implies higher benefit for the privileged group and a value >1 implies a higher benefit for the unprivileged group.\"\n", + "}\n" + ] + } + ], + "source": [ + "print(format_json(json_expl.disparate_impact()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true, + "id": "wmbtgejP0uqa" + }, + "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.11" + }, + "colab": { + "provenance": [] } - ], - "source": [ - "print(format_json(json_expl.disparate_impact()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/examples/demo_lfr.ipynb b/examples/demo_lfr.ipynb index 134a2729..7170cf05 100644 --- a/examples/demo_lfr.ipynb +++ b/examples/demo_lfr.ipynb @@ -1,473 +1,770 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### This notebook demonstrates the use of the learning fair representations algorithm for bias mitigation\n", - "Learning fair representations [1] is a pre-processing technique that finds a latent representation which encodes the data well but obfuscates information about protected attributes. We will see how to use this algorithm for learning representations that encourage individual fairness and apply them on the Adult dataset.\n", - "\n", - "References:\n", - "\n", - "[1] R. Zemel, Y. Wu, K. Swersky, T. Pitassi, and C. Dwork, \"Learning Fair Representations.\" \n", - "International Conference on Machine Learning, 2013." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "# Load all necessary packages\n", - "import sys\n", - "sys.path.append(\"../\")\n", - "from aif360.datasets import BinaryLabelDataset\n", - "from aif360.datasets import AdultDataset\n", - "from aif360.metrics import BinaryLabelDatasetMetric\n", - "from aif360.metrics import ClassificationMetric\n", - "from aif360.metrics.utils import compute_boolean_conditioning_vector\n", - "\n", - "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult\n", - "from aif360.algorithms.preprocessing.lfr import LFR\n", - "\n", - "from sklearn.linear_model import LogisticRegression\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.metrics import accuracy_score\n", - "from sklearn.metrics import classification_report\n", - "\n", - "from IPython.display import Markdown, display\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "from common_utils import compute_metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Load dataset and set options" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the dataset and split into train and test\n", - "dataset_orig = load_preproc_data_adult()\n", - "dataset_orig_train, dataset_orig_test = dataset_orig.split([0.7], shuffle=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Clean up training data" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + }, + "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_lfr.ipynb)\n" + ] + }, { - "data": { - "text/markdown": [ - "#### Training Dataset shape" + "cell_type": "markdown", + "metadata": { + "id": "pSHxIvnmJMlH" + }, + "source": [ + "#### This notebook demonstrates the use of the learning fair representations algorithm for bias mitigation\n", + "Learning fair representations [1] is a pre-processing technique that finds a latent representation which encodes the data well but obfuscates information about protected attributes. We will see how to use this algorithm for learning representations that encourage individual fairness and apply them on the Adult dataset.\n", + "\n", + "References:\n", + "\n", + "[1] R. Zemel, Y. Wu, K. Swersky, T. Pitassi, and C. Dwork, \"Learning Fair Representations.\"\n", + "International Conference on Machine Learning, 2013." + ] + }, + { + "cell_type": "code", + "source": [ + "!pip install aif360" ], - "text/plain": [ - "" + "metadata": { + "id": "rbjwJ83JKYOE", + "outputId": "9bda5dcb-ad33-4763-c650-fa8dc87391a7", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Requirement already satisfied: aif360 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) (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" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "WRq6KHByJMlH" + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Load all necessary packages\n", + "import sys\n", + "sys.path.append(\"../\")\n", + "from aif360.datasets import BinaryLabelDataset\n", + "from aif360.datasets import AdultDataset\n", + "from aif360.metrics import BinaryLabelDatasetMetric\n", + "from aif360.metrics import ClassificationMetric\n", + "from aif360.metrics.utils import compute_boolean_conditioning_vector\n", + "\n", + "from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult\n", + "from aif360.algorithms.preprocessing.lfr import LFR\n", + "\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.metrics import accuracy_score\n", + "from sklearn.metrics import classification_report\n", + "\n", + "from IPython.display import Markdown, display\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "(34189, 18)\n" - ] + "cell_type": "code", + "source": [ + "# Metrics function\n", + "from collections import OrderedDict\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" + ], + "metadata": { + "id": "HHWJ4YOUKepn" + }, + "execution_count": 25, + "outputs": [] }, { - "data": { - "text/markdown": [ - "#### Favorable and unfavorable labels" + "cell_type": "code", + "source": [ + "import os\n", + "import urllib\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)" ], - "text/plain": [ - "" + "metadata": { + "id": "4sOyTMUcKiL8", + "outputId": "9d748ad2-0eab-476f-8fdf-4bf6d68cfa2a", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "execution_count": 26, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Adult dataset is available for us\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UHNPTDPEJMlI" + }, + "source": [ + "#### Load dataset and set options" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "id": "xuQMtYfZJMlI" + }, + "outputs": [], + "source": [ + "# Get the dataset and split into train and test\n", + "dataset_orig = load_preproc_data_adult()\n", + "dataset_orig_train, dataset_orig_test = dataset_orig.split([0.7], shuffle=True)" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0 0.0\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "z08sQ76nJMlI" + }, + "source": [ + "#### Clean up training data" + ] }, { - "data": { - "text/markdown": [ - "#### Protected attribute names" + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 326 + }, + "id": "lQr_A68uJMlI", + "outputId": "accac0d7-7459-4867-ee62-7cc4ba965865" + }, + "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', 'race']\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([1.])] [array([0.]), 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": [ - "['sex', 'race']\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "iPxd_eWiJMlJ" + }, + "source": [ + "#### Metric for original training data" + ] }, { - "data": { - "text/markdown": [ - "#### Privileged and unprivileged protected attribute values" + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "el-vJ8mRJMlJ", + "outputId": "0ff531f0-b57d-4c10-f359-aee5f0342dd5" + }, + "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.190862\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.203005\n" + ] + } ], - "text/plain": [ - "" + "source": [ + "# Metric for the original dataset\n", + "privileged_groups = [{'sex': 1.0}]\n", + "unprivileged_groups = [{'sex': 0.0}]\n", + "\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())\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())\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AdAihiWeJMlJ" + }, + "source": [ + "#### Train with and transform the original training data" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "[array([1.]), array([1.])] [array([0.]), array([0.])]\n" - ] + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "6tTVHlcxJMlJ" + }, + "outputs": [], + "source": [ + "scale_orig = StandardScaler()\n", + "dataset_orig_train.features = scale_orig.fit_transform(dataset_orig_train.features)\n", + "dataset_orig_test.features = scale_orig.transform(dataset_orig_test.features)" + ] }, { - "data": { - "text/markdown": [ - "#### Dataset feature names" + "cell_type": "code", + "execution_count": 31, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8xJrpt6-JMlJ", + "outputId": "1d083ae3-e916-49ff-f9cb-76b5b646bcd8" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "step: 0, loss: 0.8962825492184127, L_x: 2.5714339164470723, L_y: 0.620754999471439, L_z: 0.009192079051133246\n", + "step: 250, loss: 0.8480866071999373, L_x: 2.5685650112390204, L_y: 0.5738304854931037, L_z: 0.00869981029146582\n", + "step: 500, loss: 0.812413520785976, L_x: 2.5559943149989834, L_y: 0.5435687192438329, L_z: 0.006622685021122375\n", + "step: 750, loss: 0.8068090347952472, L_x: 2.5485767929820033, L_y: 0.540429587756876, L_z: 0.005760883870085431\n", + "step: 1000, loss: 0.7697788013653353, L_x: 2.4301546591529353, L_y: 0.5097902430672545, L_z: 0.008486546191393631\n", + "step: 1250, loss: 0.7488916175381501, L_x: 2.319045335882304, L_y: 0.4899897467945588, L_z: 0.013498668577680478\n", + "step: 1500, loss: 0.7292348172986615, L_x: 2.180622957659463, L_y: 0.47458348428043823, L_z: 0.018294518626138442\n", + "step: 1750, loss: 0.6732503970062083, L_x: 1.8022392527041993, L_y: 0.4457481793715224, L_z: 0.023639146182132982\n", + "step: 2000, loss: 0.6551453071296062, L_x: 1.7369379199412447, L_y: 0.44547346510191477, L_z: 0.017989025016783476\n", + "step: 2250, loss: 0.6515877755909989, L_x: 1.729866141423706, L_y: 0.44581105955253014, L_z: 0.016395050948049064\n", + "step: 2500, loss: 0.642317154312171, L_x: 1.7102692235915193, L_y: 0.4432637228700424, L_z: 0.01401325454148834\n", + "step: 2750, loss: 0.6408832286060121, L_x: 1.692429573709087, L_y: 0.4444873357962501, L_z: 0.013576467719426591\n", + "step: 3000, loss: 0.6393149303295383, L_x: 1.6822172127482986, L_y: 0.44394928162497177, L_z: 0.013571963714868329\n", + "step: 3250, loss: 0.6364420807364426, L_x: 1.681350214471769, L_y: 0.44296918237940514, L_z: 0.01266893845493026\n", + "step: 3500, loss: 0.6376425149993452, L_x: 1.6755513830998394, L_y: 0.4442870991810238, L_z: 0.012900138754168733\n", + "step: 3750, loss: 0.6355475233628246, L_x: 1.6793840623156662, L_y: 0.44315958605303135, L_z: 0.012224765539113263\n", + "step: 4000, loss: 0.6432096538091823, L_x: 1.6669782170813154, L_y: 0.4465226779831983, L_z: 0.014994577058926217\n", + "step: 4250, loss: 0.6354345060723801, L_x: 1.6787641405659137, L_y: 0.4432519397770607, L_z: 0.012153076119363986\n", + "step: 4500, loss: 0.6379459397795982, L_x: 1.6680215898648223, L_y: 0.4444484635599675, L_z: 0.013347658616574281\n", + "step: 4750, loss: 0.6354297833077306, L_x: 1.6771828167354075, L_y: 0.4433828100247568, L_z: 0.012164345804716512\n", + "step: 5000, loss: 0.6344102371530024, L_x: 1.667823494652633, L_y: 0.44373122467523646, L_z: 0.011948331506251294\n" + ] + } ], - "text/plain": [ - "" + "source": [ + "# Input recontruction quality - Ax\n", + "# Fairness constraint - Az\n", + "# Output prediction error - Ay\n", + "\n", + "privileged_groups = [{'sex': 1}]\n", + "unprivileged_groups = [{'sex': 0}]\n", + "\n", + "TR = LFR(unprivileged_groups=unprivileged_groups,\n", + " privileged_groups=privileged_groups,\n", + " k=10, Ax=0.1, Ay=1.0, Az=2.0,\n", + " verbose=1\n", + " )\n", + "TR = TR.fit(dataset_orig_train, maxiter=5000, maxfun=5000)" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "['race', 'sex', 'Age (decade)=10', 'Age (decade)=20', 'Age (decade)=30', 'Age (decade)=40', 'Age (decade)=50', 'Age (decade)=60', 'Age (decade)=>=70', 'Education Years=6', 'Education Years=7', 'Education Years=8', 'Education Years=9', 'Education Years=10', 'Education Years=11', 'Education Years=12', 'Education Years=<6', 'Education Years=>12']\n" - ] - } - ], - "source": [ - "# 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": 4, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 32, + "metadata": { + "id": "pzDX-rNMJMlJ" + }, + "outputs": [], + "source": [ + "# Transform training data and align features\n", + "dataset_transf_train = TR.transform(dataset_orig_train)\n", + "dataset_transf_test = TR.transform(dataset_orig_test)" + ] + }, { - "data": { - "text/markdown": [ - "#### Original training dataset" + "cell_type": "code", + "execution_count": 33, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dlc9Q8C1JMlJ", + "outputId": "92a8abce-1ad4-4961-e8e8-3d0ae80f70ac" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0.0 0.81 0.95 0.87 11142\n", + " 1.0 0.62 0.28 0.39 3511\n", + "\n", + " accuracy 0.79 14653\n", + " macro avg 0.72 0.61 0.63 14653\n", + "weighted avg 0.76 0.79 0.76 14653\n", + "\n" + ] + } ], - "text/plain": [ - "" + "source": [ + "print(classification_report(dataset_orig_test.labels, dataset_transf_test.labels))" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Difference in mean outcomes between unprivileged and privileged groups = -0.193139\n" - ] + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "kqDqTcxQJMlJ", + "outputId": "7a7e747b-eca0-43d9-84f5-8beeee2588e2" + }, + "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.062725\n" + ] + }, + { + "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.057548\n" + ] + } + ], + "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())\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())\n" + ] }, { - "data": { - "text/markdown": [ - "#### Original test dataset" + "cell_type": "code", + "execution_count": 36, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 93 + }, + "id": "cRKBWIcFJMlJ", + "outputId": "4218db37-dfe5-420a-ca08-2913294736d1" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Predictions from transformed testing data" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/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" + ] + } ], - "text/plain": [ - "" + "source": [ + "display(Markdown(\"#### Predictions from transformed testing data\"))\n", + "bal_acc_arr_transf = []\n", + "disp_imp_arr_transf = []\n", + "\n", + "class_thresh_arr = np.linspace(0.01, 0.99, 100)\n", + "\n", + "dataset_transf_test_new = dataset_orig_test.copy(deepcopy=True)\n", + "dataset_transf_test_new.scores = dataset_transf_test.scores\n", + "\n", + "\n", + "for thresh in class_thresh_arr:\n", + "\n", + " fav_inds = dataset_transf_test_new.scores > thresh\n", + " dataset_transf_test_new.labels[fav_inds] = 1.0\n", + " dataset_transf_test_new.labels[~fav_inds] = 0.0\n", + "\n", + " metric_test_aft = compute_metrics(dataset_orig_test, dataset_transf_test_new,\n", + " unprivileged_groups, privileged_groups,\n", + " disp = False)\n", + "\n", + " bal_acc_arr_transf.append(metric_test_aft[\"Balanced accuracy\"])\n", + " disp_imp_arr_transf.append(metric_test_aft[\"Disparate impact\"])" ] - }, - "metadata": {}, - "output_type": "display_data" }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Difference in mean outcomes between unprivileged and privileged groups = -0.197697\n" - ] - } - ], - "source": [ - "# Metric for the original dataset\n", - "privileged_groups = [{'sex': 1.0}]\n", - "unprivileged_groups = [{'sex': 0.0}]\n", - "\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())\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())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Train with and transform the original training data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "scale_orig = StandardScaler()\n", - "dataset_orig_train.features = scale_orig.fit_transform(dataset_orig_train.features)\n", - "dataset_orig_test.features = scale_orig.transform(dataset_orig_test.features)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ + "cell_type": "code", + "execution_count": 37, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 630 + }, + "id": "V9_kLfaeJMlK", + "outputId": "5233f9a8-68e8-48d1-ed0d-c8b526ceba12" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6sAAAJlCAYAAAA8d2T1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADdP0lEQVR4nOzdd3gU1f4G8He2pPcECNJC6CAdIk0QQUDsgoINsWDven8KV0Wx4rV3vShg4QqKWEFQadIR6b2lUEJ6r1t+f5xMdtOzs2Vmd9/P8+yzm93JzIkl2Xe/53yPZLVarSAiIiIiIiLSEJ3aAyAiIiIiIiKqjWGViIiIiIiINIdhlYiIiIiIiDSHYZWIiIiIiIg0h2GViIiIiIiINIdhlYiIiIiIiDSHYZWIiIiIiIg0h2GViIiIiIiINMeg9gB8nclkws6dO9GqVSvodPxsgIiIiIjIX1ksFpw7dw79+/eHwcAo1hT+E3KznTt3IikpSe1hEBERERGRRmzbtg2DBw9Wexiax7DqZq1atQIg/oNs3bq1yqMhIiIiIiK1nD17FklJSdUZgRrHsOpm8tTf1q1bo23btiqPhoiIiIiI1Mblgc3Df0pERERERESkOQyrREREREREpDkMq0RERERERKQ5DKtERERERESkOQyrREREREREpDkMq0RERERERKQ5DKtERERERESkOQyrREREREREpDkMq0RERERERKQ5DKtERERERESkOQyrREREREREpDkMq0RERERERKQ5DKtERERERESkOQyrREREREREpDkMq0RERERERKQ5DKtEREREREQa9dVXX+Huu+/GoEGDEBgYCEmSsGDBAofPY7FY8N5776F3794IDg5GixYtcMMNN+DEiROuH7SLMKwSERERERFp1NNPP41PP/0UKSkpaN26teLz3H333XjooYdgtVrx0EMPYcKECfj+++8xePBgHD161IUjdh2GVSIiIiIiIo2aN28ekpOTkZmZiXvuuUfROdasWYN58+Zh5MiR+OeffzB37lx8+eWX+OGHH5CTk4MHHnjAxaN2DYPaAyAiIiIiIqL6jR071ulz/Pe//wUAvPDCCwgICKh+/tJLL8VFF12EVatWITU1Fe3bt3f6Wq7EyioREREREZEPW7t2LUJDQzF8+PA6r40fPx4AsG7dOk8Pq0msrHqIyWRCZWWl2sMgcqlt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VStw+PBhYejQoYKbm5ugUqmE8PBw4dtvv9Xbrrp/+MXFxUJcXJzQtm1bwd7eXvD19RWefvppISsrqx7OgCylLveONqmo7uHv719/J0P1zhTvPfdistp4mOr+iY+PF0JDQwUnJyfB2dlZ6NOnj7B582YzR0+WZor75/fffxcef/xxoXnz5oKtra3g4uIihIWFCUuXLhXKy8vr4Syovmnvh6oekydPlratLllVq9XCxx9/LAQHBwsODg5C06ZNhbFjxwrnz5+vv5MhQRAEQSEIgmDilsVEREREREREdcIBloiIiIiIiEh2mKwSERERERGR7DBZJSIiIiIiItlhskpERERERESyw2SViIiIiIiIZIfJKhEREREREckOk1UiIiIiIiKSHSarREREREREJDtMVomI/pGeno558+ZhwIABaNGiBRwdHeHo6IiWLVsiMjIS77//PtLT03X26devHxQKhfS4dOmSZYKvgylTpuicw969e/W2OX/+PCZPngx/f384ODhI23p4eAAAVq9erVNGXFxcvZ5DXQQEBOjEbg0qxmvso7IyAgICLHcyZmDJv8u4uDidY69evdqo/Q35eyQiaixsLR0AEZGllZSU4LXXXsNnn32G8vJyvfVXrlzBlStXsHPnTrz//vu4deuWBaK0nOvXr6Nnz57Izs62dCgGu3TpEtq0aSO9joiI4Id+IiIiK8NklYgateLiYgwePBgHDx7UWe7q6orQ0FC4uLjg+vXrOHHiBIqLi6HRaCwUqfmEhYWhoKBAeu3l5aWzfvPmzTqJqqenJ/r06QN7e3s4OzsDEGsno6OjpW2CgoLMHLXpREVF4fr165YOwygVr7VWcnIy0tLSpNedOnWyqt8DERHRvZisElGj9sILL+gkqgqFAm+99RZmz54NR0dHaXlRURG++eYbfPTRRxaI0ryef/55PP/881Wuv3btms7rhQsX4plnntFZ1q9fP/Tr188c4ZndZ599ZukQjLZx40a9ZVOmTMGaNWuk12PGjLGq5thERET3Yp9VImq0/vzzT8THx+ssmzdvHuLi4nQSVQBQqVR46qmncOTIEaOOsXTpUkyePBndu3dHy5Yt4ezsDAcHB/j4+CAiIgKLFi1Cfn5+pfumpKRgxowZCA4OhqurK2xtbdG0aVN06NABo0aNwjvvvIPz58/r7JOdnY24uDj06NEDTZo0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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.yaxis.set_tick_params(labelsize=14)\n", + "ax2.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "c1rFal8YJMlK" + }, + "source": [ + "abs(1-disparate impact) must be small (close to 0) for classifier predictions to be fair." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 128 + }, + "id": "5qvd6Oo6JMlK", + "outputId": "b1ee8132-1e15-4431-9861-fee0ef882872" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/markdown": "#### Individual fairness metrics" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Consistency of labels in transformed training dataset= 1.000000\n", + "Consistency of labels in original training dataset= 0.714183\n", + "Consistency of labels in transformed test dataset= 1.000000\n", + "Consistency of labels in original test dataset= 0.752337\n" + ] + } + ], + "source": [ + "display(Markdown(\"#### Individual fairness metrics\"))\n", + "print(\"Consistency of labels in transformed training dataset= %f\" %metric_transf_train.consistency())\n", + "print(\"Consistency of labels in original training dataset= %f\" %metric_orig_train.consistency())\n", + "print(\"Consistency of labels in transformed test dataset= %f\" %metric_transf_test.consistency())\n", + "print(\"Consistency of labels in original test dataset= %f\" %metric_orig_test.consistency())" + ] + }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "step: 0, loss: 1.0939550595829053, L_x: 2.531834521858599, L_y: 0.8200826015334493, L_z: 0.010344502931797964\n", - "step: 250, loss: 0.9162820270109503, L_x: 2.529109218043187, L_y: 0.6432961063010657, L_z: 0.010037499452782905\n", - "step: 500, loss: 0.8207071510514392, L_x: 2.5204911168067197, L_y: 0.5500397646035967, L_z: 0.00930913738358528\n", - "step: 750, loss: 0.8102771268166408, L_x: 2.511873834704061, L_y: 0.5427956868742799, L_z: 0.008147028235977415\n", - "step: 1000, loss: 0.7996570283329768, L_x: 2.480828451323288, L_y: 0.5399446552800813, L_z: 0.00581476396028337\n", - "step: 1250, loss: 0.7844631169970814, L_x: 2.4242508289183613, L_y: 0.5304307199052671, L_z: 0.005803657099989009\n", - "step: 1500, loss: 0.7653305722023572, L_x: 2.3297047767431986, L_y: 0.5176248867874912, L_z: 0.007367603870273078\n", - "step: 1750, loss: 0.7154304631442515, L_x: 2.085955877234543, L_y: 0.48081670080967953, L_z: 0.013009087305558827\n", - "step: 2000, loss: 0.6906420918886886, L_x: 1.896344106091722, L_y: 0.4646651544564373, L_z: 0.018171263411539594\n", - "step: 2250, loss: 0.6783680937630076, L_x: 1.7895665853948028, L_y: 0.4587714378849466, L_z: 0.020319998669290275\n", - "step: 2500, loss: 0.6725576747654705, L_x: 1.742061633693402, L_y: 0.4577729094336143, L_z: 0.020289300981257967\n", - "step: 2750, loss: 0.6694103860159343, L_x: 1.7548885984309939, L_y: 0.4545867175857845, L_z: 0.019667404293525217\n", - "step: 3000, loss: 0.6658207636894926, L_x: 1.7515234617350093, L_y: 0.4539151313299769, L_z: 0.018376643093007367\n", - "step: 3250, loss: 0.6481415219979564, L_x: 1.7252276686316934, L_y: 0.4491717858033674, L_z: 0.013223484665709846\n", - "step: 3500, loss: 0.645366243737316, L_x: 1.7196207136719521, L_y: 0.4482843307446003, L_z: 0.012559920812760247\n", - "step: 3750, loss: 0.6425278186287126, L_x: 1.7117758355776211, L_y: 0.4473063883366716, L_z: 0.012021923367139413\n", - "step: 4000, loss: 0.6419409673076768, L_x: 1.7092609385556714, L_y: 0.44744616781598634, L_z: 0.011784352818061686\n", - "step: 4250, loss: 0.6377801462539607, L_x: 1.6917081956472533, L_y: 0.4496335370425122, L_z: 0.009487894823361622\n" - ] + "cell_type": "code", + "execution_count": 39, + "metadata": { + "id": "xO0pRb_OJMlL" + }, + "outputs": [], + "source": [ + "def check_algorithm_success():\n", + " \"\"\"Transformed dataset consistency should be greater than original dataset.\"\"\"\n", + " assert metric_transf_test.consistency() > metric_orig_test.consistency(), \"Transformed dataset consistency should be greater than original dataset.\"\n", + "\n", + "check_algorithm_success()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "w5rLKCqTJMlL" + }, + "outputs": [], + "source": [] + } + ], + "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.10" + }, + "colab": { + "provenance": [] } - ], - "source": [ - "# Input recontruction quality - Ax\n", - "# Fairness constraint - Az\n", - "# Output prediction error - Ay\n", - "\n", - "privileged_groups = [{'sex': 1}]\n", - "unprivileged_groups = [{'sex': 0}]\n", - " \n", - "TR = LFR(unprivileged_groups=unprivileged_groups,\n", - " privileged_groups=privileged_groups,\n", - " k=10, Ax=0.1, Ay=1.0, Az=2.0,\n", - " verbose=1\n", - " )\n", - "TR = TR.fit(dataset_orig_train, maxiter=5000, maxfun=5000)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Transform training data and align features\n", - "dataset_transf_train = TR.transform(dataset_orig_train)\n", - "dataset_transf_test = TR.transform(dataset_orig_test)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(classification_report(dataset_orig_test.labels, dataset_transf_test.labels))" - ] - }, - { - "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())\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())\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from common_utils import compute_metrics\n", - "\n", - "display(Markdown(\"#### Predictions from transformed testing data\"))\n", - "bal_acc_arr_transf = []\n", - "disp_imp_arr_transf = []\n", - "\n", - "class_thresh_arr = np.linspace(0.01, 0.99, 100)\n", - "\n", - "dataset_transf_test_new = dataset_orig_test.copy(deepcopy=True)\n", - "dataset_transf_test_new.scores = dataset_transf_test.scores\n", - "\n", - "\n", - "for thresh in class_thresh_arr:\n", - " \n", - " fav_inds = dataset_transf_test_new.scores > thresh\n", - " dataset_transf_test_new.labels[fav_inds] = 1.0\n", - " dataset_transf_test_new.labels[~fav_inds] = 0.0\n", - " \n", - " metric_test_aft = compute_metrics(dataset_orig_test, dataset_transf_test_new, \n", - " unprivileged_groups, privileged_groups,\n", - " disp = False)\n", - "\n", - " bal_acc_arr_transf.append(metric_test_aft[\"Balanced accuracy\"])\n", - " disp_imp_arr_transf.append(metric_test_aft[\"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.yaxis.set_tick_params(labelsize=14)\n", - "ax2.grid(True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "abs(1-disparate impact) must be small (close to 0) for classifier predictions to be fair." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display(Markdown(\"#### Individual fairness metrics\"))\n", - "print(\"Consistency of labels in transformed training dataset= %f\" %metric_transf_train.consistency())\n", - "print(\"Consistency of labels in original training dataset= %f\" %metric_orig_train.consistency())\n", - "print(\"Consistency of labels in transformed test dataset= %f\" %metric_transf_test.consistency())\n", - "print(\"Consistency of labels in original test dataset= %f\" %metric_orig_test.consistency())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def check_algorithm_success():\n", - " \"\"\"Transformed dataset consistency should be greater than original dataset.\"\"\"\n", - " assert metric_transf_test.consistency() > metric_orig_test.consistency(), \"Transformed dataset consistency should be greater than original dataset.\"\n", - "\n", - "check_algorithm_success() " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.10" - } - }, - "nbformat": 4, - "nbformat_minor": 2 + "nbformat": 4, + "nbformat_minor": 0 }