%matplotlib inline
import warnings
warnings.filterwarnings("ignore")
import sys
sys.path.append("../")
from aif360.algorithms.inprocessing import GerryFairClassifier
from aif360.algorithms.inprocessing.gerryfair.clean import array_to_tuple
from aif360.algorithms.inprocessing.gerryfair.auditor import Auditor
from aif360.algorithms.preprocessing.optim_preproc_helpers.data_preproc_functions import load_preproc_data_adult
from sklearn import svm
from sklearn import tree
from sklearn.kernel_ridge import KernelRidge
from sklearn import linear_model
from aif360.metrics import BinaryLabelDatasetMetric
from IPython.display import Image
import pickle
import matplotlib.pyplot as plt
# load data set
data_set = load_preproc_data_adult(sub_samp=1000, balance=True)
max_iterations = 500
instantiate, fit, and predict
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.
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, 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).
C = 100
print_flag = True
gamma = .005
fair_model = GerryFairClassifier(C=C, printflag=print_flag, gamma=gamma, fairness_def='FP',
max_iters=max_iterations, heatmapflag=False)
# fit method
fair_model.fit(data_set, early_termination=True)
# predict method. If threshold in (0, 1) produces binary predictions
dataset_yhat = fair_model.predict(data_set, threshold=False)
iteration: 1, error: 0.263, fairness violation: 0.028780000000000007, violated group size: 0.217 iteration: 2, error: 0.3815, fairness violation: 0.014390000000000003, violated group size: 0.217 iteration: 3, error: 0.42099999999999993, fairness violation: 0.009593333333333339, violated group size: 0.283 iteration: 4, error: 0.44075, fairness violation: 0.007195000000000002, violated group size: 0.217 iteration: 5, error: 0.45260000000000006, fairness violation: 0.005756000000000001, violated group size: 0.217 iteration: 6, error: 0.4605000000000001, fairness violation: 0.004796666666666668, violated group size: 0.283 iteration: 7, error: 0.4661428571428572, fairness violation: 0.004111428571428572, violated group size: 0.217 iteration: 8, error: 0.470375, fairness violation: 0.0035975000000000017, violated group size: 0.217 iteration: 9, error: 0.4691111111111112, fairness violation: 0.0033906666666666677, violated group size: 0.283 iteration: 10, error: 0.4681, fairness violation: 0.003225200000000001, violated group size: 0.283 iteration: 11, error: 0.4672727272727271, fairness violation: 0.0030898181818181836, violated group size: 0.283 iteration: 12, error: 0.4665833333333333, fairness violation: 0.0029769999999999996, violated group size: 0.217 iteration: 13, error: 0.466, fairness violation: 0.0028815384615384627, violated group size: 0.283 iteration: 14, error: 0.4655000000000001, fairness violation: 0.0027997142857142865, violated group size: 0.217 iteration: 15, error: 0.46506666666666674, fairness violation: 0.002728800000000001, violated group size: 0.217 iteration: 16, error: 0.4646875, fairness violation: 0.0026667500000000007, violated group size: 0.217 iteration: 17, error: 0.4643529411764707, fairness violation: 0.002612000000000001, violated group size: 0.283 iteration: 18, error: 0.46405555555555567, fairness violation: 0.002563333333333334, violated group size: 0.217 iteration: 19, error: 0.4637894736842106, fairness violation: 0.0025197894736842096, violated group size: 0.217 iteration: 20, error: 0.46354999999999996, fairness violation: 0.0024806000000000008, violated group size: 0.283 iteration: 21, error: 0.4633333333333334, fairness violation: 0.0024451428571428584, violated group size: 0.217 iteration: 22, error: 0.4631363636363638, fairness violation: 0.0024129090909090914, violated group size: 0.283 iteration: 23, error: 0.46295652173913054, fairness violation: 0.002383478260869566, violated group size: 0.217 iteration: 24, error: 0.4627916666666667, fairness violation: 0.002356500000000001, violated group size: 0.283 iteration: 25, error: 0.4626400000000001, fairness violation: 0.0023316800000000018, violated group size: 0.283 iteration: 26, error: 0.4625000000000001, fairness violation: 0.0023087692307692314, violated group size: 0.217 iteration: 27, error: 0.4623703703703705, fairness violation: 0.0022875555555555557, violated group size: 0.217 iteration: 28, error: 0.46224999999999994, fairness violation: 0.0022678571428571426, violated group size: 0.217 iteration: 29, error: 0.46213793103448264, fairness violation: 0.0022495172413793106, violated group size: 0.217 iteration: 30, error: 0.46203333333333335, fairness violation: 0.0022324000000000003, violated group size: 0.217 iteration: 31, error: 0.46193548387096783, fairness violation: 0.0022163870967741935, violated group size: 0.217 iteration: 32, error: 0.46184375, fairness violation: 0.0022013749999999993, violated group size: 0.217 iteration: 33, error: 0.459969696969697, fairness violation: 0.0023319393939393944, violated group size: 0.283 iteration: 34, error: 0.4582058823529412, fairness violation: 0.002454823529411765, violated group size: 0.217 iteration: 35, error: 0.45654285714285714, fairness violation: 0.0025706857142857144, violated group size: 0.217 iteration: 36, error: 0.4549722222222221, fairness violation: 0.0026801111111111114, violated group size: 0.283 iteration: 37, error: 0.4534864864864866, fairness violation: 0.0027836216216216214, violated group size: 0.283 iteration: 38, error: 0.45207894736842097, fairness violation: 0.0028816842105263162, violated group size: 0.283 iteration: 39, error: 0.4507435897435898, fairness violation: 0.0029747179487179492, violated group size: 0.217 iteration: 40, error: 0.44947499999999996, fairness violation: 0.0030631000000000005, violated group size: 0.217 iteration: 41, error: 0.44826829268292684, fairness violation: 0.0031471707317073175, violated group size: 0.283 iteration: 42, error: 0.4471190476190476, fairness violation: 0.0032272380952380955, violated group size: 0.217 iteration: 43, error: 0.44602325581395347, fairness violation: 0.0033035813953488386, violated group size: 0.283 iteration: 44, error: 0.44497727272727267, fairness violation: 0.0033764545454545453, violated group size: 0.283 iteration: 45, error: 0.4439777777777778, fairness violation: 0.003446088888888888, violated group size: 0.217 iteration: 46, error: 0.44302173913043474, fairness violation: 0.0035126956521739122, violated group size: 0.217 iteration: 47, error: 0.44210638297872346, fairness violation: 0.0035764680851063826, violated group size: 0.217 iteration: 48, error: 0.4412291666666666, fairness violation: 0.003637583333333332, violated group size: 0.217 iteration: 49, error: 0.4403877551020407, fairness violation: 0.0036962040816326523, violated group size: 0.217 iteration: 50, error: 0.4395600000000001, fairness violation: 0.0037524800000000003, violated group size: 0.217 iteration: 51, error: 0.43876470588235295, fairness violation: 0.0038065490196078425, violated group size: 0.217 iteration: 52, error: 0.438, fairness violation: 0.003858538461538461, violated group size: 0.283 iteration: 53, error: 0.4372641509433963, fairness violation: 0.003908566037735848, violated group size: 0.217 iteration: 54, error: 0.4365555555555556, fairness violation: 0.003956740740740741, violated group size: 0.283 iteration: 55, error: 0.4358181818181819, fairness violation: 0.004003163636363636, violated group size: 0.217 iteration: 56, error: 0.4351071428571429, fairness violation: 0.004047928571428571, violated group size: 0.217 iteration: 57, error: 0.4344736842105262, fairness violation: 0.004091122807017543, violated group size: 0.217 iteration: 58, error: 0.43381034482758624, fairness violation: 0.004132827586206895, violated group size: 0.217 iteration: 59, error: 0.4331694915254237, fairness violation: 0.0041731186440677965, violated group size: 0.283 iteration: 60, error: 0.43254999999999993, fairness violation: 0.004212066666666666, violated group size: 0.217 iteration: 61, error: 0.4319508196721312, fairness violation: 0.004249737704918031, violated group size: 0.217 iteration: 62, error: 0.4313709677419356, fairness violation: 0.004286193548387096, violated group size: 0.217 iteration: 63, error: 0.43080952380952386, fairness violation: 0.004321492063492062, violated group size: 0.283 iteration: 64, error: 0.430265625, fairness violation: 0.004355687499999999, violated group size: 0.283 iteration: 65, error: 0.4297384615384615, fairness violation: 0.004388830769230769, violated group size: 0.283 iteration: 66, error: 0.42922727272727274, fairness violation: 0.004420969696969697, violated group size: 0.217 iteration: 67, error: 0.42873134328358203, fairness violation: 0.004452149253731343, violated group size: 0.217 iteration: 68, error: 0.42824999999999996, fairness violation: 0.0044824117647058815, violated group size: 0.283 iteration: 69, error: 0.42778260869565227, fairness violation: 0.004511797101449274, violated group size: 0.217 iteration: 70, error: 0.42732857142857145, fairness violation: 0.004540342857142856, violated group size: 0.283 iteration: 71, error: 0.42688732394366197, fairness violation: 0.004568084507042252, violated group size: 0.217 iteration: 72, error: 0.4264583333333332, fairness violation: 0.004595055555555555, violated group size: 0.283 iteration: 73, error: 0.42604109589041106, fairness violation: 0.004621287671232876, violated group size: 0.217 iteration: 74, error: 0.4256351351351351, fairness violation: 0.0046468108108108095, violated group size: 0.283 iteration: 75, error: 0.42524, fairness violation: 0.004671653333333331, violated group size: 0.217 iteration: 76, error: 0.4248552631578947, fairness violation: 0.004695842105263155, violated group size: 0.217 iteration: 77, error: 0.42448051948051946, fairness violation: 0.004719402597402596, violated group size: 0.217 iteration: 78, error: 0.4239871794871795, fairness violation: 0.00475905128205128, violated group size: 0.217 iteration: 79, error: 0.42363291139240505, fairness violation: 0.004781215189873418, violated group size: 0.283 iteration: 80, error: 0.42328750000000015, fairness violation: 0.004802824999999999, violated group size: 0.283 iteration: 81, error: 0.4229506172839506, fairness violation: 0.004823901234567901, violated group size: 0.283 iteration: 82, error: 0.4226219512195123, fairness violation: 0.004844463414634145, violated group size: 0.217 iteration: 83, error: 0.4221807228915662, fairness violation: 0.004880216867469879, violated group size: 0.217 iteration: 84, error: 0.42175, fairness violation: 0.004915119047619047, violated group size: 0.217 iteration: 85, error: 0.4214470588235294, fairness violation: 0.004933882352941174, violated group size: 0.217 iteration: 86, error: 0.4210348837209302, fairness violation: 0.004967348837209301, violated group size: 0.217 iteration: 87, error: 0.420632183908046, fairness violation: 0.005000045977011494, violated group size: 0.283 iteration: 88, error: 0.42035227272727277, fairness violation: 0.0050172045454545434, violated group size: 0.217 iteration: 89, error: 0.4200786516853933, fairness violation: 0.005033977528089887, violated group size: 0.217 iteration: 90, error: 0.4198111111111112, fairness violation: 0.005050377777777776, violated group size: 0.283 iteration: 91, error: 0.4195824175824176, fairness violation: 0.0050664175824175805, violated group size: 0.217 iteration: 92, error: 0.4193695652173913, fairness violation: 0.005082108695652173, violated group size: 0.217 iteration: 93, error: 0.41916129032258065, fairness violation: 0.005097462365591397, violated group size: 0.217 iteration: 94, error: 0.41895744680851066, fairness violation: 0.005112489361702126, violated group size: 0.217 iteration: 95, error: 0.41875789473684216, fairness violation: 0.005127199999999998, violated group size: 0.217 iteration: 96, error: 0.41856250000000006, fairness violation: 0.005141604166666665, violated group size: 0.283 iteration: 97, error: 0.418979381443299, fairness violation: 0.005106494845360823, violated group size: 0.217 iteration: 98, error: 0.41938775510204085, fairness violation: 0.005072102040816325, violated group size: 0.217 iteration: 99, error: 0.4197878787878788, fairness violation: 0.0050384040404040376, violated group size: 0.217 iteration: 100, error: 0.42018000000000005, fairness violation: 0.0050053799999999985, violated group size: 0.217 iteration: 101, error: 0.42056435643564366, fairness violation: 0.004973009900990098, violated group size: 0.217 iteration: 102, error: 0.42094117647058826, fairness violation: 0.00494127450980392, violated group size: 0.217 iteration: 103, error: 0.4213106796116506, fairness violation: 0.004910155339805824, violated group size: 0.217 iteration: 104, error: 0.4216730769230769, fairness violation: 0.004879634615384614, violated group size: 0.217 iteration: 105, error: 0.4220285714285715, fairness violation: 0.004849695238095237, violated group size: 0.217 iteration: 106, error: 0.4223773584905662, fairness violation: 0.004820320754716981, violated group size: 0.283 iteration: 107, error: 0.42271962616822434, fairness violation: 0.004791495327102803, violated group size: 0.217 iteration: 108, error: 0.4230555555555556, fairness violation: 0.0047632037037037035, violated group size: 0.217 iteration: 109, error: 0.4233853211009175, fairness violation: 0.00473543119266055, violated group size: 0.217 iteration: 110, error: 0.4237090909090908, fairness violation: 0.004708163636363636, violated group size: 0.217 iteration: 111, error: 0.424027027027027, fairness violation: 0.004681387387387387, violated group size: 0.283 iteration: 112, error: 0.42433928571428586, fairness violation: 0.004655089285714286, violated group size: 0.283 iteration: 113, error: 0.4241238938053097, fairness violation: 0.004671504424778761, violated group size: 0.217 iteration: 114, error: 0.42442982456140343, fairness violation: 0.004645754385964912, violated group size: 0.283 iteration: 115, error: 0.42473043478260875, fairness violation: 0.0046204521739130425, violated group size: 0.283 iteration: 116, error: 0.42502586206896553, fairness violation: 0.0045955862068965524, violated group size: 0.283 iteration: 117, error: 0.42481196581196584, fairness violation: 0.004611948717948717, violated group size: 0.217 iteration: 118, error: 0.4251016949152542, fairness violation: 0.004587576271186439, violated group size: 0.217 iteration: 119, error: 0.42489075630252104, fairness violation: 0.004603731092436974, violated group size: 0.217 iteration: 120, error: 0.4251750000000001, fairness violation: 0.0045798333333333325, violated group size: 0.217 iteration: 121, error: 0.4249669421487604, fairness violation: 0.004595785123966942, violated group size: 0.283 iteration: 122, error: 0.4247622950819671, fairness violation: 0.0046114754098360656, violated group size: 0.217 iteration: 123, error: 0.42456097560975614, fairness violation: 0.00462691056910569, violated group size: 0.217 iteration: 124, error: 0.42436290322580644, fairness violation: 0.004642096774193548, violated group size: 0.217 iteration: 125, error: 0.4241680000000001, fairness violation: 0.00465704, violated group size: 0.217 iteration: 126, error: 0.4239761904761905, fairness violation: 0.004671746031746031, violated group size: 0.217 iteration: 127, error: 0.42425196850393704, fairness violation: 0.004648629921259842, violated group size: 0.217 iteration: 128, error: 0.4240625, fairness violation: 0.004663171874999999, violated group size: 0.217 iteration: 129, error: 0.4238759689922481, fairness violation: 0.004677488372093024, violated group size: 0.283 iteration: 130, error: 0.42369230769230776, fairness violation: 0.004691584615384614, violated group size: 0.217 iteration: 131, error: 0.42351145038167937, fairness violation: 0.004705465648854962, violated group size: 0.217 iteration: 132, error: 0.4233333333333333, fairness violation: 0.004719136363636364, violated group size: 0.283 iteration: 133, error: 0.423157894736842, fairness violation: 0.0047326015037594, violated group size: 0.217 iteration: 134, error: 0.4229850746268656, fairness violation: 0.004745865671641791, violated group size: 0.217 iteration: 135, error: 0.42281481481481475, fairness violation: 0.004758933333333335, violated group size: 0.283 iteration: 136, error: 0.4226470588235294, fairness violation: 0.004771808823529411, violated group size: 0.217 iteration: 137, error: 0.42248175182481745, fairness violation: 0.004784496350364964, violated group size: 0.283 iteration: 138, error: 0.42231884057971014, fairness violation: 0.004797000000000002, violated group size: 0.283 iteration: 139, error: 0.42215827338129497, fairness violation: 0.004809323741007196, violated group size: 0.283 iteration: 140, error: 0.42200000000000004, fairness violation: 0.004821471428571429, violated group size: 0.217 iteration: 141, error: 0.4218439716312057, fairness violation: 0.0048334468085106394, violated group size: 0.217 iteration: 142, error: 0.42169014084507045, fairness violation: 0.004845253521126761, violated group size: 0.283 iteration: 143, error: 0.4215384615384616, fairness violation: 0.004856895104895106, violated group size: 0.283 iteration: 144, error: 0.4213888888888888, fairness violation: 0.004868375, violated group size: 0.217 iteration: 145, error: 0.42124137931034483, fairness violation: 0.004879696551724138, violated group size: 0.217 iteration: 146, error: 0.4210958904109589, fairness violation: 0.00489086301369863, violated group size: 0.217 iteration: 147, error: 0.4209523809523809, fairness violation: 0.004901877551020409, violated group size: 0.217 iteration: 148, error: 0.42081081081081084, fairness violation: 0.004912743243243244, violated group size: 0.217 iteration: 149, error: 0.42067114093959734, fairness violation: 0.004923463087248323, violated group size: 0.283 iteration: 150, error: 0.4205333333333334, fairness violation: 0.004934040000000001, violated group size: 0.217 iteration: 151, error: 0.4203973509933776, fairness violation: 0.004944476821192053, violated group size: 0.217 iteration: 152, error: 0.4202631578947368, fairness violation: 0.0049547763157894754, violated group size: 0.283 iteration: 153, error: 0.4201307189542483, fairness violation: 0.00496494117647059, violated group size: 0.283 iteration: 154, error: 0.42, fairness violation: 0.004974974025974027, violated group size: 0.283 iteration: 155, error: 0.4198709677419355, fairness violation: 0.0049848774193548395, violated group size: 0.217 iteration: 156, error: 0.4197435897435898, fairness violation: 0.004994653846153847, violated group size: 0.217 iteration: 157, error: 0.4196178343949045, fairness violation: 0.0050043057324840766, violated group size: 0.217 iteration: 158, error: 0.4194936708860761, fairness violation: 0.005013835443037975, violated group size: 0.217 iteration: 159, error: 0.41937106918239, fairness violation: 0.005023245283018869, violated group size: 0.283 iteration: 160, error: 0.41925000000000007, fairness violation: 0.0050325375, violated group size: 0.217 iteration: 161, error: 0.4191304347826087, fairness violation: 0.005041714285714285, violated group size: 0.217 iteration: 162, error: 0.41901234567901235, fairness violation: 0.005050777777777778, violated group size: 0.283 iteration: 163, error: 0.41889570552147243, fairness violation: 0.005059730061349694, violated group size: 0.283 iteration: 164, error: 0.4191402439024391, fairness violation: 0.005039463414634148, violated group size: 0.283 iteration: 165, error: 0.41938181818181824, fairness violation: 0.005019442424242424, violated group size: 0.217 iteration: 166, error: 0.4192650602409639, fairness violation: 0.005028421686746988, violated group size: 0.217 iteration: 167, error: 0.41950299401197605, fairness violation: 0.005008706586826348, violated group size: 0.217 iteration: 168, error: 0.41973809523809513, fairness violation: 0.004989226190476189, violated group size: 0.217 iteration: 169, error: 0.41997041420118336, fairness violation: 0.0049699763313609474, violated group size: 0.283 iteration: 170, error: 0.4202, fairness violation: 0.00495095294117647, violated group size: 0.283 iteration: 171, error: 0.4204269005847953, fairness violation: 0.004932152046783625, violated group size: 0.217 iteration: 172, error: 0.42065116279069764, fairness violation: 0.00491356976744186, violated group size: 0.217 iteration: 173, error: 0.4208728323699421, fairness violation: 0.004895202312138728, violated group size: 0.217 iteration: 174, error: 0.42109195402298855, fairness violation: 0.004877045977011494, violated group size: 0.217 iteration: 175, error: 0.4213085714285715, fairness violation: 0.004859097142857142, violated group size: 0.217 iteration: 176, error: 0.42152272727272727, fairness violation: 0.0048413522727272715, violated group size: 0.217 iteration: 177, error: 0.42173446327683617, fairness violation: 0.00482380790960452, violated group size: 0.217 iteration: 178, error: 0.42161235955056187, fairness violation: 0.004833280898876404, violated group size: 0.217 iteration: 179, error: 0.42182122905027924, fairness violation: 0.004815977653631285, violated group size: 0.217 iteration: 180, error: 0.4220277777777778, fairness violation: 0.004798866666666665, violated group size: 0.217 iteration: 181, error: 0.42223204419889504, fairness violation: 0.004781944751381214, violated group size: 0.283 iteration: 182, error: 0.4224340659340659, fairness violation: 0.004765208791208789, violated group size: 0.217 iteration: 183, error: 0.4226338797814208, fairness violation: 0.004748655737704917, violated group size: 0.217 iteration: 184, error: 0.4228315217391304, fairness violation: 0.004732282608695651, violated group size: 0.217 iteration: 185, error: 0.4230270270270271, fairness violation: 0.004716086486486487, violated group size: 0.217 iteration: 186, error: 0.4229032258064515, fairness violation: 0.0047257311827957, violated group size: 0.283 iteration: 187, error: 0.4230962566844919, fairness violation: 0.0047097433155080205, violated group size: 0.217 iteration: 188, error: 0.4229734042553191, fairness violation: 0.00471931914893617, violated group size: 0.283 iteration: 189, error: 0.4231640211640213, fairness violation: 0.004703534391534391, violated group size: 0.217 iteration: 190, error: 0.42304210526315794, fairness violation: 0.004713042105263158, violated group size: 0.217 iteration: 191, error: 0.4232303664921467, fairness violation: 0.004697455497382198, violated group size: 0.217 iteration: 192, error: 0.42310937499999995, fairness violation: 0.004706895833333333, violated group size: 0.217 iteration: 193, error: 0.42329533678756476, fairness violation: 0.004691502590673575, violated group size: 0.283 iteration: 194, error: 0.4231752577319588, fairness violation: 0.004700876288659792, violated group size: 0.217 iteration: 195, error: 0.4230564102564103, fairness violation: 0.004710153846153845, violated group size: 0.217 iteration: 196, error: 0.4229387755102041, fairness violation: 0.004719336734693878, violated group size: 0.283 iteration: 197, error: 0.4228223350253807, fairness violation: 0.004728426395939086, violated group size: 0.283 iteration: 198, error: 0.4227070707070707, fairness violation: 0.004737424242424242, violated group size: 0.217 iteration: 199, error: 0.4228894472361809, fairness violation: 0.004722341708542713, violated group size: 0.217 iteration: 200, error: 0.42277499999999996, fairness violation: 0.004731279999999999, violated group size: 0.217 iteration: 201, error: 0.4226616915422886, fairness violation: 0.004740129353233829, violated group size: 0.217 iteration: 202, error: 0.4225495049504951, fairness violation: 0.00474889108910891, violated group size: 0.217 iteration: 203, error: 0.42243842364532025, fairness violation: 0.004757566502463053, violated group size: 0.283 iteration: 204, error: 0.42232843137254905, fairness violation: 0.004766156862745097, violated group size: 0.283 iteration: 205, error: 0.422219512195122, fairness violation: 0.004774663414634145, violated group size: 0.217 iteration: 206, error: 0.422111650485437, fairness violation: 0.004783087378640775, violated group size: 0.217 iteration: 207, error: 0.4220048309178744, fairness violation: 0.00479142995169082, violated group size: 0.217 iteration: 208, error: 0.4218990384615385, fairness violation: 0.004799692307692306, violated group size: 0.217 iteration: 209, error: 0.42179425837320567, fairness violation: 0.004807875598086124, violated group size: 0.217 iteration: 210, error: 0.4216904761904762, fairness violation: 0.004815980952380952, violated group size: 0.217 iteration: 211, error: 0.42158767772511846, fairness violation: 0.0048240094786729856, violated group size: 0.217 iteration: 212, error: 0.42148584905660386, fairness violation: 0.004831962264150944, violated group size: 0.217 iteration: 213, error: 0.4213849765258215, fairness violation: 0.004839840375586855, violated group size: 0.283 iteration: 214, error: 0.421285046728972, fairness violation: 0.0048476448598130835, violated group size: 0.217 iteration: 215, error: 0.42118604651162794, fairness violation: 0.004855376744186045, violated group size: 0.217 iteration: 216, error: 0.4210879629629629, fairness violation: 0.004863037037037037, violated group size: 0.283 iteration: 217, error: 0.42099078341013824, fairness violation: 0.004870626728110601, violated group size: 0.283 iteration: 218, error: 0.42089449541284396, fairness violation: 0.004878146788990825, violated group size: 0.217 iteration: 219, error: 0.42079908675799094, fairness violation: 0.004885598173515983, violated group size: 0.283 iteration: 220, error: 0.4207045454545455, fairness violation: 0.004892981818181818, violated group size: 0.283 iteration: 221, error: 0.4206108597285068, fairness violation: 0.004900298642533936, violated group size: 0.283 iteration: 222, error: 0.4205180180180179, fairness violation: 0.004907549549549549, violated group size: 0.217 iteration: 223, error: 0.4204260089686098, fairness violation: 0.004914735426008968, violated group size: 0.217 iteration: 224, error: 0.4203348214285714, fairness violation: 0.004921857142857143, violated group size: 0.283 iteration: 225, error: 0.4202444444444444, fairness violation: 0.004928915555555555, violated group size: 0.217 iteration: 226, error: 0.42015486725663725, fairness violation: 0.004935911504424777, violated group size: 0.217 iteration: 227, error: 0.4200660792951542, fairness violation: 0.004942845814977973, violated group size: 0.217 iteration: 228, error: 0.4199780701754386, fairness violation: 0.004949719298245614, violated group size: 0.217 iteration: 229, error: 0.4198908296943231, fairness violation: 0.004956532751091703, violated group size: 0.283 iteration: 230, error: 0.419804347826087, fairness violation: 0.004963286956521739, violated group size: 0.283 iteration: 231, error: 0.4197186147186147, fairness violation: 0.004969982683982686, violated group size: 0.283 iteration: 232, error: 0.4196336206896552, fairness violation: 0.004976620689655175, violated group size: 0.283 iteration: 233, error: 0.419549356223176, fairness violation: 0.004983201716738197, violated group size: 0.283 iteration: 234, error: 0.419465811965812, fairness violation: 0.0049897264957264945, violated group size: 0.217 iteration: 235, error: 0.4193829787234044, fairness violation: 0.00499619574468085, violated group size: 0.217 iteration: 236, error: 0.41930084745762713, fairness violation: 0.005002610169491525, violated group size: 0.283 iteration: 237, error: 0.4192194092827004, fairness violation: 0.005008970464135021, violated group size: 0.283 iteration: 238, error: 0.41913865546218493, fairness violation: 0.00501527731092437, violated group size: 0.283 iteration: 239, error: 0.4190585774058578, fairness violation: 0.005021531380753138, violated group size: 0.283 iteration: 240, error: 0.4189791666666667, fairness violation: 0.005027733333333333, violated group size: 0.217 iteration: 241, error: 0.41890041493775937, fairness violation: 0.005033883817427385, violated group size: 0.217 iteration: 242, error: 0.4188223140495868, fairness violation: 0.0050399834710743805, violated group size: 0.217 iteration: 243, error: 0.4187448559670781, fairness violation: 0.005046032921810699, violated group size: 0.217 iteration: 244, error: 0.41890983606557386, fairness violation: 0.005032467213114753, violated group size: 0.217 iteration: 245, error: 0.419073469387755, fairness violation: 0.005019012244897959, violated group size: 0.217 iteration: 246, error: 0.41923577235772364, fairness violation: 0.005005666666666667, violated group size: 0.283 iteration: 247, error: 0.4191578947368422, fairness violation: 0.005011757085020243, violated group size: 0.217 iteration: 248, error: 0.41908064516129034, fairness violation: 0.005017798387096774, violated group size: 0.283 iteration: 249, error: 0.4192409638554217, fairness violation: 0.005004618473895581, violated group size: 0.217 iteration: 250, error: 0.4194000000000001, fairness violation: 0.004991544, violated group size: 0.217 iteration: 251, error: 0.4195577689243028, fairness violation: 0.004978573705179282, violated group size: 0.283 iteration: 252, error: 0.4197142857142857, fairness violation: 0.004965706349206349, violated group size: 0.217 iteration: 253, error: 0.4198695652173912, fairness violation: 0.00495294071146245, violated group size: 0.217 iteration: 254, error: 0.42002362204724414, fairness violation: 0.00494027559055118, violated group size: 0.217 iteration: 255, error: 0.4201764705882353, fairness violation: 0.004927709803921568, violated group size: 0.217 iteration: 256, error: 0.420328125, fairness violation: 0.004915242187499999, violated group size: 0.217 iteration: 257, error: 0.42047859922178993, fairness violation: 0.004902871595330739, violated group size: 0.217 iteration: 258, error: 0.42062790697674424, fairness violation: 0.004890596899224807, violated group size: 0.217 iteration: 259, error: 0.4207760617760617, fairness violation: 0.004878416988416988, violated group size: 0.283 iteration: 260, error: 0.42069615384615383, fairness violation: 0.004884692307692307, violated group size: 0.217 iteration: 261, error: 0.42061685823754785, fairness violation: 0.004890919540229886, violated group size: 0.283 iteration: 262, error: 0.42076335877862603, fairness violation: 0.004878877862595419, violated group size: 0.217 iteration: 263, error: 0.4209087452471483, fairness violation: 0.004866927756653992, violated group size: 0.217 iteration: 264, error: 0.4208295454545454, fairness violation: 0.004873151515151516, violated group size: 0.283 iteration: 265, error: 0.4209735849056603, fairness violation: 0.004861313207547171, violated group size: 0.283 iteration: 266, error: 0.4211165413533834, fairness violation: 0.004849563909774436, violated group size: 0.217 iteration: 267, error: 0.42125842696629223, fairness violation: 0.0048379026217228475, violated group size: 0.217 iteration: 268, error: 0.42139925373134324, fairness violation: 0.004826328358208956, violated group size: 0.283 iteration: 269, error: 0.42131970260223045, fairness violation: 0.0048325873605947955, violated group size: 0.217 iteration: 270, error: 0.42145925925925937, fairness violation: 0.00482111851851852, violated group size: 0.283 iteration: 271, error: 0.42159778597785963, fairness violation: 0.004809734317343174, violated group size: 0.217 iteration: 272, error: 0.42173529411764704, fairness violation: 0.004798433823529413, violated group size: 0.283 iteration: 273, error: 0.4216556776556777, fairness violation: 0.004804703296703296, violated group size: 0.217 iteration: 274, error: 0.42157664233576647, fairness violation: 0.00481092700729927, violated group size: 0.217 iteration: 275, error: 0.42171272727272724, fairness violation: 0.004799745454545455, violated group size: 0.217 iteration: 276, error: 0.42184782608695653, fairness violation: 0.004788644927536233, violated group size: 0.217 iteration: 277, error: 0.4219819494584837, fairness violation: 0.004777624548736462, violated group size: 0.217 iteration: 278, error: 0.42190287769784157, fairness violation: 0.004783856115107913, violated group size: 0.217 iteration: 279, error: 0.42182437275985674, fairness violation: 0.004790043010752689, violated group size: 0.217 iteration: 280, error: 0.42174642857142863, fairness violation: 0.004796185714285715, violated group size: 0.283 iteration: 281, error: 0.42166903914590753, fairness violation: 0.0048022846975088965, violated group size: 0.283 iteration: 282, error: 0.4218014184397163, fairness violation: 0.00479141134751773, violated group size: 0.217 iteration: 283, error: 0.42172438162544174, fairness violation: 0.0047974840989399295, violated group size: 0.217 iteration: 284, error: 0.4216478873239437, fairness violation: 0.004803514084507042, violated group size: 0.217 iteration: 285, error: 0.42157192982456126, fairness violation: 0.004809501754385964, violated group size: 0.217 iteration: 286, error: 0.4217027972027972, fairness violation: 0.004798755244755245, violated group size: 0.217 iteration: 287, error: 0.4218327526132404, fairness violation: 0.004788083623693379, violated group size: 0.283 iteration: 288, error: 0.4219618055555556, fairness violation: 0.004777486111111113, violated group size: 0.283 iteration: 289, error: 0.4218858131487888, fairness violation: 0.004783480968858131, violated group size: 0.217 iteration: 290, error: 0.4218103448275861, fairness violation: 0.004789434482758621, violated group size: 0.217 iteration: 291, error: 0.42193814432989696, fairness violation: 0.004778941580756014, violated group size: 0.283 iteration: 292, error: 0.42186301369863016, fairness violation: 0.0047848698630136985, violated group size: 0.217 iteration: 293, error: 0.4217883959044368, fairness violation: 0.004790757679180888, violated group size: 0.217 iteration: 294, error: 0.42171428571428576, fairness violation: 0.004796605442176871, violated group size: 0.217 iteration: 295, error: 0.4216406779661017, fairness violation: 0.004802413559322035, violated group size: 0.217 iteration: 296, error: 0.4215675675675675, fairness violation: 0.004808182432432432, violated group size: 0.217 iteration: 297, error: 0.4214949494949495, fairness violation: 0.00481391245791246, violated group size: 0.283 iteration: 298, error: 0.4214228187919464, fairness violation: 0.0048196040268456385, violated group size: 0.217 iteration: 299, error: 0.42135117056856186, fairness violation: 0.0048252575250836115, violated group size: 0.217 iteration: 300, error: 0.42128, fairness violation: 0.004830873333333335, violated group size: 0.283 iteration: 301, error: 0.42120930232558146, fairness violation: 0.004836451827242525, violated group size: 0.217 iteration: 302, error: 0.42113907284768215, fairness violation: 0.004841993377483444, violated group size: 0.217 iteration: 303, error: 0.42106930693069305, fairness violation: 0.004847498349834984, violated group size: 0.217 iteration: 304, error: 0.4211940789473684, fairness violation: 0.004837263157894738, violated group size: 0.283 iteration: 305, error: 0.4211245901639345, fairness violation: 0.004842747540983607, violated group size: 0.283 iteration: 306, error: 0.4210555555555555, fairness violation: 0.004848196078431373, violated group size: 0.217 iteration: 307, error: 0.42098697068403895, fairness violation: 0.004853609120521175, violated group size: 0.283 iteration: 308, error: 0.4209188311688312, fairness violation: 0.004858987012987015, violated group size: 0.283 iteration: 309, error: 0.42085113268608415, fairness violation: 0.00486433009708738, violated group size: 0.283 iteration: 310, error: 0.4207838709677419, fairness violation: 0.00486963870967742, violated group size: 0.283 iteration: 311, error: 0.420717041800643, fairness violation: 0.004874913183279744, violated group size: 0.217 iteration: 312, error: 0.42065064102564104, fairness violation: 0.0048801538461538466, violated group size: 0.217 iteration: 313, error: 0.42058466453674115, fairness violation: 0.0048853610223642185, violated group size: 0.217 iteration: 314, error: 0.42051910828025474, fairness violation: 0.004890535031847135, violated group size: 0.217 iteration: 315, error: 0.4204539682539683, fairness violation: 0.004895676190476191, violated group size: 0.217 iteration: 316, error: 0.4203892405063292, fairness violation: 0.004900784810126583, violated group size: 0.217 iteration: 317, error: 0.4203249211356468, fairness violation: 0.004905861198738172, violated group size: 0.283 iteration: 318, error: 0.4202610062893082, fairness violation: 0.00491090566037736, violated group size: 0.217 iteration: 319, error: 0.4201974921630094, fairness violation: 0.004915918495297806, violated group size: 0.217 iteration: 320, error: 0.4201343749999999, fairness violation: 0.004920900000000002, violated group size: 0.217 iteration: 321, error: 0.4200716510903427, fairness violation: 0.004925850467289721, violated group size: 0.217 iteration: 322, error: 0.4200093167701862, fairness violation: 0.0049307701863354056, violated group size: 0.283 iteration: 323, error: 0.4199473684210526, fairness violation: 0.00493565944272446, violated group size: 0.283 iteration: 324, error: 0.41988580246913576, fairness violation: 0.004940518518518519, violated group size: 0.217 iteration: 325, error: 0.41982461538461535, fairness violation: 0.004945347692307694, violated group size: 0.217 iteration: 326, error: 0.4197638036809816, fairness violation: 0.004950147239263805, violated group size: 0.283 iteration: 327, error: 0.4197033639143731, fairness violation: 0.004954917431192661, violated group size: 0.283 iteration: 328, error: 0.4196432926829268, fairness violation: 0.004959658536585366, violated group size: 0.217 iteration: 329, error: 0.41958358662613987, fairness violation: 0.004964370820668694, violated group size: 0.283 iteration: 330, error: 0.41952424242424236, fairness violation: 0.004969054545454545, violated group size: 0.217 iteration: 331, error: 0.41946525679758306, fairness violation: 0.00497370996978852, violated group size: 0.217 iteration: 332, error: 0.41940662650602417, fairness violation: 0.004978337349397591, violated group size: 0.217 iteration: 333, error: 0.4193483483483482, fairness violation: 0.004982936936936937, violated group size: 0.217 iteration: 334, error: 0.4192904191616766, fairness violation: 0.004987508982035928, violated group size: 0.217 iteration: 335, error: 0.4192328358208956, fairness violation: 0.004992053731343284, violated group size: 0.283 iteration: 336, error: 0.4191755952380953, fairness violation: 0.00499657142857143, violated group size: 0.283 iteration: 337, error: 0.4191186943620178, fairness violation: 0.0050010623145400595, violated group size: 0.217 iteration: 338, error: 0.41906213017751476, fairness violation: 0.005005526627218935, violated group size: 0.217 iteration: 339, error: 0.4190058997050148, fairness violation: 0.005009964601769911, violated group size: 0.217 iteration: 340, error: 0.41894999999999993, fairness violation: 0.005014376470588236, violated group size: 0.283 iteration: 341, error: 0.41889442815249267, fairness violation: 0.005018762463343108, violated group size: 0.217 iteration: 342, error: 0.41883918128654973, fairness violation: 0.005023122807017544, violated group size: 0.217 iteration: 343, error: 0.41878425655976675, fairness violation: 0.0050274577259475225, violated group size: 0.283 iteration: 344, error: 0.4187296511627907, fairness violation: 0.005031767441860465, violated group size: 0.217 iteration: 345, error: 0.4186753623188406, fairness violation: 0.005036052173913045, violated group size: 0.283 iteration: 346, error: 0.4186213872832369, fairness violation: 0.005040312138728323, violated group size: 0.217 iteration: 347, error: 0.41856772334293946, fairness violation: 0.005044547550432276, violated group size: 0.283 iteration: 348, error: 0.41851436781609197, fairness violation: 0.005048758620689655, violated group size: 0.217 iteration: 349, error: 0.418461318051576, fairness violation: 0.005052945558739255, violated group size: 0.283 iteration: 350, error: 0.4185771428571428, fairness violation: 0.005043468571428572, violated group size: 0.283 iteration: 351, error: 0.4186923076923077, fairness violation: 0.005034045584045584, violated group size: 0.217 iteration: 352, error: 0.4188068181818182, fairness violation: 0.005024676136363637, violated group size: 0.283 iteration: 353, error: 0.4189206798866855, fairness violation: 0.005015359773371105, violated group size: 0.217 iteration: 354, error: 0.41903389830508475, fairness violation: 0.005006096045197741, violated group size: 0.283 iteration: 355, error: 0.41914647887323936, fairness violation: 0.004996884507042254, violated group size: 0.283 iteration: 356, error: 0.4192584269662922, fairness violation: 0.004987724719101122, violated group size: 0.217 iteration: 357, error: 0.41936974789915965, fairness violation: 0.0049786162464986, violated group size: 0.217 iteration: 358, error: 0.41948044692737424, fairness violation: 0.004969558659217878, violated group size: 0.217 iteration: 359, error: 0.41959052924791085, fairness violation: 0.004960551532033426, violated group size: 0.283 iteration: 360, error: 0.4195361111111111, fairness violation: 0.004964855555555557, violated group size: 0.283 iteration: 361, error: 0.4196454293628808, fairness violation: 0.004955911357340723, violated group size: 0.283 iteration: 362, error: 0.4197541436464089, fairness violation: 0.004947016574585636, violated group size: 0.217 iteration: 363, error: 0.4198622589531681, fairness violation: 0.004938170798898072, violated group size: 0.283 iteration: 364, error: 0.41996978021978026, fairness violation: 0.004929373626373626, violated group size: 0.217 iteration: 365, error: 0.42007671232876714, fairness violation: 0.004920624657534246, violated group size: 0.217 iteration: 366, error: 0.42018306010928963, fairness violation: 0.004911923497267759, violated group size: 0.217 iteration: 367, error: 0.4202888283378746, fairness violation: 0.004903269754768393, violated group size: 0.217 iteration: 368, error: 0.42039402173913043, fairness violation: 0.00489466304347826, violated group size: 0.217 iteration: 369, error: 0.4204986449864499, fairness violation: 0.00488610298102981, violated group size: 0.283 iteration: 370, error: 0.4206027027027027, fairness violation: 0.0048775891891891885, violated group size: 0.217 iteration: 371, error: 0.4207061994609164, fairness violation: 0.004869121293800538, violated group size: 0.217 iteration: 372, error: 0.4208091397849463, fairness violation: 0.004860698924731182, violated group size: 0.217 iteration: 373, error: 0.420911528150134, fairness violation: 0.004852321715817694, violated group size: 0.217 iteration: 374, error: 0.420855614973262, fairness violation: 0.004856754010695187, violated group size: 0.217 iteration: 375, error: 0.4209573333333334, fairness violation: 0.004848432, violated group size: 0.217 iteration: 376, error: 0.42105851063829786, fairness violation: 0.004840154255319148, violated group size: 0.217 iteration: 377, error: 0.4211591511936339, fairness violation: 0.004831920424403182, violated group size: 0.217 iteration: 378, error: 0.4211031746031746, fairness violation: 0.004836359788359788, violated group size: 0.217 iteration: 379, error: 0.42120316622691284, fairness violation: 0.004828179419525066, violated group size: 0.217 iteration: 380, error: 0.42130263157894726, fairness violation: 0.004820042105263157, violated group size: 0.217 iteration: 381, error: 0.42124671916010503, fairness violation: 0.004824477690288715, violated group size: 0.283 iteration: 382, error: 0.42134554973821986, fairness violation: 0.004816392670157068, violated group size: 0.283 iteration: 383, error: 0.42144386422976504, fairness violation: 0.004808349869451696, violated group size: 0.217 iteration: 384, error: 0.42154166666666676, fairness violation: 0.004800348958333333, violated group size: 0.283 iteration: 385, error: 0.4214857142857143, fairness violation: 0.00480478961038961, violated group size: 0.217 iteration: 386, error: 0.4215829015544041, fairness violation: 0.0047968393782383415, violated group size: 0.217 iteration: 387, error: 0.42152713178294576, fairness violation: 0.004801266149870801, violated group size: 0.283 iteration: 388, error: 0.4216237113402061, fairness violation: 0.004793365979381444, violated group size: 0.283 iteration: 389, error: 0.42171979434447304, fairness violation: 0.004785506426735219, violated group size: 0.217 iteration: 390, error: 0.4218153846153847, fairness violation: 0.00477768717948718, violated group size: 0.217 iteration: 391, error: 0.4219104859335038, fairness violation: 0.004769907928388747, violated group size: 0.217 iteration: 392, error: 0.4218545918367348, fairness violation: 0.00477434693877551, violated group size: 0.217 iteration: 393, error: 0.42194910941475816, fairness violation: 0.004766615776081424, violated group size: 0.217 iteration: 394, error: 0.42204314720812186, fairness violation: 0.004758923857868021, violated group size: 0.283 iteration: 395, error: 0.4221367088607595, fairness violation: 0.00475127088607595, violated group size: 0.217 iteration: 396, error: 0.42208080808080806, fairness violation: 0.004755712121212122, violated group size: 0.283 iteration: 397, error: 0.42202518891687657, fairness violation: 0.004760130982367758, violated group size: 0.217 iteration: 398, error: 0.42196984924623115, fairness violation: 0.004764527638190955, violated group size: 0.283 iteration: 399, error: 0.42191478696741846, fairness violation: 0.004768902255639098, violated group size: 0.217 iteration: 400, error: 0.42186, fairness violation: 0.004773255, violated group size: 0.217 iteration: 401, error: 0.4218054862842893, fairness violation: 0.004777586034912718, violated group size: 0.283 iteration: 402, error: 0.4217512437810945, fairness violation: 0.00478189552238806, violated group size: 0.217 iteration: 403, error: 0.4218436724565757, fairness violation: 0.0047743374689826305, violated group size: 0.283 iteration: 404, error: 0.42178960396039605, fairness violation: 0.004778633663366336, violated group size: 0.217 iteration: 405, error: 0.4217358024691357, fairness violation: 0.004782908641975308, violated group size: 0.217 iteration: 406, error: 0.4216822660098523, fairness violation: 0.004787162561576355, violated group size: 0.217 iteration: 407, error: 0.4216289926289926, fairness violation: 0.004791395577395577, violated group size: 0.283 iteration: 408, error: 0.421575980392157, fairness violation: 0.004795607843137254, violated group size: 0.217 iteration: 409, error: 0.4215232273838631, fairness violation: 0.004799799511002444, violated group size: 0.217 iteration: 410, error: 0.42147073170731714, fairness violation: 0.004803970731707317, violated group size: 0.283 iteration: 411, error: 0.4214184914841849, fairness violation: 0.0048081216545012165, violated group size: 0.217 iteration: 412, error: 0.4213665048543689, fairness violation: 0.004812252427184466, violated group size: 0.283 iteration: 413, error: 0.42131476997578693, fairness violation: 0.004816363196125908, violated group size: 0.217 iteration: 414, error: 0.42126328502415455, fairness violation: 0.004820454106280194, violated group size: 0.217 iteration: 415, error: 0.4212120481927711, fairness violation: 0.004824525301204821, violated group size: 0.283 iteration: 416, error: 0.42116105769230766, fairness violation: 0.004828576923076923, violated group size: 0.217 iteration: 417, error: 0.4211103117505996, fairness violation: 0.004832609112709832, violated group size: 0.283 iteration: 418, error: 0.42105980861244025, fairness violation: 0.004836622009569378, violated group size: 0.283 iteration: 419, error: 0.42100954653937933, fairness violation: 0.004840615751789977, violated group size: 0.217 iteration: 420, error: 0.42110000000000003, fairness violation: 0.0048332238095238084, violated group size: 0.217 iteration: 421, error: 0.42104988123515436, fairness violation: 0.004837206650831354, violated group size: 0.217 iteration: 422, error: 0.42100000000000004, fairness violation: 0.004841170616113744, violated group size: 0.217 iteration: 423, error: 0.420950354609929, fairness violation: 0.004845115839243499, violated group size: 0.217 iteration: 424, error: 0.42104009433962253, fairness violation: 0.004837783018867924, violated group size: 0.217 iteration: 425, error: 0.4209905882352941, fairness violation: 0.004841717647058822, violated group size: 0.217 iteration: 426, error: 0.42094131455399053, fairness violation: 0.004845633802816901, violated group size: 0.217 iteration: 427, error: 0.42089227166276344, fairness violation: 0.004849531615925057, violated group size: 0.217 iteration: 428, error: 0.4208434579439252, fairness violation: 0.004853411214953271, violated group size: 0.217 iteration: 429, error: 0.4207948717948717, fairness violation: 0.0048572727272727274, violated group size: 0.283 iteration: 430, error: 0.42074651162790694, fairness violation: 0.004861116279069767, violated group size: 0.217 iteration: 431, error: 0.4206983758700697, fairness violation: 0.004864941995359629, violated group size: 0.283 iteration: 432, error: 0.420650462962963, fairness violation: 0.00486875, violated group size: 0.217 iteration: 433, error: 0.42060277136258656, fairness violation: 0.0048725404157043874, violated group size: 0.217 iteration: 434, error: 0.42055529953917054, fairness violation: 0.0048763133640553, violated group size: 0.283 iteration: 435, error: 0.42050804597701147, fairness violation: 0.004880068965517241, violated group size: 0.217 iteration: 436, error: 0.4204610091743119, fairness violation: 0.004883807339449542, violated group size: 0.217 iteration: 437, error: 0.4204141876430207, fairness violation: 0.004887528604118992, violated group size: 0.217 iteration: 438, error: 0.42036757990867574, fairness violation: 0.004891232876712329, violated group size: 0.217 iteration: 439, error: 0.4203211845102506, fairness violation: 0.0048949202733485206, violated group size: 0.283 iteration: 440, error: 0.42027499999999995, fairness violation: 0.00489859090909091, violated group size: 0.283 iteration: 441, error: 0.42022902494331066, fairness violation: 0.004902244897959184, violated group size: 0.283 iteration: 442, error: 0.42018325791855204, fairness violation: 0.004905882352941177, violated group size: 0.217 iteration: 443, error: 0.42013769751693003, fairness violation: 0.004909503386004516, violated group size: 0.283 iteration: 444, error: 0.42009234234234244, fairness violation: 0.004913108108108108, violated group size: 0.217 iteration: 445, error: 0.420047191011236, fairness violation: 0.004916696629213483, violated group size: 0.217 iteration: 446, error: 0.42000224215246645, fairness violation: 0.004920269058295964, violated group size: 0.217 iteration: 447, error: 0.4199574944071588, fairness violation: 0.004923825503355704, violated group size: 0.217 iteration: 448, error: 0.41991294642857147, fairness violation: 0.004927366071428571, violated group size: 0.217 iteration: 449, error: 0.41986859688195993, fairness violation: 0.004930890868596881, violated group size: 0.217 iteration: 450, error: 0.41982444444444433, fairness violation: 0.004934399999999999, violated group size: 0.217 iteration: 451, error: 0.41978048780487814, fairness violation: 0.004937893569844789, violated group size: 0.217 iteration: 452, error: 0.41973672566371684, fairness violation: 0.004941371681415928, violated group size: 0.217 iteration: 453, error: 0.41969315673289187, fairness violation: 0.0049448344370860925, violated group size: 0.217 iteration: 454, error: 0.41964977973568285, fairness violation: 0.004948281938325991, violated group size: 0.283 iteration: 455, error: 0.41960659340659345, fairness violation: 0.004951714285714286, violated group size: 0.283 iteration: 456, error: 0.41956359649122804, fairness violation: 0.004955131578947367, violated group size: 0.217 iteration: 457, error: 0.41952078774617063, fairness violation: 0.0049585339168490145, violated group size: 0.217 iteration: 458, error: 0.41947816593886456, fairness violation: 0.004961921397379911, violated group size: 0.217 iteration: 459, error: 0.4194357298474945, fairness violation: 0.00496529411764706, violated group size: 0.283 iteration: 460, error: 0.4193934782608696, fairness violation: 0.004968652173913044, violated group size: 0.283 iteration: 461, error: 0.41935140997830805, fairness violation: 0.004971995661605205, violated group size: 0.283 iteration: 462, error: 0.41930952380952374, fairness violation: 0.0049753246753246735, violated group size: 0.217 iteration: 463, error: 0.41926781857451406, fairness violation: 0.004978639308855291, violated group size: 0.217 iteration: 464, error: 0.41922629310344817, fairness violation: 0.004981939655172413, violated group size: 0.217 iteration: 465, error: 0.41918494623655916, fairness violation: 0.004985225806451612, violated group size: 0.217 iteration: 466, error: 0.4191437768240344, fairness violation: 0.004988497854077254, violated group size: 0.283 iteration: 467, error: 0.41910278372591, fairness violation: 0.004991755888650964, violated group size: 0.283 iteration: 468, error: 0.4190619658119658, fairness violation: 0.004994999999999998, violated group size: 0.217 iteration: 469, error: 0.4190213219616205, fairness violation: 0.0049982302771855, violated group size: 0.217 iteration: 470, error: 0.41898085106382993, fairness violation: 0.005001446808510636, violated group size: 0.283 iteration: 471, error: 0.41894055201698516, fairness violation: 0.005004649681528661, violated group size: 0.217 iteration: 472, error: 0.41890042372881364, fairness violation: 0.005007838983050847, violated group size: 0.283 iteration: 473, error: 0.4188604651162791, fairness violation: 0.005011014799154333, violated group size: 0.217 iteration: 474, error: 0.41882067510548526, fairness violation: 0.005014177215189871, violated group size: 0.217 iteration: 475, error: 0.41878105263157905, fairness violation: 0.0050173263157894735, violated group size: 0.283 iteration: 476, error: 0.41874159663865557, fairness violation: 0.0050204621848739485, violated group size: 0.217 iteration: 477, error: 0.4188259958071279, fairness violation: 0.005013576519916141, violated group size: 0.217 iteration: 478, error: 0.41878661087866115, fairness violation: 0.005016707112970709, violated group size: 0.217 iteration: 479, error: 0.4188705636743216, fairness violation: 0.005009858037578285, violated group size: 0.217 iteration: 480, error: 0.41883125000000004, fairness violation: 0.005012983333333334, violated group size: 0.283 iteration: 481, error: 0.4187920997920998, fairness violation: 0.005016095634095634, violated group size: 0.283 iteration: 482, error: 0.4187531120331951, fairness violation: 0.0050191950207468874, violated group size: 0.283 iteration: 483, error: 0.4188364389233955, fairness violation: 0.00501239751552795, violated group size: 0.217 iteration: 484, error: 0.41891942148760325, fairness violation: 0.005005628099173555, violated group size: 0.283 iteration: 485, error: 0.4190020618556701, fairness violation: 0.004998886597938144, violated group size: 0.283 iteration: 486, error: 0.41896296296296304, fairness violation: 0.005001995884773661, violated group size: 0.217 iteration: 487, error: 0.4190451745379877, fairness violation: 0.004995289527720739, violated group size: 0.283 iteration: 488, error: 0.4191270491803279, fairness violation: 0.004988610655737704, violated group size: 0.283 iteration: 489, error: 0.4192085889570552, fairness violation: 0.004981959100204497, violated group size: 0.217 iteration: 490, error: 0.41916938775510204, fairness violation: 0.004985077551020407, violated group size: 0.283 iteration: 491, error: 0.4192505091649695, fairness violation: 0.004978460285132381, violated group size: 0.217 iteration: 492, error: 0.4192113821138212, fairness violation: 0.004981573170731706, violated group size: 0.217 iteration: 493, error: 0.41917241379310355, fairness violation: 0.004984673427991887, violated group size: 0.283 iteration: 494, error: 0.41913360323886634, fairness violation: 0.004987761133603237, violated group size: 0.217 iteration: 495, error: 0.4192141414141415, fairness violation: 0.004981191919191918, violated group size: 0.217 iteration: 496, error: 0.4192943548387097, fairness violation: 0.004974649193548386, violated group size: 0.217 iteration: 497, error: 0.419374245472837, fairness violation: 0.004968132796780683, violated group size: 0.217 iteration: 498, error: 0.4194538152610441, fairness violation: 0.004961642570281124, violated group size: 0.217 iteration: 499, error: 0.41953306613226454, fairness violation: 0.0049551783567134255, violated group size: 0.217
3-d heatmaps
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 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.
# output heatmap (brute force)
# replace None with the relative path if you want to save the plot
fair_model.heatmapflag = True
fair_model.heatmap_path = 'heatmap'
fair_model.generate_heatmap(data_set, dataset_yhat.labels)
Image(filename='{}.png'.format(fair_model.heatmap_path))
black-box auditing
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.
gerry_metric = BinaryLabelDatasetMetric(data_set)
gamma_disparity = gerry_metric.rich_subgroup(array_to_tuple(dataset_yhat.labels), 'FP')
print(gamma_disparity)
0.004955178356713431
pareto curves
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$$
By default in this package, and in the companion empirical and theory 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.
# set to 50 iterations for fast running of notebook - set >= 1000 when running real experiments
pareto_iters = 50
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):
ln_predictor = linear_model.LinearRegression()
svm_predictor = svm.LinearSVR()
tree_predictor = tree.DecisionTreeRegressor(max_depth=3)
kernel_predictor = KernelRidge(alpha=1.0, gamma=1.0, kernel='rbf')
predictor_dict = {'Linear': {'predictor': ln_predictor, 'iters': iters},
'SVR': {'predictor': svm_predictor, 'iters': iters},
'Tree': {'predictor': tree_predictor, 'iters': iters},
'Kernel': {'predictor': kernel_predictor, 'iters': iters}}
results_dict = {}
for pred in predictor_dict:
print('Curr Predictor: {}'.format(pred))
predictor = predictor_dict[pred]['predictor']
max_iters = predictor_dict[pred]['iters']
fair_clf = GerryFairClassifier(C=100, printflag=True, gamma=1, predictor=predictor, max_iters=max_iters)
fair_clf.printflag = False
fair_clf.max_iters=max_iters
errors, fp_violations, fn_violations = fair_clf.pareto(dataset, gamma_list)
results_dict[pred] = {'errors': errors, 'fp_violations': fp_violations, 'fn_violations': fn_violations}
plt.plot(errors, fp_violations, label=pred)
if save_results:
pickle.dump(results_dict, open('results_dict_' + str(gamma_list) + '_gammas' + str(gamma_list) + '.pkl', 'wb'))
plt.xlabel('Error')
plt.ylabel('Unfairness')
plt.legend()
plt.title('Error vs. Unfairness\n(Adult Dataset)')
plt.savefig('gerryfair_pareto.png')
plt.close()
multiple_classifiers_pareto(data_set)
Image(filename='gerryfair_pareto.png')
Curr Predictor: Linear Curr Predictor: SVR Curr Predictor: Tree Curr Predictor: Kernel
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.
def fp_vs_fn(dataset, gamma_list, iters):
fp_auditor = Auditor(dataset, 'FP')
fn_auditor = Auditor(dataset, 'FN')
fp_violations = []
fn_violations = []
for g in gamma_list:
print('gamma: {} '.format(g), end =" ")
fair_model = GerryFairClassifier(C=100, printflag=False, gamma=g, max_iters=iters)
fair_model.gamma=g
fair_model.fit(dataset)
predictions = array_to_tuple((fair_model.predict(dataset)).labels)
_, fp_diff = fp_auditor.audit(predictions)
_, fn_diff = fn_auditor.audit(predictions)
fp_violations.append(fp_diff)
fn_violations.append(fn_diff)
plt.plot(fp_violations, fn_violations, label='adult')
plt.xlabel('False Positive Disparity')
plt.ylabel('False Negative Disparity')
plt.legend()
plt.title('FP vs FN Unfairness')
plt.savefig('gerryfair_fp_fn.png')
plt.close()
gamma_list = [0.001, 0.002, 0.003, 0.004, 0.005, 0.0075, 0.01, 0.02, 0.03, 0.05]
fp_vs_fn(data_set, gamma_list, pareto_iters)
Image(filename='gerryfair_fp_fn.png')
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