AI公平性评估该怎么做:从指标选择到结果解释
AI公平性评估要回答的问题很具体:模型在不同人群上的表现是否一致,差异有多大,是否在可接受范围内。
它不是一个单独的分数,而是一套从确定分组、选指标、算差异到解释结果的流程。
如果只算一个整体准确率,通常看不出群体间的差距。
做评估前要先明确一件事:公平性没有唯一标准。
不同指标之间经常互相冲突,选哪个取决于业务场景和风险承受能力。
所以评估的第一步不是跑代码,而是把“对谁公平、在哪个环节公平、可接受差异是多少”说清楚。
先确定受保护属性和评估范围
受保护属性是指需要单独比较的群体字段,比如性别、年龄段、地区、设备类型等。
选择时要考虑两点:一是这个字段在业务上确实有区分意义,二是样本量足够支撑分组统计。
评估范围也要提前定好。
是只看离线测试集,还是覆盖线上推理;
是评估分类结果,还是评估排序和推荐。
范围不同,指标和数据的组织方式也不同。
建议先从离线测试集开始,把流程跑通再扩展到线上。
数据准备阶段要检查每个分组的样本数。
样本太少时,指标波动会很大,容易得出误导性结论。
可以设一个最小样本阈值,低于阈值的分组只做定性观察,不直接下结论。
常见公平性指标怎么选
常用的指标大致分两类:一类看结果比例,一类看预测质量。
- 人口统计均等:要求不同群体的正例预测比例接近。适合关注“谁被选中”的场景,比如资源分配、资格筛选。
- 机会均等:要求在真实正例中,不同群体的召回率接近。适合关注“该被发现的是否都被发现”的场景,比如风险识别、疾病筛查。
- 预测均等:要求不同群体的精确率接近,关注被预测为正例的人里实际为正的比例是否一致。
选择时可以先问:业务更在意漏判还是误判?
如果漏判代价高,机会均等更相关;
如果资源有限、误判成本高,预测均等更值得看。
多个指标同时计算也很常见,目的是看它们是否指向同一方向。
用分组统计算出差异
评估的核心操作是按受保护属性分组,分别计算指标,再比较组间差异。
下面是一个示意性的计算思路,具体实现可结合所用评估库完成:
# 按群体分组统计正例率和召回率
groups = df.groupby("protected_group")
for name, g in groups:
positive_rate = g["prediction"].mean()
recall = g[g["label"] == 1]["prediction"].mean()
print(name, len(g), positive_rate, recall)
计算后重点看三件事:差异的绝对大小、样本量是否足够、差异是否稳定。
差异大但样本少的分组,需要补充数据后再判断。
如果模型输出的是概率而不是二分类结果,还要先确定分类阈值。
阈值变化会直接影响各群体的正例比例,所以评估结果要注明所用阈值。
结果解释和常见误区
评估结果出来后,不要只报一个“差异为 0.1”就结束。
要说明差异出现在哪个指标、哪个群体、在什么阈值下,以及是否在业务可接受范围内。
几个常见误区值得注意。
一是把公平性当成一次性检查,模型或数据更新后没有重新评估。
二是只调整阈值来拉平比例,却没有检查召回和精确率是否被牺牲。
三是忽略样本偏差,测试集本身就不能代表目标人群时,指标再好看也有限。
公平性评估的结论应该可复查:记录数据版本、分组定义、指标公式、阈值和结果。
这样后续模型迭代时,才能判断差异是变好了还是变差了。
评估之后要做什么
如果发现明显差异,处理方向通常包括补充代表性不足的数据、调整特征、重新选择阈值,或在业务规则层面增加人工复核。
每种方式都有代价,需要结合场景权衡。
评估本身不保证模型一定公平,它的价值在于把差异暴露出来,让团队在明确条件下做判断。
先从小范围、可复查的评估做起,比追求一个笼统的公平分数更实际。