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。