Project
A bias audit with numbers in it
A disaggregated audit of one ordinary classifier on UCI Adult — 48,842 records, income above or below $50k, with sex and race recorded and genuinely different base rates. The output is a report, not a model.
- Train something unremarkable. Gradient boosting on the standard features with no fairness intervention, so there is a headline accuracy to disaggregate.
- Establish base rates first. Before touching the model, report the positive rate per group in the data itself. Some of what you are about to find is in the world, not in the classifier.
- Four metrics, three cuts. Demographic parity difference, equalised-odds difference, true positive rate and positive predictive value — by sex, by race, and by both together. Fairlearn does the arithmetic.
- Show the conflict. Demographic parity and equalised odds cannot both hold when base rates differ. Produce the numbers where they contradict each other rather than describing the result in the abstract.
- Choose, and defend it. Fix a deployment context — a lending decision, a hiring screen — pick one definition for it, and argue in a paragraph why the others are wrong there, naming who bears the cost of each error type.
- Mitigate once. Per-group threshold adjustment or reweighting. Report what it fixed, what it cost in overall accuracy, and what it did to the other three metrics — mitigations always move something else.
Scope guard: one dataset, one model, one mitigation. If you want a second case, ProPublica's COMPAS analysis is the canonical worked example to read afterwards, not to redo.