1、AIF360简介
- AI Fairness 360 工具包(AIF360)是一个开源软件工具包,可以帮助检测和缓解整个AI应用程序生命周期中机器学习模型中的偏见。
- 在整个机器学习的过程中,偏见可能存在于初始训练数据、创建分类器的算法或分类器所做的预测中。AI Fairness 360 工具包可以衡量和缓解机器学习过程中三个阶段的偏见。
- 开源网站:https://github.com/Trusted-AI/AIF360
2、安装AIF360
- 使用pip安装最新稳定的版本(先使用这个)
-
pip install aif360
- 【注】某些算法需要额外的依赖包,安装额外的依赖包,例如运行:
-
pip install aif360[LFR,OptimPreproc]
- 或安装完整功能的AIF360
-
pip install aif360[all]
-
3、使用示例
- 从github上找到官方提供的有关教程。
- 网站:AIF360/examples/README.md at master ·可信AI/AIF360 ·GitHub
3.1、信用评分(数据预处理去偏)
- 本案例演示了在使用德国信用数据集的信用评分场景中的年龄偏差背景下使用一个公平性指标(平均差)和一个偏见缓解算法(重新加权)。
- 具体工作:检查初始训练数据中的偏见,缓解偏见,然后重新检查。
- 网站:Jupyter 笔记本查看器 (nbviewer.org)
3.2、新建项目
- 使用PyCharm建立一个新的项目。
- 【注】在系统中使用pip下载的包,在Pycharm中一定要选择系统解释器才能够引用。
3.3、编写导入语句
- 以下所有语句都在main.py中编写。
- 与任何python程序一样,第一步是导入必要的包。下面我们从包中导入几个组件。我们导入 GermanDataset,用于检查偏见的指标以及与我们将用于减轻偏差的算法相关的类。
-
# 导入所有需要的包 import sys sys.path.insert(1, "../") import numpy as np np.random.seed(0)from aif360.datasets import GermanDataset from aif360.metrics import BinaryLabelDatasetMetric from aif360.algorithms.preprocessing import Reweighingfrom IPython.display import Markdown, display
- 编译报错(没什么包,加什么包)
- 添加包(还是报错先不管它)
-
pip install aif360[LawSchoolGPA]
- 安装IPython
-
pip install ipython
- 再次编译报错
- 需要下载数据集到指定位置。分别点击上述两个链接,右键另存为到指定的位置。(注意修改文件名字和后缀)
3.4、设置偏差检测选项、加载数据集并在训练和测试之间拆分
- 加载初始数据集,将受保护属性设置为 age。
- 将原始数据集拆分为训练数据集和测试数据集。虽然在本教程中我们将仅使用训练数据集,但正常的工作流也会使用测试数据集来评估机器学习模型开发期间的有效性(准确性、公平性等)。
- 为 age 属性的特权群体(1)和非特权群体(0)设置两个变量。
-
dataset_orig = GermanDataset(protected_attribute_names=['age'], # 将年龄指定为被保护属性privileged_classes=[lambda x: x >= 25], # age >=25 认为是特权features_to_drop=['personal_status', 'sex'] # 忽略与性别有关的属性 )dataset_orig_train, dataset_orig_test = dataset_orig.split([0.7], shuffle=True)privileged_groups = [{'age': 1}] unprivileged_groups = [{'age': 0}] # 其中“1”(大于或等于 25)和“0”(小于 25)分别是特权组和非特权组的值
3.5、计算原始训练数据集上的公平性指标
- 使用平均差来度量数据集中的偏见。比较特权和非特权群体的有利结果百分比,从后者中减去前者的百分比,负值表示对非特权组不利的结果。
- 使用BinaryLabelDatasetMetric类中的mean_difference方法实现。
-
# 创建BinaryLabelDatasetMetric对象,传入原始训练数据集dataset_orig_train,以及privileged_groups和unprivileged_groups的定义 metric_orig_train = BinaryLabelDatasetMetric(dataset_orig_train, unprivileged_groups=unprivileged_groups,privileged_groups=privileged_groups) display(Markdown("#### Original training dataset")) print("Difference in mean outcomes between unprivileged and privileged groups = %f" % metric_orig_train.mean_difference())
- 编译后显示差值为 -0.169905。
3.6、通过转换原始数据集来缓解偏差
- 尝试减轻训练数据集中的偏见被称为预处理去偏,因为它发生在创建模型之前。
- AI Fairness 360 实现了多种预处理缓解算法,选择重新加权算法(通过改变样本权重的方式来减少数据集中不同群体之间的偏差),该算法在包中的类中实现。此算法将转换数据集,使其在特权组和非特权组的受保护属性的积极结果上具有更大的公平性。
- 再调用拟合和转换方法来执行转换,生成新转换的训练数据集(dataset_transf_train)。
-
RW = Reweighing(unprivileged_groups=unprivileged_groups,privileged_groups=privileged_groups) # 创建Reweighing对象RW dataset_transf_train = RW.fit_transform(dataset_orig_train) # 计算权重,并生成一个新的训练数据集
3.7、在转换后的训练数据集上计算公平性指标
- 再次使用平均差来度量它的去偏效果。
-
metric_transf_train = BinaryLabelDatasetMetric(dataset_transf_train, unprivileged_groups=unprivileged_groups,privileged_groups=privileged_groups) display(Markdown("#### Transformed training dataset")) print("Difference in mean outcomes between unprivileged and privileged groups = %f" % metric_transf_train.mean_difference())
- 结果显示去偏效果非常明显,平均结果的差异现在是0.0。