Skip to content

Run fairness-aware search

QuOptuna can search for models that stay accurate AND equitable across a protected attribute. You supply a categorical sensitive_feature column; multiclass problems also need a favorable_class.

Set fairness_mode:

ModeBehavior
off (default)No fairness handling.
constrainedTPE feasibility constraint — every trial must satisfy a disparity threshold fairness_threshold.
multi_objectivePareto front of F1 vs disparity. Pruning is disabled in this mode.

Set fairness_metric:

MetricNotes
equal_opportunity_difference (default)Difference in true-positive rate across groups.
disparate impact / four-fifths ruleRatio-based; the classic 80% rule.
demographic-parity differenceDifference in positive-prediction rate across groups.

Fairness search is available via POST /api/v1/optimize, the Optimizer, and the CLI (--sensitive-feature, --fairness-mode, --fairness-metric, --fairness-threshold, --favorable-class).

Keep every kept trial within a disparity budget:

Terminal window
quoptuna optimize \
--sensitive-feature sex \
--fairness-mode constrained \
--fairness-metric equal_opportunity_difference \
--fairness-threshold 0.1

Only trials whose disparity is within 0.1 are treated as feasible; TPE steers toward the feasible region and best_trial comes from it.

Explore the trade-off instead of committing to one threshold:

Terminal window
quoptuna optimize \
--sensitive-feature sex \
--fairness-mode multi_objective \
--fairness-metric equal_opportunity_difference

multi_objective produces a set of non-dominated trials — each is optimal for some balance of F1 vs disparity, and none strictly beats another on both. There is no single “best”: you pick the operating point. Plot F1 against disparity across the front and choose the trial whose trade-off matches your governance requirements (for example, the highest-F1 trial whose disparity stays under your acceptable ceiling).