10.2 公平性指标与分组评估:先问哪种错误伤害谁
模型总体准确率 91%,北部区域只有 82%。这值得调查,却不能直接套用“差异超过 5% 就不公平”:样本量、标签质量、基准率和错误后果都未知。公平性不是一个脱离场景的统一公式。
本课目标
- 按群体分解预测、标签和错误率;
- 区分 demographic parity、equal opportunity、equalized odds 与 calibration;
- 用置信区间和交叉群体避免小样本误判;
- 把指标差异连接到可执行的缓解措施。
1. 准确率会隐藏哪类错误
对二元决策,先报告每组混淆矩阵:
- true positive rate:真实正例中被识别的比例;
- false negative rate:真实正例被漏掉的比例;
- false positive rate:真实负例被误报的比例;
- precision:预测正例中真正为正的比例;
- selection rate:被判为正的总体比例;
- calibration:相同风险分数是否对应相近实际发生率。
若模型决定谁得到紧缺支援,漏报和误报伤害不同;若用于惩罚,错误阳性的代价可能更高。指标选择应从决策和伤害路径推出。
2. 常见公平性目标回答不同问题
Demographic parity
各群体获得正向决定的比例相同。它关注分配结果,但可能忽略真实需求或历史标签差异。
这里的“正向”指决策编码为 1,不自动等于对当事人有利。用于纪律审查时,预测正例可能表示被调查,应先统一标签和动作含义。
Equal opportunity
各群体 true positive rate 相同。它关注有资格/有需求者能否同样被识别。
Equalized odds
各群体的 true positive rate 与 false positive rate 都相同。约束更强,可能需要改变阈值或模型。
Calibration within groups
同样预测分数在各群体对应相近实际发生率。例如校准后的 0.2 分,应在足够多的相应样本中约有 20% 正例。它适合风险沟通,但标签带偏时,校准仍会复现标签偏差。
公平目标之间可能存在约束冲突,但必须说明比较的是分数校准、阈值后的错误率还是预测正例精度,不能笼统说“公平不可能”。Hardt 等 定义了 equalized odds 与 equal opportunity;Kleinberg 等 给出了风险分数校准与两类平均分数平衡的相容性条件。
3. 分组评估的最小表
import numpy as np
import pandas as pd
from scipy.stats import binomtest
from sklearn.metrics import confusion_matrix
def from_counts(region, tn, fp, fn, tp):
pairs = [(0, 0)] * tn + [(0, 1)] * fp + [(1, 0)] * fn + [(1, 1)] * tp
return pd.DataFrame(pairs, columns=["y_true", "y_pred"]).assign(region=region)
evaluations = pd.concat([
from_counts("A", 64, 16, 4, 16),
from_counts("B", 16, 4, 16, 64),
from_counts("no_positives", 4, 1, 0, 0),
from_counts("no_selected", 2, 0, 3, 0),
], ignore_index=True)
def ratio(numerator, denominator):
return numerator / denominator if denominator else np.nan
def group_metrics(part):
if not part[["y_true", "y_pred"]].isin([0, 1]).all().all():
raise ValueError("binary nonmissing labels and predictions required")
tn, fp, fn, tp = confusion_matrix(part["y_true"], part["y_pred"], labels=[0, 1]).ravel()
positive_n = int(tp + fn)
ci = binomtest(int(tp), positive_n).proportion_ci(method="wilson") if positive_n else None
return {"n": len(part), "tn": tn, "fp": fp, "fn": fn, "tp": tp,
"label_rate": ratio(tp + fn, len(part)),
"selection_rate": ratio(tp + fp, len(part)),
"tpr": ratio(tp, tp + fn), "fpr": ratio(fp, fp + tn),
"precision": ratio(tp, tp + fp),
"tpr_low": ci.low if ci else np.nan, "tpr_high": ci.high if ci else np.nan}
report = pd.DataFrame.from_dict({
region: group_metrics(part)
for region, part in evaluations.groupby("region", dropna=False)
}, orient="index")
print(report.loc[["A", "B"], ["tpr", "fpr", "selection_rate", "precision"]].round(6))
# tpr fpr selection_rate precision
# A 0.8 0.2 0.32 0.500000
# B 0.8 0.2 0.68 0.941176
assert pd.isna(report.loc["no_positives", "tpr"])
assert pd.isna(report.loc["no_selected", "precision"])本例使用 pandas、scikit-learn 和 SciPy,保留混淆矩阵原始计数。没有真实正例时 TPR 无定义,没有预测正例时 precision 无定义;把分母替换成 1 会悄悄把“无法评估”写成“表现为零”。未观测到某群体也不是证明该群体不存在。
两组 TPR 都为 0.8、FPR 都为 0.2,已满足这个样本上的 equalized odds,但正例基准率为 0.2 与 0.8,选中率为 0.32 与 0.68,precision 为 0.5 与约 0.9412。由
4. 交叉群体与小样本
只分别看地区、年龄或设备,会漏掉“北部区域 × 旧设备 × 夜班”等交叉群体。切得越细,样本越少、区间越宽,还增加多重比较风险。
上例 TPR 点估计相同,但 A 只有 20 个真实正例,B 有 80 个,A 的 Wilson 区间更宽。区间按组内独立二项观测计算;若一人多条记录或按站点采样,需要按独立单位处理相关性。空分母不能做 bootstrap,反复细分的区间也不是同时覆盖保证。
可采用:
- 预先确定高风险交叉群体;
- 报告原始计数和区间,不只排名;
- 使用分层模型/部分汇聚提高稳定性;
- 合并群体时保留伤害语义,避免把稀有群体消失在“其他”;
- 将小样本视为补充数据与谨慎部署信号。
没有通用“5% 差异线”。阈值应结合效应量、统计不确定性、法律政策、伤害严重性和可接受风险制定。
5. 标签可能不是公正真相
若标签是“曾被纪律处分”,它同时受行为、被检查概率、报告渠道和管理者判断影响。模型对标签预测准确,不等于对真实行为公平。
审查:
- 标签定义在群体间是否一致;
- 谁更可能被观察、上报或确认;
- 标签延迟与缺失是否不同;
- 历史决策是否决定了获得标签的机会;
- 是否有更接近目标构念的替代测量。
群体指标差异可能来自模型、数据、阈值、流程或真实环境差异,修复措施也因此不同。
6. 敏感属性不能简单删除
删除地区、性别等字段,不会删除其他特征中的代理信息,也无法进行分组审计。另一方面,收集敏感属性本身有隐私和安全风险。
应区分:
- 是否允许用于模型训练/决策;
- 是否在受控环境中仅用于评估;
- 由谁访问、以何种粒度保留;
- 缺失、自报、多重身份和变化如何表示。
这个决定需要领域、法律、隐私与受影响者共同参与,不能靠“fairness through unawareness”。
7. 缓解策略要对准原因
- 覆盖不足:改善采集或缩小适用范围;
- 测量误差:修复设备与标签流程;
- 阈值造成不同伤害:在合规且有正当理由时重新设计决策规则;
- 模型欠拟合某群体:改善表示、损失或模型,但独立验证;
- 决策本身不当:取消自动化或改变资源规则;
- 反馈循环:保留不受模型影响的测量渠道或探索样本。
强行让一个指标相等可能恶化另一个指标或总体福利。每项缓解都要重新评估性能、群体影响、可解释性和长期行为。
8. 一份可审阅的公平性报告
决策用途、受影响者与伤害优先级
群体定义、数据来源与覆盖限制
各组样本量、标签率、预测率和混淆矩阵
效应差/比值及不确定区间
交叉群体和时间切片
标签与测量有效性
所选公平目标及未选择目标的理由
缓解前后权衡、残余风险和负责人常见误区
- 准确率差小于某阈值就公平:没有脱离场景的通用差异线。
- 让 selection rate 相同即可:它只是一个可能目标。
- 删除敏感属性便没有歧视:代理变量和流程仍在。
- 小群体指标波动,所以忽略:不确定性应促使谨慎与补充证据。
练习
- 为资源支援和纪律审查分别选择主要错误指标并解释理由。
- 计算四个群体的混淆矩阵、分子分母和 bootstrap 区间。
- 加入设备世代做交叉群体分析,找出总体均值隐藏的问题。
- 对一个差异分别提出数据、模型、阈值和流程层修复,并比较副作用。
小结
公平性评估不是寻找一个漂亮总分,而是把不同群体面对的决定、错误和不确定性摊开。指标只有连接到伤害与处置,才是治理工具。
下一课讨论上线后的权力边界:解释、人工复核、申诉、监控和事故响应要构成真正可执行的控制系统。