Python包 aequitas-lite 详解

一、功能概述

aequitas-lite 是一款轻量级Python工具包,专注于机器学习模型的公平性(Fairness)快速评估。作为 aequitas-lib 的简化版本,它剥离了复杂的可视化依赖和高级分析功能,仅保留核心公平性指标计算能力,具有轻量、快速、易集成的特点。主要功能包括:

  • 计算基础群体公平性指标(如Disparate Impact、Statistical Parity、Equal Opportunity等)。
  • 支持分类模型和回归模型的公平性评估。
  • 仅依赖 pandasnumpy,适合资源受限环境(如边缘设备、生产流水线)。
二、安装方法

aequitas-lite 可通过PyPI直接安装,支持Python 3.6及以上版本:

pip install aequitas-lite

安装后自动依赖 pandas>=1.0.0numpy>=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 美化输出
五、常见错误与使用注意事项
常见错误
  1. 敏感属性格式错误

    • 错误:敏感属性为数值型(如 gender=0/1 未转换为字符串)。
    • 后果:计算时可能被误判为连续值,导致群体划分错误。
    • 解决:将敏感属性转换为字符串或分类型(如 data['gender'] = data['gender'].map({0: 'female', 1: 'male'}))。
  2. 指标名称拼写错误

    • 错误:将 disparate_impact 写为 disparate_impacttDisparateImpact
    • 后果:触发 KeyError 或返回空结果。
    • 解决:严格使用官方指标名称(参考“支持的公平性指标”表)。
  3. 预测结果与标签不匹配

    • 错误:分类模型中 score_col 传入连续概率但未转换为标签(如未指定阈值)。
    • 后果:正预测率计算错误(概率值无法直接判断“正/负”)。
    • 解决:先将概率转换为标签(如 data['pred_label'] = (data['pred_prob'] >= 0.5).astype(int))。
注意事项
  1. 样本量平衡

    • 若敏感属性的某群体样本量过少(如 <10),指标可能不稳定(如分母为0导致 disparate_impact 无穷大)。建议先检查群体分布:
      print(data['sensitive_attribute'].value_counts())  # 确保各群体样本量充足
      
  2. 公平性指标的冲突性

    • 不同指标可能反映不同公平性定义(如 statistical_parityequal_opportunity 可能冲突)。例如,追求统计 parity 可能降低模型准确率,需结合业务场景选择指标(如司法领域更关注 equal_opportunity)。
  3. 轻量版功能限制

    • aequitas-lite 不支持可视化(如公平性对比图)和个体公平性评估,若需这些功能,需安装完整版 aequitas-lib
  4. 性能优化

    • 对超大规模数据(千万级样本),建议使用 chunksize 分块计算(如案例4),并避免同时计算过多指标(减少内存占用)。
总结

aequitas-lite 以轻量、高效为核心优势,适合在生产环境中快速集成,实现模型公平性的实时监控和评估。使用时需注意数据格式、样本平衡和指标选择,结合业务场景定义合理的公平性标准,从而有效检测和缓解模型偏见。

《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