AI偏见检测配置:在推理接口里加一层群体公平评估
AI 偏见检测配置的核心不是训练一个新模型,而是在现有预测流程中插入一个可重复执行的公平性评估环节。
它适合已经有分类模型、需要按性别、年龄或地区等群体检查结果差异的场景。
配置完成后,每次推理或批量评分都能输出群体指标,方便判断是否超过预设阈值。
先确定检测对象和敏感字段
偏见检测首先要明确“对谁公平”。
常见敏感字段包括性别、年龄段、地区、残障状态等。
这些字段不一定在模型输入里,但需要在评估时关联到每条预测记录。
准备两样东西:
- 一份带标签的评估数据集,至少包含真实结果和敏感字段。
- 一个可调用的预测函数或接口,输入特征后返回类别或概率。
如果敏感字段涉及个人隐私,评估数据应做脱敏或聚合处理,不要在日志里明文记录。
选择指标并设定可接受阈值
群体公平没有唯一指标。
常用的是人口统计 parity(不同群体正例率接近)和 equalized odds(不同群体真阳率、假阳率接近)。
选择哪个取决于业务:信贷审批更关注不同群体的通过率差异,医疗筛查更关注漏诊率差异。
阈值不要拍脑袋。
先跑一遍基线评估,记录各群体指标,再结合业务容忍度设定。
例如要求两个群体正例率差值不超过 0.1。
这个数值需要和业务方确认,不能直接照搬。
用 Fairlearn 跑一次基线评估
以下示例假设已有 scikit-learn 模型和 pandas 数据框。
安装依赖:
pip install fairlearn scikit-learn pandas
评估代码示例:
import pandas as pd
from fairlearn.metrics import MetricFrame, selection_rate
from sklearn.metrics import accuracy_score
# y_true: 真实标签, y_pred: 模型预测, sensitive: 敏感字段
df = pd.read_csv("eval_data.csv")
y_true = df["label"]
y_pred = model.predict(df[features])
sensitive = df["gender"]
mf = MetricFrame(
metrics={"selection_rate": selection_rate, "accuracy": accuracy_score},
y_true=y_true,
y_pred=y_pred,
sensitive_features=sensitive
)
print(mf.by_group)
运行后查看 by_group 输出。
如果某个群体的 selection_rate 明显偏离其他群体,就需要调整模型或后处理。
Fairlearn 也提供 ThresholdOptimizer 做后处理,但会改变预测结果,需要重新验证业务指标。
把评估接入推理接口
生产环境不建议每次请求都跑完整评估,而是按批次或定时任务执行。
可以在推理服务旁挂一个评估脚本,定期拉取最近预测记录和真实标签,计算群体指标并写入监控表。
配置要点:
- 评估任务使用独立数据库只读账号,避免影响线上库。
- 敏感字段单独存储,访问权限最小化。
- 阈值配置放在环境变量或配置中心,不硬编码在脚本里。
- 指标异常时触发告警,告警内容包含群体名称、指标值和阈值。
如果使用 FastAPI 等框架,可以增加一个内部接口 /fairness-report,只返回聚合指标,不暴露个体数据。
验证配置是否生效
配置完成后做三项检查:
- 用一份已知存在偏差的测试数据跑评估脚本,确认能报出差异。
- 修改阈值配置,确认告警触发条件随之变化。
- 检查日志中是否包含敏感字段明文,如有则调整脱敏逻辑。
不要只看脚本退出码。
打开输出文件或监控面板,确认各群体指标确实被记录,且时间戳和批次对应。
容易忽略的边界
偏见检测只能反映评估数据中的群体差异,不能证明模型在所有场景公平。
敏感字段本身可能有缺失或错误分类,需要先做数据质量检查。
另外,调整阈值降低差异可能牺牲整体准确率,需要业务方共同决策。
如果评估数据量很小,群体指标波动大,建议扩大样本或延长观察周期再下结论。