基于几何理论的稳健公平性审计:从点估计到最坏情况

基于几何理论的稳健公平性审计:从点估计到最坏情况 今天想拆一个比较理论向、但落地价值很明确的方向基于几何理论的稳健公平性审计。很多人做模型公平性审计时习惯先算一堆指标比如统计均等、机会均等、校准误差再和阈值对比。问题是这种审计结论只对眼前这份数据集成立。数据源一换、采样一变、标注里出现一些噪声结论可能就翻转。几何理论给出的思路是把公平性度量看成空间中的距离、超平面和可行区域把审计当成在可能的扰动集合上做最坏情况检验目标从“这份数据上好像公平”推进到“在合理扰动下仍然公平”。这篇文章会从概念、几何建模、最小可复现流程、参数判断、常见坑点到工程扩展完整拆一遍适合做模型评估、算法审计、AI治理和合规评估的同学参考。1. 先厘清公平性审计到底在审计什么1.1 公平性不是单一数字而是一组约束条件算法公平性之所以难第一个原因就是“公平”这个词在统计学里没有唯一答案。实际落地时我们一般先选清楚审计的是哪种公平约束常见的有下面几个统计均等Statistical Parity不同敏感分组的预测正例比例应该接近也就是 P(Ŷ1 | A0) 约等于 P(Ŷ1 | A1)。它完全不看真实标签只要求预测结果在群体间的分配均衡。机会均等Equal Opportunity真正例率在不同分组之间拉平即每个分组里“实际为正且被预测为正”的比例一致。它更关心该被捞出来的人有没有被公平地捞出来。均等化几率Equalized Odds真正例率和假正例率同时在不同分组之间拉平。比机会均等更严格因为它同时要求不误伤。校准Calibration对每个预测分数段不同分组里真实正例占比应该接近。这主要针对置信度分数而不是二分类标签。这四个指标不是互斥的很多时候要求同时满足几个但理论上又做不到全部严格满足所以审计的第一步永远是核对需求你要回答的是“预测结果是否均衡”还是“风险评分是否校准”还是“各组错误率是否一致”。指标选错后面所有数字都没有意义。1.2 为什么“在这份数据上公平”不等于“审计通过”刚接触公平审计的人最容易犯的错是拿一份测试集算完指标就下结论。比如统计均等差距是 0.03阈值是 0.1于是认为“模型通过了公平审计”。这个结论本质上是在说在这个测试集上通过。问题在于测试集只是整体分布的一次采样。采样随机性、标注噪声、上下游特征分布漂移、敏感属性记录错误都会让指标上下波动。0.03 的差距可能真实值其实是 0.11也可能其实是 0.02。没有不确定性估计的审计等于用一个随机数在做合规判断。稳健公平性审计要解决的就是这件事把“审计通过”重新定义成“在一组合理扰动下公平性指标仍然落在可接受范围内”。这也是几何理论切入的地方。2. 几何化建模把模型行为变成空间中的点、距离和边界2.1 每个群体在度量空间里是一个点几何视角的第一步是把每个敏感分组的模型行为映射成空间中的一个点。以二分类模型为例每个分组可以用一组统计量描述正样本占比、真正例率、假正例率、预测正例率、平均分数等。假设我们只关注均等化几率那么这个组就是二维空间里的一个点横坐标是真正例率纵坐标是假正例率。有两个敏感分组就得到两个点。如果同时考虑多个指标点就变成更高维空间里的向量。比如把统计均等、机会均等、校准误差都放进来那每个组就是五维或六维空间里的一个向量。这个映射本身不复杂但一旦完成以前那些靠文字描述的问题就全部变成了几何问题“两个组差多少”变成了“两个点距离多远”。“公平性约束有没有违反”变成了“这些点有没有落在禁止区域里”。“审计稳不稳健”变成了“这些点在扰动下会不会越过边界”。2.2 公平性约束可以写成超平面和可行区域每个公平性指标约束都可以写成对点坐标的线性不等式。比如统计均等要求 P(Ŷ1 | A0) 和 P(Ŷ1 | A1) 的差不超过阈值 τ。两个组的预测正例率分别是两个坐标那么“差距不超过 τ”这个约束在二维平面上就是两条平行直线围成的带状区域。点的位置落在这个带状区域内说明该约束通过落在区域外说明违反。均等化几率会稍微复杂一点因为它同时约束两个维度的差距。但在几何语言里它同样是多个线性不等式围成的凸区域。这样一来整个审计任务可以重新表述为给定一组模型行为点判断它们是否落在由公平性约束定义的可行区域内。如果不落在那超出边界多远这个“超出距离”就是通常说的公平违规程度也可以理解为不公平间隔Unfairness Margin。有一个地方需要留意不同指标对坐标的定义不同生成的可行区域形状差别很大。统计均等关心的是预测正例率校准关心的是分数与真实结果的对应关系。做几何化时千万不能把不同指标的坐标混在一起算距离否则会出现“距离很近但实际指标差异很大”的误判。2.3 几何视角真正值钱的地方在于最坏情况分析纯几何表示本身只是换了一种描述方式真正的价值在于它能支撑最坏情况分析。审计关心的不是“最好情况下模型是否公平”而是“最合理的情况下模型是否有可能不公平”。这需要在一组可能的世界里寻找最坏情况。几何语言天然适合做这件事用点的集合表示每个分组在扰动下的可能位置。用区域边界表示公平性约束的硬性上限。最坏情况就是“点集到违规区域边界的最小距离”也就是在全部可能位置里找出离公平边界最远或最接近的那个位置。这样可以把“审计要稳健”这种模糊要求变成“计算一个点到超平面的距离”这种明确问题。后面做代码实现时这个距离还可以作为审计报告里的核心风险指标。3. 稳健性定义审计不能只看点估计3.1 扰动集哪些变化会让审计结论失效要让审计结论稳健必须先定义清楚“稳健”是针对哪些扰动成立的。常见扰动来源包括采样噪声同一总体重复采样每次得到的指标估计都会不同。标注噪声部分标签被标错直接影响真正例率和假正例率。特征漂移上游特征分布随时间变化比如用户结构、地域结构、设备类型发生变化。敏感属性噪声记录中的敏感属性有缺失或错误导致分组划分不准。样本选择偏差训练数据、测试数据与实际使用数据的人群覆盖不一致。这些扰动并不都需要同时建模。先确定这次审计要防的是哪一种如果是上线前的单次评估重点通常是采样噪声和标注噪声如果是长期监控特征漂移和样本选择偏差更重要。扰动集太小审计会显得乐观扰动集太大任何模型都会在某个极端世界里被判定为不公平。所以扰动集的设计要和实际业务风险挂钩不能凭感觉随意扩大。3.2 最坏情况审计在邻域上求边界几何稳健审计的关键步骤是给每个分组的指标估计增加一个邻域也就是不确定性区域。这个邻域可以来自统计置信区间、自助法重采样或者基于物理含义的漂移范围。以统计均等为例。设分组 0 的预测正例率是 p0分组 1 的是 p1。通过自助法得到 p0 和 p1 各自的置信区间之后p0 不是单独一个数而是一个可能的取值区间。同样p1 也是一个区间。两个区间合在一起就是二维空间里的一个矩形邻域。稳健审计要问的问题是在这个矩形邻域内p0 和 p1 的差最大能到多少如果 p0 取下界、p1 取上界时差距仍然小于阈值 τ那么审计结论是稳健通过如果最坏情况下差距超过 τ就需要给出风险提示。这就是典型的最坏情况审计。它不关心“平均水平看起来怎么样”只关心“边界上最危险的位置是否安全”。3.3 审计结论的三种状态只输出“通过”和“不通过”其实不够用。我建议把审计结论分成三种状态稳健通过最坏情况下指标仍在阈值内可以放心上线。边界状态点估计在阈值内但最坏情况越过阈值。这种情况说明审计结果对采样和扰动敏感需要补充数据或进一步审查。稳健违规点估计本身已经越过阈值或者最坏情况明显越界需要进入处理流程。边界状态经常被忽略。很多团队只看点估计看到 0.08 低于阈值 0.1就认为没问题。但对应到几何视角里这个 0.08 的点的置信区间可能从 0.03 到 0.13最坏情况已经越线。这种不确定性完全应该被量化而不是被平均掉。4. 最小可复现流程从数据到审计结论4.1 前置条件与输入约定在跑任何审计之前先把输入约定固定下来。一个完整的公平审计至少需要四类数据特征数据 X模型实际使用的特征。敏感属性 A如性别、年龄段、地区等受保护属性。它不一定参与模型训练但审计时必须可用。真实标签 Y用于计算真正例率、假正例率等指标。模型预测结果可以是二分类标签 Ŷ也可以是连续分数 score。如果手头只有标签没有分数很多校准类和阈值相关的审计没法做。如果只有分数没有标签部分错误率类指标也没法算。所以审计前第一件事是盘点数据完整性。环境方面普通 Python 环境加 numpy、pandas、scipy 就够不需要高端 GPU。数据量在几万到几十万时自助法重采样几百次在普通笔记本上也能跑完。如果数据量达到千万级别就要考虑采样或并行。4.2 第一步确定审计目标和指标先回答三个问题审计哪个敏感属性用哪一类公平性约束允许的阈值是多少比如可以这样定审计年龄段属性使用均等化几率要求真正例率和假正例率的组间差距都不超过 0.1。这个定义必须在计算前写清楚并同步给相关方。否则后续所有人都在讨论不同定义下的“公平”。4.3 第二步构造扰动集最常见的实操方式是用自助法Bootstrap。抽样方法是对每个敏感分组分别做有放回抽样重复 B 次得到每个组指标的 B 个估计值。自助法的作用是把“点估计”转换成“估计分布”。对审计来说这个分布比平均点更有价值因为它直接给出了不确定性范围。如果场景中有明确的漂移风险比如上游特征分布每季度变化可以在自助法之外再加一个漂移扰动。一个简单的做法是给每个样本重新采样权重让小部分样本的权重升高、大部分降低模拟人群结构变化。不要一上来就设计复杂的对抗扰动先用自助法跑通流程再看是否需要更精细的扰动模型。4.4 第三步计算各组坐标与置信区域下面是一段很小的示例代码演示如何用自助法计算每个分组在“真正例率-假正例率”二维空间里的坐标和置信区域。import numpy as np import pandas as pd def bootstrap_group_point(y_true, y_pred, n_bootstrap500, seed42): 对单个分组计算 TPR 和 FPR 的自助法分布。 y_true, y_pred 是该分组的真实标签和预测标签。 rng np.random.default_rng(seed) n len(y_true) points [] for _ in range(n_bootstrap): idx rng.integers(0, n, sizen) yt np.asarray(y_true)[idx] yp np.asarray(y_pred)[idx] tp np.sum((yt 1) (yp 1)) fn np.sum((yt 1) (yp 0)) fp np.sum((yt 0) (yp 1)) tn np.sum((yt 0) (yp 0)) tpr tp / (tp fn) if (tp fn) 0 else np.nan fpr fp / (fp tn) if (fp tn) 0 else np.nan points.append([tpr, fpr]) points np.array(points) return points这段代码只是示例实际工程里还要处理空分组、除零、样本极少等情况。每个分组都需要单独调用得到各自的 TPR 和 FPR 自助法分布。拿到分布之后可以计算每个维度的 2.5% 分位数和 97.5% 分位数作为置信区域的边界。这个边界就是前面说的几何邻域。如果你的分组样本量只有几十条自助法分布会非常宽。这时候先别急着下结论优先看这个组的样本量是否够支撑一个可信的审计。4.5 第四步最坏情况审计判断最坏情况审计在实现上可以分两步。第一步计算逐次自助法样本之间的组间指标差。比如有两个分组 A 和 B每次自助抽样都得到一组 TPR_A 和 TPR_B那么这次抽样的机会均等差距就是 |TPR_A - TPR_B|。把这 B 个差距全部算出来得到差值的分布。第二步取差值的上侧分位数作为稳健审计的判断值。如果使用 95% 置信水平那就取所有自助法差值的 95% 分位数。这个值代表“在最坏但合理的扰动下”公平性差距可能达到多少。用它和阈值比较如果 95% 分位数小于阈值结论是稳健通过。如果中位数小于阈值但 95% 分位数大于阈值结论是边界状态。如果中位数已经大于阈值结论是稳健违规。另一种更严格的做法是求解一个线性规划在每个分组的置信区域内部寻找让指标差距最大的点。这种做法的好处是可以同时处理多个指标和多个组的组合约束坏处是理解和调试成本更高。先从自助法分位数做起达到 80% 的效果后面再按需升级。4.6 第五步输出审计报告审计报告至少应该包含以下内容敏感属性和分组定义。每个分组的基础统计量样本量、正样本率、预测正例率。每个指标的点估计和置信区间。最坏情况下的违规判断结果。涉及的扰动设计说明。阈值设定依据。报告里的关键数字要能复现。我一般会在报告里附上随机种子、自助法次数、阈值定义和版本号避免后续因为环境变化出现结论不一致。5. 关键参数与判断标准5.1 主要参数的含义和推荐起点参数含义推荐起点说明阈值 τ允许的公平性指标最大差距0.05 到 0.1具体取值依赖业务容忍度先统一口径置信水平 α审计结论的统计置信度0.05越小越严格但对样本量要求越高自助法次数 B重采样次数500 到 1000次数太少不稳定太大增加计算成本最小分组样本量每个敏感分组的样本量下限100 以上为宜太少时置信区间过宽审计失去区分度扰动集合半径模拟漂移的允许范围按实际风险场景设定不设置会导致过度自信设置过大则所有模型都难以通过这些参数没有一个绝对正确的取值需要结合数据规模、业务影响和监管要求来定。关键是过程中要把参数固定下来不要为了得出理想结论反复调整。5.2 怎么判断审计结果可信一个稳健审计结果要同时满足三个条件指标定义明确代码实现和定义一致。置信区间来自足够大量的样本而不是个位数样本。结论对主要参数不敏感。比如把阈值从 0.08 改成 0.1或者把置信水平从 95% 改成 90%结论不应当从“通过”突然变成“稳健违规”。如果发现结论对参数极其敏感说明原有数据或扰动模型承载不了这个决策不要强行下结论先补数据或重新设计扰动集。5.3 敏感度分析应该怎么做敏感度分析的常规做法是分别调整几个关键参数观察结论变化。推荐从三个维度入手阈值把允许差距从 0.05 调整到 0.15看趋势。置信水平从 95% 调整到 99%看最坏情况差距的变化幅度。抽样方案把自助法换成分层抽样或者其他重采样方法看结论是否一致。只要输出一个“参数敏感性表”把每种配置下的审计结论写清楚就能让评审方知道结论的稳定边界在哪里。这件事比增加更多指标重要得多。6. 常见坑点与排查链路6.1 指标定义不一致算出来的数字对不上不同平台、不同论文对同一个公平性指标的定义时有差异。比如统计均等有的版本用两个组预测正例率的差有的版本用比值有的版本要求同时看多个敏感属性。代码实现时稍微不注意算出来的数字和其他工具对不上。遇到数字对不上的情况先回到公式本身把分子、分母逐项列出来核对。不要急着调参数。6.2 小样本组的置信区域过大这是公平审计里最常见的现实问题。某个敏感分组样本量很小比如只有几十条自助法分布会非常宽最坏情况差距很容易超过阈值。这不是几何方法的问题而是数据本身的信息量不够。解决方案有几种对用户群体做更合理的分组避免过度细分。使用分层抽样确保重要分组有足够样本。报告中明确标注“该组样本量不足以支撑稳健结论需要补充数据”。不要为了得到一个好看的数字人为扩大该组的样本权重或缩小扰动集。6.3 扰动集设计得过大或过小扰动集半径太小审计会变成只关注点估计失去稳健性意义半径太大任何模型在最坏情况下都可能违规审计结论变成“永远不通过”。设计扰动集时应该从实际业务风险出发。比如你担心的是季度性用户结构变化那就统计过去几个季度的分布差异用真实差异做参考设定半径而不是拍脑袋选一个数。6.4 用分类标签代替预测分数很多公平性指标需要的是预测分数。比如校准类指标需要把分数分桶后比较真实正例占比。如果只用最终二分类标签就没有办法做阈值相关的公平性分析。如果你的模型输出的是分数但审计时只用了标签需要回到模型日志里把分数捞出来重新算。不要直接拿标签硬凑校准分析那会得到一份看起来合理但没有实际含义的报告。6.5 最坏情况过于悲观审计失去区分度几何稳健审计的另一个风险是过度追求“绝对稳健”结果所有模型都会被判违规。这种情况通常是因为对多个维度同时做了极端假设把最坏情况相乘而不是取合理联合边界。解决办法是给扰动设置合理的相关性假设。比如两个指标共享同一批测试样本它们的扰动必然是相关的不能假设一个取上界、另一个也同时取上界。在自助法实现里这天然是同时发生的因为每次抽样用的是同一套索引。如果你另写了独立的扰动生成器就要特别小心相关性假设。6.6 排查顺序先看数据再看扰动集最后看算法遇到审计结果异常时我一般按这个顺序排查先看数据。缺失值、异常值、敏感属性重复、分组标签错乱都会直接影响指标。再看指标定义。实现的公式和选用的公平性定义是否一致。再看扰动集。自助法次数、置信水平、漂移半径是否合理。最后看优化和几何计算。线性规划是否求解正确、边界条件有没有写反。大多数所谓“几何方法算错了”的案例最后都倒在前两步。先把数据清洗和指标定义搞定再谈复杂的稳健性分析。7. 工程落地与扩展方向7.1 与现有公平性工具结合常见的 open-source 公平性工具比如 Fairlearn、AI Fairness 360已经实现了大量指标计算和缓解算法。它们适合用来快速得到基础指标。但很多工具默认输出的是点估计不支持我们需要的“最坏情况稳健审计”。落地时可以拆成两层基础指标层用现有工具计算统计均等、机会均等、校准误差等。稳健审计层自研自助法扰动集叠加在最基础指标之上输出最坏情况判断。这样做的好处是基础层有社区维护稳健层逻辑简单可控出现问题容易定位。7.2 从单指标扩展到多指标、多敏感属性单一敏感属性、单一指标的审计只是起点。实际业务经常要求同时审计多个敏感属性甚至交叉分组比如年龄段和地区交叉后的群体。多指标和多属性组合下几何空间的维数会快速膨胀。这时候有两个建议不要试图把所有指标合成一个总分这会让审计结论失去解释力。为每个指标单独做稳健审计然后汇总成“各指标审计矩阵”保留透明性。自动化审计也要考虑这类扩展。接口设计上输入应该是“数据集加敏感属性列表加指标列表”输出是“每个指标、每个敏感属性的审计结论”。7.3 审计接口设计一个可复用的审计接口大致应该有下面这些输入输出def robust_fairness_audit( df, protected_attr, y_true_col, score_col, metrics(statistical_parity, equalized_odds), threshold0.1, bootstrap500, alpha0.05, seed42 ): 返回每个指标在每个敏感分组上的 - 点估计 - bootstrap 95% 置信区间 - 最坏情况差距 - 审计结论pass / borderline / fail # 示例返回结构化报告 report { metric: metrics, groups: sorted(df[protected_attr].unique()), conclusion: {}, details: {}, } return report写清楚这段接口的意图比实现本身更重要。审计代码要保证可复现、可追踪、可解释避免做成黑盒。7.4 什么时候用完整几何框架什么时候用简单方法不同场景需要的严谨程度不同。我建议这样划分内部快速排查、模型开发阶段用简单的方法算点估计加自助法置信区间就够。上线前正式评估、监管合规、对外发布用完整几何框架定义扰动集、计算最坏情况边界、输出敏感度分析。长期持续监控在简化版几何审计的基础上增加时间窗口和漂移检测形成定期报告。这里也可以提一个相邻领域的例子最近医学图像分割里讨论较多的 shape-intensity knowledge distillation 一类稳健训练方法本质上也是在处理模型在不同影像分布下的表现稳定性。如果需要在不同年龄段、不同采集设备的分组上做公平审计本文的几何稳健审计思路同样适用因为核心问题是一样的点估计之外还必须考虑分组分布漂移时结论是否还能成立。8. 一些个人建议如果只看一篇理论文章最容易产生两个误解一是觉得几何理论很高深必须用复杂优化器才能落地二是觉得只要算了个置信区间就算稳健审计了。实际经验是几何理论最大的价值是给了我们一套校准直觉的语言把“公平”“稳健”“违规程度”这些模糊概念变成距离、邻域和边界。落地时我会给自己定一条简单的项目基线先选一个指标用自助法算出最坏情况差距对比阈值输出三种状态中的一种。跑通这步再逐步引入漂移扰动、多指标组合和自动化接口。在这个过程里最该盯住的问题永远是三个输入数据是否可信、指标定义是否一致、扰动假设是否合理。任何一层没做好几何算法再精细审计报告也只是数字包装。真正稳健的不是某一种数学方法而是整个审计流程经得起换数据、换参数、换环境之后仍然给出稳定结论。