人口学平价要求模型对不同群体的正预测率相等,是最直观的群体公平定义,但在处理率差异真实存在时可能与预测准确性冲突,需结合具体应用场景在公平性与效用间权衡,是算法公平领域讨论的基准定义之一,在公平性方法比较中广泛使用,相关研究持续推动该领域的方法学进步。

岗位关联

需要学习群体公平Demographic Parity,人口学平价要求模型对不同群体的正预测率相等,是最直观的群体公平定义,但在处理率差异真实存在时可能与预测准确性冲突,需结合具体应用场景在公平性与效用间权衡,是算法公平领域讨论的基准定义之一,在公平性方法群体公平Demographic Parity属于AI伦理与社会影响 > 算法公平性的关键内容,掌握后可更好地衔接后续章节。

目录
  1. 可视化演示
  2. Demographic Parity 的定义与群体公平形式化条件
  3. 正预测率相等约束的统计含义与基线率问题
  4. Demographic Parity 与预测准确性的内在冲突
  5. Demographic Parity 与其他群体公平定义的比较
  6. Demographic Parity 在算法公平性中的基准地位与局限
  7. 实际 AI 系统中的 Demographic Parity 检测与权衡实践
  8. AI 应用场景
  9. Python 演示
  10. 常见问答
  11. 常见误区
  12. 参考来源

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

Demographic Parity 的定义与群体公平形式化条件

Demographic Parity(统计均等)要求模型对不同敏感群体的正预测率相等,即 P(Ŷ=1|A=0) = P(Ŷ=1|A=1),其中 A 为敏感属性(如性别、种族、年龄等)。该条件刻画了预测结果在群体层面的分布平衡,是最直观但非唯一的群体公平定义。

敏感属性指可能引发歧视的受保护特征,包括性别、种族、年龄、宗教信仰等,其划分依据法律法规与社会公平共识。公平性审计通常围绕这些属性分组统计模型行为。

用统计均等条件下的正预测比例定义群体公平,关注预测结果的分布平衡而非预测的正确性。满足 Demographic Parity 意味着各群体获得正预测的概率相同,是一种独立于真实标签的结果公平约束,不要求预测本身准确。

正预测率相等约束的统计含义与基线率问题

基线率指群体中真实正例的比例,即 P(Y=1|A=a),反映不同群体真实结果的分布差异。它与正预测率 P(Ŷ=1|A=a) 是不同的统计量,前者描述真实标签分布,后者描述模型输出分布。

群体间基线率差异在现实中普遍存在,例如不同族裔的贷款违约率、不同性别的某岗位胜任比例等,这种差异源于社会经济、历史、文化等多重因素,并非一定由模型偏见造成。

强行均等正预测率会扭曲真实风险刻画:当基线率不同时,要求预测分布均等可能导致对高基线率群体的预测偏低、对低基线率群体预测偏高,使预测偏离真实分布。基线率差异正是公平性与准确性冲突的根源,任何仅约束预测分布的公平准则都难以同时兼顾准确刻画。

Demographic Parity 与预测准确性的内在冲突

满足公平约束常以牺牲准确性为代价,因为强制正预测率相等会偏离最优预测策略,增加总体预测误差。当群体基线率差异越大,这种冲突越显著。

高基线率群体(真实正例多)在强制拉平后会出现更多假阴性,即真实正例被错误预测为负例,错过应获机会的个体;低基线率群体(真实正例少)在强制拉平后会出现更多假阳性,即真实负例被错误预测为正例,造成误判与资源错配。

准确性与公平性之间存在帕累托权衡空间:在不显著损害准确性的前提下可改善公平性,但无法在不付出代价的情况下同时最优化两者。实践需要在帕累托前沿上根据业务可接受度选择权衡点。

Demographic Parity 与其他群体公平定义的比较

Equal Opportunity(机会均等)只约束真实正例侧相等,即 P(Ŷ=1|Y=1, A=0) = P(Ŷ=1|Y=1, A=1),关注真正例率(TPR)的一致性,确保各群体中真实正例被正确识别的概率相同。

Equalized Odds(均等赔率)约束正例与负例两侧都相等,即同时要求真正例率与假正例率在群体间一致,条件更严格,既保证正例识别公平也约束负例误判。

