y_pred = pipe.predict(X) sf = X["race“] mf = MetricFrame(accuracy_score, y_true=y, y_pred=y_pred, sensitive_features=sf) print(“总体准确率:”, round(mf.overall, 4)) print(“各组准确率:\n”, mf.by_group.round(4)) print(”Demographic Parity Difference:", round(demographic_parity_difference(y, y_pred, sf), 4)) print("Equalized Odds Difference:“, round(equalized_odds_difference(y, y_pred, sf), 4)) `` 运行后,by_group 会输出每个种族的准确率,两个差异指标则直接给出模型的公平性「体检值」。进阶技巧:用 mf.difference() 可一次性查看所有指标在组间的极差;将 accuracy_score 替换为 selection_rate,即可观察各组通过率差异,这是招聘、信贷场景最常用的审计指标。 ### 核心能力详解:3 大支柱 支柱一:指标计算层(fairlearn.metrics)。以 MetricFrame 为核心,将任意 sklearn 评分函数(准确率、F1、假阳率等)自动应用到每个敏感组,输出 overall(全局值)与 by_group(分组值)两个视图。配套的 demographic_parity_difference 与 equalized_odds_difference 是公平性门槛检查的官方推荐汇总口径,语义清晰、便于写入评审文档。注意,该层不关心模型内部结构,只消费预测结果,因此可审计任意模型产出的预测标签。 支柱二:缓解算法层(fairlearn.reductions)。ExponentiatedGradient(指数梯度法)通过对训练样本加权迭代,在满足公平性约束的前提下最大化准确率,适用于大数据集;GridSearch(网格搜索)遍历公平性约束强度的超参数网格,输出「公平性-准确率」权衡曲线,便于业务侧做人工选点。两者均要求底层 estimator 支持 sample_weight 参数(即按样本加权训练),sklearn 系模型原生支持,XGBoost 需使用其 sklearn wrapper。 支柱三:后处理层(fairlearn.postprocessing)。ThresholdOptimizer` 在模型训练完成后,根据敏感特征逐组搜索最优决策阈值,在保持分组选择率或错误率满足约束的同时尽量接近原模型性能。该方法的优势是无需重新训练,劣势是推断阶段必须显式携带敏感特征值并按组选择阈值,且需要留存训练时的预测分数供阈值搜索使用。 ### 生产部署与监控:从上线到运维 部署方式一:将 Fairlearn 嵌入训练流水线的评估环节。在模型训练结束后、注册到模型仓库(如 MLflow)之前,计算 DPD 与 EOD 指标,连同模型指标一并记录到实验跟踪系统。在模型发布评审中设定硬性门槛(例如 DPD ≤ 0.1、EOD ≤ 0.15),不达标则打回重训或进入缓解流程。该方式成本最低,适合首次建设公平性流程的团队。 部署方式二:使用 ThresholdOptimizer 生成可部署的阈值规则。将阈值对象以 pickle/joblib 序列化,随模型制品一同打包;推理服务在拿到预测分数后,按请求中的敏感特征值选择对应阈值进行二值化判定。需注意,这要求线上特征中保留敏感属性,可能引发隐私合规问题,落地前需与法务确认敏感信息的使用边界。 可观测性方面,公平性指标会随数据漂移而劣化,因此需要周期性对近期线上样本重算 MetricFrame,跟踪 DPD/EOD 的时序变化并与训练期基线对比。建议将公平性指标接入现有监控看板,设置环比告警(如 DPD 较基线上升 30% 即触发复核),并配套数据漂移检测(如 Evidently 或自定义 PSI 计算)辅助定位漂移根因。 <p class=”para-label“>避坑清单:</p> <ul class=”dash-list"><li>fetch_adult 等内置数据集返回的 DataFrame 类型不统一,应使用 as_frame=True 并手动编码目标变量,避免 OneHotEncoder 在迭代列时报类型错误。</li><li>ExponentiatedGradient 内部会反复调用 estimator.fit,训练耗时随迭代次数线性增长,大数据集务必先在小样本上验证时间预算,或用 GridSearch 限定搜索步数。</li><li>公平性指标必须显式传入 sensitive_features,工具不会自动从特征矩阵推断敏感属性;特征列顺序调整或缺失时,分组结果会静默变化,需在评估代码中锁定敏感特征列名。</li><li>不要将 DPD 当作唯一门槛,DPD 只反映选择率差异,无法暴露误伤差异,应同时观察 EOD 与各组假阳率,才能覆盖「歧视性误判」场景。</li></ul> ## 同类工具对比 | 维度 | Fairlearn | AIF360(IBM) | Fairness Indicators(Google) | Aequitas | | --- | --- | --- | --- | --- | | 定位 | 面向 sklearn 工作流的公平性评估与缓解工具包 | IBM 全流程公平性分析框架(偏差检测—指标—缓解) | TensorFlow 模型公平性可视化评估组件 | 面向政策审计的多组公平性统计审计工具 | | 编排范式 | sklearn 风格 fit/predict,评估用 MetricFrame 一行分组 | 自定义 BinaryLabelDataset 数据包装 + 算法流水线 | 与 TFMA(TensorFlow Model Analysis)管线深度绑定 | DataFrame 输入,声明式计算多组公平性指标 | | 类型约束 | 二分类/回归,缓解侧重二分类 | 分类/回归/推荐等多任务类型 | 分类/多分类,绑定 TensorFlow 生态 | 基础二分类审计,不参与模型训练 | | 学习曲线 | 低,会 sklearn 即会用 | 中高,数据包装与转换概念多 | 中,需了解 TF/TFMA 管线 | 低,纯数据处理 | | 生态集成 | sklearn/pandas/numpy | IBM 生态,兼容多种黑盒 ML 库 | TensorFlow、TFMA、Kubeflow | pandas,输出 HTML/CSV 报告 | | 生产部署 | 轻量,可打包进 sklearn Pipeline 与模型工件 | 适合离线审计与批处理,依赖较重 | 适合 TF 服务链路,产出评估报告 | 适合不定期合规审计,非实时监控 | | License | MIT | Apache 2.0 | Apache 2.0 | BSD-3-Clause | | 适合谁 | 以 scikit-learn 为主的算法/MLOps 团队 | 研究公平性算法的团队与跨域审计项目 | TF 技术栈的模型评估团队 | 政策分析、审计与合规人员 |

岗位关联

选型建议:scikit-learn 单栈团队做模型公平性审计,首选 Fairlearn,学习成本最低且能直接嵌入现有流水线;需要研究多种缓解算法或扩展推荐、回归等任务类型,选 AIF360 更全面;若模型服务链路完全基于 TensorFlow 且已接入 TFMA,Fairness Indicators 的报表能力更匹配;仅做合规审计、不干预模型训练与部署的场景,Aequitas 的声明式多组分析最轻量。 迭代脉络:Fairlearn 自 2018 年开源以来,经历「指标先行 → 缓解算法补全 → API 规范化」三个阶段。0.8.0 引入统一的 MetricFrame 分组评估接口,取代早期碎片化的指标函数;0.9—0.10 完成顶层命名空间重构,明确 metrics / reductions / postprocessing 三大模块;0.11—0.12 转向 sklearn 新版本适配与 Python 3.12 支持(截至训练数据,可能已有更新版本)。 演进解读:Fairlearn 的迭代主线是「API 稳定性优先」,0.9 之后的版本不再增加新算法,而是持续适配 sklearn 与 Python 生态的演进。选型时可放心锁定较新版本(0.11+),旧版(0.7 及以下)的 Dashboard 等组件已移除,不应在新项目中使用。该工具无公开的模型公平性基准榜单,版本间差异主要通过 GitHub Release Notes 与文档实测确认。