Python之aequitas-lite包语法、参数和实际应用案例
aequitas-lite 是一款轻量级Python工具包,专注于机器学习模型的公平性(Fairness)快速评估。作为 aequitas-lib 的简化版本,它剥离了复杂的可视化依赖和高级分析功能,仅保留核心公平性指标计算能力,具有轻量、快速、易集成的特点。
Python包 aequitas-lite 详解
一、功能概述
aequitas-lite 是一款轻量级Python工具包,专注于机器学习模型的公平性(Fairness)快速评估。作为 aequitas-lib 的简化版本,它剥离了复杂的可视化依赖和高级分析功能,仅保留核心公平性指标计算能力,具有轻量、快速、易集成的特点。主要功能包括:
- 计算基础群体公平性指标(如Disparate Impact、Statistical Parity、Equal Opportunity等)。
- 支持分类模型和回归模型的公平性评估。
- 仅依赖
pandas和numpy,适合资源受限环境(如边缘设备、生产流水线)。
二、安装方法
aequitas-lite 可通过PyPI直接安装,支持Python 3.6及以上版本:
pip install aequitas-lite
安装后自动依赖 pandas>=1.0.0 和 numpy>=1.18.0,无需额外安装其他库,体积小巧(约500KB)。
三、核心语法与参数
aequitas-lite 的核心逻辑围绕 FairnessCalculator 类展开,API设计简洁,主要步骤为:初始化计算器→输入数据→计算指标。
1. 核心类:FairnessCalculator
用于定义公平性评估的上下文,需指定敏感属性(如性别、种族等可能导致偏见的特征)。
初始化参数:
sensitive_attributes(list):敏感属性列名列表(如['gender', 'race']),必填。
2. 核心方法
| 方法 | 功能 | 关键参数 |
|---|---|---|
calculate(df, score_col, label_col, metrics) |
计算分类模型的公平性指标 | - df:包含敏感属性、预测结果、真实标签的DataFrame- score_col:预测结果列名(分类标签或概率)- label_col:真实标签列名- metrics:需计算的指标列表(默认包含基础指标) |
calculate_regression(df, score_col, label_col, metric) |
计算回归模型的公平性指标(如误差差异) | - 同 calculate,但 metric 为单个回归指标(如 'mae_difference') |
aggregate_results(results_list) |
合并分块计算的结果 | - results_list:分块计算得到的结果列表 |
3. 支持的公平性指标
| 类型 | 指标名称 | 含义 |
|---|---|---|
| 分类模型 | disparate_impact |
受保护群体选择率 / 优势群体选择率(理想值=1) |
| 分类模型 | statistical_parity |
不同群体的正预测率差异(理想值=0) |
| 分类模型 | equal_opportunity |
不同群体的真阳性率(TPR)差异(理想值=0) |
| 分类模型 | equalized_odds |
不同群体的假阳性率(FPR)差异(理想值=0) |
| 回归模型 | mae_difference |
不同群体的平均绝对误差(MAE)差异 |
| 回归模型 | mse_difference |
不同群体的均方误差(MSE)差异 |
四、8个实际应用案例
案例1:检测信贷审批模型的性别偏见(Disparate Impact)
评估模型在男性和女性群体中的审批率差异。
import pandas as pd
from aequitas_lite import FairnessCalculator
# 数据:性别(敏感属性)、模型预测结果(1=通过,0=拒绝)、真实标签(是否违约)
data = pd.DataFrame({
'gender': ['male', 'female', 'male', 'female', 'male', 'female', 'male', 'female'],
'pred_approved': [1, 0, 1, 0, 1, 0, 0, 0], # 模型预测是否通过
'true_default': [0, 1, 0, 0, 1, 1, 0, 1] # 真实是否违约
})
# 初始化计算器,指定敏感属性为性别
fc = FairnessCalculator(sensitive_attributes=['gender'])
# 计算Disparate Impact(男性审批率 / 女性审批率)
result = fc.calculate(
df=data,
score_col='pred_approved',
label_col='true_default',
metrics=['disparate_impact']
)
print("性别公平性结果:", result['disparate_impact'])
# 输出示例:{'male': 3/4, 'female': 0/4, 'ratio': 3.0}(男性审批率是女性的3倍,存在偏见)
案例2:多敏感属性的公平性分析(种族+年龄)
同时评估模型在“种族”和“年龄组”两个维度的偏见。
# 扩展数据:增加种族和年龄组
data['race'] = ['white', 'black', 'white', 'black', 'white', 'black', 'white', 'black']
data['age_group'] = ['18-30', '18-30', '31-50', '31-50', '18-30', '18-30', '31-50', '31-50']
# 评估种族和年龄组的Statistical Parity(正预测率差异)
fc = FairnessCalculator(sensitive_attributes=['race', 'age_group'])
result = fc.calculate(
df=data,
score_col='pred_approved',
label_col='true_default',
metrics=['statistical_parity']
)
# 打印不同群体的正预测率差异
print("种族公平性:", result['statistical_parity']['race'])
print("年龄组公平性:", result['statistical_parity']['age_group'])
案例3:回归模型的公平性评估(房价预测)
分析房价预测模型在不同区域的误差差异。
# 回归数据:区域、预测房价、实际房价
reg_data = pd.DataFrame({
'region': ['urban', 'rural', 'urban', 'rural', 'urban', 'rural'],
'pred_price': [500, 300, 550, 280, 480, 320], # 预测房价(万元)
'actual_price': [490, 310, 540, 290, 470, 330] # 实际房价(万元)
})
# 计算不同区域的MAE差异
fc = FairnessCalculator(sensitive_attributes=['region'])
result = fc.calculate_regression(
df=reg_data,
score_col='pred_price',
label_col='actual_price',
metric='mae_difference'
)
print("区域间MAE差异:", result['mae_difference'])
# 输出示例:{'urban': 10, 'rural': 10, 'difference': 0}(误差相同,公平)
案例4:分块处理大型数据集
对百万级样本的CSV文件分块计算公平性指标,避免内存溢出。
# 读取大型CSV文件(分块处理)
chunk_iter = pd.read_csv('large_credit_data.csv', chunksize=10000) # 每块10000行
fc = FairnessCalculator(sensitive_attributes=['gender'])
# 累积分块结果
all_results = []
for chunk in chunk_iter:
# 计算当前块的公平性指标
chunk_result = fc.calculate(
df=chunk,
score_col='pred_approved',
label_col='true_default',
metrics=['disparate_impact']
)
all_results.append(chunk_result)
# 合并所有分块结果
final_result = fc.aggregate_results(all_results)
print("整体数据集的Disparate Impact:", final_result['disparate_impact'])
案例5:生产环境实时公平性审计
在模型预测流水线中嵌入公平性检查,实时监控偏见。
def model_predict_with_audit(model, input_data):
# 模型预测
input_data['prediction'] = model.predict(input_data)
# 实时公平性审计(检查种族偏见)
fc = FairnessCalculator(sensitive_attributes=['race'])
audit_result = fc.calculate(
df=input_data,
score_col='prediction',
label_col='true_label',
metrics=['disparate_impact']
)
# 若偏见超标(Disparate Impact > 1.2或<0.8),触发警报
di_ratio = audit_result['disparate_impact']['ratio']
if not (0.8 <= di_ratio <= 1.2):
print(f"警报:种族偏见超标!Disparate Impact = {di_ratio:.2f}")
return input_data['prediction']
案例6:对比两个模型的公平性
比较两个招聘模型在“学历”维度的公平性。
# 数据包含两个模型的预测结果
data = pd.DataFrame({
'education': ['high_school', 'college', 'high_school', 'college'],
'model_a_pred': [0, 1, 0, 1], # 模型A预测是否录用
'model_b_pred': [1, 1, 0, 1], # 模型B预测是否录用
'true_performance': [1, 1, 0, 1] # 真实工作表现
})
# 评估模型A
fc_a = FairnessCalculator(sensitive_attributes=['education'])
result_a = fc_a.calculate(
df=data,
score_col='model_a_pred',
label_col='true_performance',
metrics=['equal_opportunity'] # 关注真阳性率(TPR)差异
)
# 评估模型B
fc_b = FairnessCalculator(sensitive_attributes=['education'])
result_b = fc_b.calculate(
df=data,
score_col='model_b_pred',
label_col='true_performance',
metrics=['equal_opportunity']
)
print("模型A的Equal Opportunity差异:", result_a['equal_opportunity'])
print("模型B的Equal Opportunity差异:", result_b['equal_opportunity'])
# 结果示例:模型B的TPR差异更小,公平性更优
案例7:自定义公平性阈值检查
根据业务需求定义公平性标准(如Disparate Impact需在0.9-1.1之间)。
def check_fairness(result, metric='disparate_impact', lower=0.9, upper=1.1):
"""检查指标是否在自定义公平阈值内"""
ratio = result[metric]['ratio']
return lower <= ratio <= upper
# 计算指标
result = fc.calculate(data, 'pred_approved', 'true_default', metrics=['disparate_impact'])
# 检查公平性
if check_fairness(result):
print("模型通过公平性审核")
else:
print("模型未通过公平性审核,需优化")
案例8:导出公平性结果为JSON日志
将评估结果保存为JSON,用于后续分析或合规报告。
import json
# 计算公平性指标
result = fc.calculate(data, 'pred_approved', 'true_default')
# 导出为JSON
with open('fairness_audit_log.json', 'w', encoding='utf-8') as f:
json.dump(result, f, indent=2) # indent=2 美化输出
五、常见错误与使用注意事项
常见错误
-
敏感属性格式错误
- 错误:敏感属性为数值型(如
gender=0/1未转换为字符串)。 - 后果:计算时可能被误判为连续值,导致群体划分错误。
- 解决:将敏感属性转换为字符串或分类型(如
data['gender'] = data['gender'].map({0: 'female', 1: 'male'}))。
- 错误:敏感属性为数值型(如
-
指标名称拼写错误
- 错误:将
disparate_impact写为disparate_impactt或DisparateImpact。 - 后果:触发
KeyError或返回空结果。 - 解决:严格使用官方指标名称(参考“支持的公平性指标”表)。
- 错误:将
-
预测结果与标签不匹配
- 错误:分类模型中
score_col传入连续概率但未转换为标签(如未指定阈值)。 - 后果:正预测率计算错误(概率值无法直接判断“正/负”)。
- 解决:先将概率转换为标签(如
data['pred_label'] = (data['pred_prob'] >= 0.5).astype(int))。
- 错误:分类模型中
注意事项
-
样本量平衡
- 若敏感属性的某群体样本量过少(如
<10),指标可能不稳定(如分母为0导致disparate_impact无穷大)。建议先检查群体分布:print(data['sensitive_attribute'].value_counts()) # 确保各群体样本量充足
- 若敏感属性的某群体样本量过少(如
-
公平性指标的冲突性
- 不同指标可能反映不同公平性定义(如
statistical_parity与equal_opportunity可能冲突)。例如,追求统计 parity 可能降低模型准确率,需结合业务场景选择指标(如司法领域更关注equal_opportunity)。
- 不同指标可能反映不同公平性定义(如
-
轻量版功能限制
aequitas-lite不支持可视化(如公平性对比图)和个体公平性评估,若需这些功能,需安装完整版aequitas-lib。
-
性能优化
- 对超大规模数据(千万级样本),建议使用
chunksize分块计算(如案例4),并避免同时计算过多指标(减少内存占用)。
- 对超大规模数据(千万级样本),建议使用
总结
aequitas-lite 以轻量、高效为核心优势,适合在生产环境中快速集成,实现模型公平性的实时监控和评估。使用时需注意数据格式、样本平衡和指标选择,结合业务场景定义合理的公平性标准,从而有效检测和缓解模型偏见。
《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。
更多推荐

所有评论(0)