Demographic Parity 只看预测分布不看真实标签,即 P(Ŷ=1|A=0) = P(Ŷ=1|A=1),是无条件公平。三者形成由条件到无条件的公平谱系:Demographic Parity 最宽松(无条件),Equal Opportunity 居中(条件于正例),Equalized Odds 最严格(条件于正负两侧)。

Demographic Parity 在算法公平性中的基准地位与局限

因定义简洁、易于计算,Demographic Parity 被广泛用作公平比较的基准指标,在学术论文与工业实践中常作为公平性评估的第一步。它只需要预测标签与敏感属性,无需真实标签即可计算,部署成本低。

忽略真实标签是其主要局限:仅凭预测分布无法判断预测是否准确,可能掩盖模型对某些群体系统性预测错误的问题。一个满足 DP 的模型可能同时对某群体产生大量错误预测。

可能掩盖群体内部个体差异:群体层面统计均等不代表群体内每个子群或个体都得到公平对待,存在“平均掩盖不均”的风险。此外,代理变量下公平约束易被规避——当模型不直接使用敏感属性时,可通过邮编、姓名、学校等代理变量间接还原敏感信息,绕过形式上的公平约束。

实际 AI 系统中的 Demographic Parity 检测与权衡实践

上线前按敏感属性分组统计正预测率差异,计算各群体正预测率及其差异比,作为公平性评估的基础指标。常用判定标准包括差异阈值(如不超过 4-5 个百分点)与 80% 规则(四分之五规则)。

差异超过预设阈值时触发再训练或后处理校准:再训练通过修改目标函数加入公平约束从源头优化,后处理通过调整各群体决策阈值实现,无需重训练、部署成本更低。

须量化公平改善与业务指标损失之间的权衡,记录准确率、召回率等核心指标的变化,确保公平改善不以不可接受的业务损失为代价。决策依据须完整记录以应对合规审计,包括公平指标数值、阈值选择理由、权衡取舍过程,满足反歧视法规与内部治理要求。

AI 应用场景

信贷模型的群体公平性审计

阶段:模型部署阶段

解决的问题:信贷模型在敏感群体间贷款批准率差异过大,违反 Demographic Parity 约束,存在歧视风险与合规隐患

具体案例:某银行信贷模型上线前,公平性审计模块按种族与性别分组统计贷款批准率,发现某少数族裔批准率比主流群体低 18 个百分点,违反 Demographic Parity;团队采用后处理阈值校准将该差异压到 5 个百分点内,同时记录整体准确率下降 2.3 个百分点的权衡数据,供合规审计使用。

招聘筛选模型的公平约束优化

阶段:模型训练阶段

解决的问题:简历筛选模型在性别维度上通过初筛比例差异过大,存在性别歧视风险

具体案例:一家科技公司简历筛选模型在目标函数中加入群体公平正则项,要求男女候选人通过初筛的比例差不超过 3 个百分点;训练后女性通过率从 22% 提升到 28%,接近男性 30% 的水平,在可控准确率损失下显著改善群体公平。

Python 演示

