Package: inFairness
Individual Fairness and inFairnessIntuitively, an individually fair Machine Learning (ML) model treats similar inputs similarly. Formally, the leading notion of individual fairness is metric fairness(Dwork et al., 2011); it requires:$$ d_y (h(x_1), h(x_2)) \leq L d_x(x_1, x_2) \quad \forall \quad x_1, x_2 \in X $$Here, $h: X \rightarrow Y$ is a ML model, where $X$ and $Y$ are input and output spaces; $d_x$ and $d_y$ are metrics on the input and output spaces, and $L \geq 0$ is a Lipchitz constant. This constrained optimization equation states that the distance between the model predictions for inputs $x_1$ and $x_2$ is upper-bounded by the fair distance between the inputs $x_1$ and $x_2$. Here, the fair metric $d_x$ encodes our intuition of which samples should be treated similarly by the ML model, and in designing so, we ensure that for input samples considered similar by the fair metric $d_x$, the model outputs will be similar as well.inFairness is a PyTorch package that supports auditing, training, and post-processing ML models for individual fairness. At its core, the library implements the key components of individual fairness pipeline: $d_x$ - distance in the input space, $d_y$ - distance in the output space, and the learning algorithms to optimize for the equation above.For an in-depth tutorial of Individual Fairness and the inFairness package, please watch this tutorial. Also, take a look at theexamplesfolder for illustrative use-cases and try theFairness Playground demo. For more group fairness examples seeAIF360.InstallationinFairness can be installed usingpip:pip install inFairnessAlternatively, if you wish to install the latest development version, you can install directly by cloning this repository:git clone <git repo url>
cd inFairness
pip install -e .FeaturesinFairness currently supports:Learning individually fair metrics :[Docs]Training of individually fair models :[Docs]Auditing pre-trained ML models for individual fairness :[Docs]Post-processing for Individual Fairness :[Docs]Individually fair ranking :[Docs]ContributingWe welcome contributions from the community in any form - whether it is through the contribution of a new fair algorithm, fair metric, a new use-case, or simply reporting an issue or enhancement in the package. To contribute code to the package, please follow the following steps:Clone this git repository to your local systemSetup your system by installing dependencies as:pip3 install -r requirements.txtandpip3 install -r  build_requirements.txtAdd your code contribution to the package. Please refer to theinFairnessfolder for an overview of the directory structureAdd appropriate unit tests in thetestsfolderOnce you are ready to commit code, check for the following:Coding style compliance using:flake8 inFairness/. This command will list all stylistic violations found in the code. Please try to fix as much as you canEnsure all the test cases pass using:coverage run --source inFairness -m pytest tests/. All unit tests need to pass to be able merge code in the package.Finally, commit your code and raise a Pull Request.TutorialsTheexamplesfolder contains tutorials from different fields illustrating how to use the package.Minimal exampleFirst, you need to import the relevant packagesfrom inFairness import distances
from inFairness.fairalgo import SenSeITheinFairness.distancesmodule implements various distance metrics on the input and the output spaces, and theinFairness.fairalgoimplements various individually fair learning algorithms withSenSeIbeing one particular algorithm.Thereafter, we instantiate and fit the distance metrics on the training data, anddistance_x = distances.SVDSensitiveSubspaceDistance()
distance_y = distances.EuclideanDistance()

distance_x.fit(X_train=data, n_components=50)

# Finally instantiate the fair algorithm
fairalgo = SenSeI(network, distance_x, distance_y, lossfn, rho=1.0, eps=1e-3, lr=0.01, auditor_nsteps=100, auditor_lr=0.1)Finally, you can train thefairalgoas you would train your standard PyTorch deep neural network:fairalgo.train()

for epoch in range(EPOCHS):
    for x, y in train_dl:
        optimizer.zero_grad()
        result = fairalgo(x, y)
        result.loss.backward()
        optimizer.step()AuthorsMikhail YurochkinMayank AgarwalAldo ParejaOnkar Bhardwaj