python93 行
import numpy as npfrom sklearn.metrics import accuracy_score  def demographic_parity_rate(y_pred, group):    """计算各敏感群体的正预测率 P(Y_hat=1 | A=a)"""    groups = np.unique(group)    rates = {}    for g in groups:        mask = group == g        rates[g] = y_pred[mask].mean()    return rates  def detect_violation(rates, threshold=0.05, use_four_fifths=True):    """检测是否违反 Demographic Parity(阈值检测 + 80% 规则)"""    vals = list(rates.values())    max_rate, min_rate = max(vals), min(vals)    diff = max_rate - min_rate    violations = {"rate_diff": diff}    violations["threshold_violation"] = diff > threshold    if use_four_fifths and min_rate > 0:        ratio = min_rate / max_rate        violations["four_fifths_ratio"] = ratio        violations["four_fifths_violation"] = ratio < 0.8    return violations  def threshold_calibration(y_score, group, thresholds):    """后处理阈值校准:按群体设置不同决策阈值"""    y_pred = np.zeros_like(y_score, dtype=int)    for g, t in thresholds.items():        mask = group == g        y_pred[mask] = (y_score[mask] >= t).astype(int)    return y_pred  def find_fair_thresholds(y_score, y_true, group, target_diff=0.03):    """搜索使群体差异满足目标且准确率最高的后处理阈值"""    groups = sorted(np.unique(group))    grid = np.arange(20, 80, 2)    cand_a = np.percentile(y_score[group == groups[0]], grid)    cand_b = np.percentile(y_score[group == groups[1]], grid)    best = None    for t0 in cand_a:        for t1 in cand_b:            thresholds = {groups[0]: t0, groups[1]: t1}            y_pred = threshold_calibration(y_score, group, thresholds)            rates = demographic_parity_rate(y_pred, group)            diff = max(rates.values()) - min(rates.values())            acc = accuracy_score(y_true, y_pred)            if diff <= target_diff:                if best is None or acc > best["accuracy"]:                    best = {"thresholds": thresholds, "accuracy": acc, "diff": diff, "rates": rates}    if best is None:        best = {"thresholds": {groups[0]: 0.5, groups[1]: 0.5}, "accuracy": 0.0, "diff": 1.0, "rates": {}}    return best  def evaluate_tradeoff(y_true, y_pred_before, y_pred_after, group):    """量化公平改善与准确性损失权衡"""    before_rates = demographic_parity_rate(y_pred_before, group)    after_rates = demographic_parity_rate(y_pred_after, group)    before_diff = max(before_rates.values()) - min(before_rates.values())    after_diff = max(after_rates.values()) - min(after_rates.values())    return {        "fairness_gain": before_diff - after_diff,        "accuracy_loss": accuracy_score(y_true, y_pred_before) - accuracy_score(y_true, y_pred_after),        "before_diff": before_diff,        "after_diff": after_diff,        "before_rates": before_rates,        "after_rates": after_rates,    }  if __name__ == "__main__":    np.random.seed(42)    n = 2000    group = np.random.choice([0, 1], size=n, p=[0.6, 0.4])    y_true = (np.random.rand(n) < (0.5 + 0.2 * group)).astype(int)    y_score = y_true * 0.6 + np.random.rand(n) * 0.4 + 0.1 * group    y_pred_before = (y_score >= 0.5).astype(int)     rates = demographic_parity_rate(y_pred_before, group)    violations = detect_violation(rates)    best = find_fair_thresholds(y_score, y_true, group)    y_pred_after = threshold_calibration(y_score, group, best["thresholds"])    tradeoff = evaluate_tradeoff(y_true, y_pred_before, y_pred_after, group)     print("原始正预测率:", rates)    print("违规检测:", violations)    print("校准后阈值:", best["thresholds"])    print("权衡评估:", tradeoff)
目的:实现 Demographic Parity 的检测与后处理阈值校准全流程:计算各群体正预测率、用阈值检测与 80% 规则判定违规、搜索满足公平约束的最优阈值、并量化公平改善与准确性损失的权衡。
  1. rates[g] = y_pred[mask].mean()对每个敏感群体计算预测为正的比例,即正预测率 P(Ŷ=1|A=a),是 Demographic Parity 的核心统计量。
  2. diff = max_rate - min_rate计算群体间正预测率的最大差值,作为衡量公平性偏离程度的指标,差值越大越不公平。
  3. violations["threshold_violation"] = diff > threshold阈值检测:当群体间正预测率差值超过预设阈值(默认 5 个百分点)时判定违反 Demographic Parity。
  4. ratio = min_rate / max_rate计算最小群体与最大群体正预测率之比,用于 80% 规则(四分之五规则)判定。
  5. violations["four_fifths_violation"] = ratio < 0.880% 规则:当比值低于 0.8 时判定违反 Demographic Parity,该规则源自就业公平的统一遴选程序指南。
  6. y_pred[mask] = (y_score[mask] >= t).astype(int)按群体各自阈值对预测分数二值化,实现后处理阈值校准,不改变模型本身只改决策边界。
  7. if diff <= target_diff:判断当前阈值组合是否使群体正预测率差异满足目标约束(默认 3 个百分点)。
  8. if best is None or acc > best["accuracy"]:在所有满足公平约束的候选阈值中,选取准确率最高的一组,体现公平与准确的帕累托权衡。
  9. "fairness_gain": before_diff - after_diff,公平改善量等于校准前后群体差值的减少量,数值越大表示公平性提升越多。
  10. "accuracy_loss": accuracy_score(y_true, y_pred_before) - accuracy_score(y_true, y_pred_after),准确性损失为校准前后准确率之差,用于评估公平改善所付出的业务代价。
  11. y_score = y_true * 0.6 + np.random.rand(n) * 0.4 + 0.1 * group构造带群体偏移的预测分数,模拟现实中不同群体基线率与模型输出存在差异的不公平场景。

常见问答

Demographic Parity 要求什么条件在敏感群体间相等?
要求不同敏感群体的正预测率相等,即 P(Ŷ=1|A=a) 在各群体间相同,它约束的是模型预测结果的分布而非真实标签的分布。
什么是基线率,为什么它会导致公平性与准确性冲突?
基线率是群体真实正例比例 P(Y=1|A=a)。当群体间基线率不同时,强制正预测率相等会扭曲真实风险刻画,使高基线率群体假阴性增加、低基线率群体假阳性增加,从而导致准确率下降。
80% 规则(四分之五规则)如何判断是否违反 Demographic Parity?
当最小群体正预测率与最大群体正预测率之比低于 0.8 时,判定为违反 Demographic Parity。该规则源自美国 EEOC 的统一遴选程序指南,是就业与算法公平中常用的判定标准。
Demographic Parity 与 Equal Opportunity 的主要区别是什么?
Demographic Parity 约束无条件正预测率相等 P(Ŷ=1|A) 相等;Equal Opportunity 约束条件于真实正例的正预测率(真正例率 TPR)相等 P(Ŷ=1|Y=1,A) 相等。前者不看真实标签,后者只看真实正例侧。
为什么即使不使用敏感属性作为输入特征,模型仍可能违反 Demographic Parity?
模型可能通过邮编、姓名、学校、消费习惯等代理变量间接还原敏感信息,导致代理歧视。删除敏感特征并不能消除特征间的相关性,模型仍可能学到与敏感属性高度相关的模式。
后处理阈值校准如何改善群体公平?
后处理阈值校准为不同群体设置不同决策阈值,调整各群体正预测率使其趋于均等。它无需重训练模型、部署成本低,但需量化准确率损失,且对不同群体使用不同阈值可能引发个体公平与差别对待的合规争议。

常见误区

误区认为满足 Demographic Parity 就等于模型完全公平无歧视。

正解Demographic Parity 只保证群体间正预测率相等这一种统计公平,不保证机会均等、预测校准或个体公平。一个满足 DP 的模型仍可能对某群体系统性预测错误或在个体层面存在差别对待。

为何常见:Demographic Parity 是最直观、最常被提及的公平定义,容易让人误以为它是公平的全部,忽视了公平是一个多维度、可能相互冲突的概念。

误区认为不同群体真实正例比例基线率本来就相等,模型差异纯属偏见。

正解现实中基线率常真实存在差异,源于社会经济、历史、文化等多重因素。盲目拉平正预测率会扭曲真实风险刻画,导致对高基线率群体预测偏低、低基线率群体预测偏高。

为何常见:人们倾向假设各群体本质相似,忽视客观存在的分布差异,将所有预测差异都归因于模型偏见。

误区认为 Demographic Parity 要求正预测率绝对相等,差一点都算违反。

正解实践中以容忍阈值衡量,例如差异不超过 4 个百分点或满足 80% 规则即可接受。绝对相等在统计估计中既不现实也无意义,需要考虑抽样波动与业务容忍度。

为何常见:定义形式上写的是“相等”,容易被字面理解为严格相等,忽视了实际工程中的容错与统计不确定性。

误区认为只要不使用敏感属性作为输入特征,模型就自动满足 Demographic Parity。

正解模型可能通过邮编、姓名、学校、消费习惯等代理变量间接还原敏感信息,导致代理歧视。删除敏感特征不能消除特征间的相关性,反而可能让模型更依赖代理变量。

为何常见:直观认为不用敏感特征就不会歧视,忽视了高维特征空间中特征相关性的隐蔽性,这是“色盲”公平观的典型误区。

参考来源