我想使用AIF360计算组公平性指标。这是一个样本数据集和模型,其中性别是受保护的属性,收入是目标。
import pandas as pd
from sklearn.svm import SVC
from aif360.sklearn import metrics
df = pd.DataFrame({'gender': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1],
'experience': [0, 0.1, 0.2, 0.4, 0.5, 0.6, 0, 0.1, 0.2, 0.4, 0.5, 0.6],
'income': [0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1]})
clf = SVC(random_state=0).fit(df[['gender', 'experience']], df['income'])
y_pred = clf.predict(df[['gender', 'experience']])
metrics.statistical_parity_difference(y_true=df['income'], y_pred=y_pred, prot_attr='gender', priv_group=1, pos_label=1)
它抛出:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-609692e52b2a> in <module>
11 y_pred = clf.predict(X)
12
---> 13 metrics.statistical_parity_difference(y_true=df['income'], y_pred=y_pred, prot_attr='gender', priv_group=1, pos_label=1)
TypeError: statistical_parity_difference() got an unexpected keyword argument 'y_true'
类似的错误为disparate_impact_ratio
。似乎数据需要输入不同的,但我还没有能够弄清楚如何。
3条答案
按热度按时间bnlyeluc1#
这可以通过将数据转换为
StandardDataset
,然后调用下面的fair_metrics
函数来完成:返回正确的结果(image ref):
vsdwdz232#
删除函数调用中的
y_true=
和y_pred=
字符,然后重试。正如在documentation中所看到的,函数原型中的*y
代表任意数量的参数(参见this post)。因此,这是最符合逻辑的猜测。换句话说,
y_true
和y_pred
是NOT关键字参数,因此不能将它们的名称传递给函数。关键字参数在函数原型中表示为**kwargs
。2g32fytz3#
我遇到了同样的问题。y_pred_default是数组类型,整个数据集是 Dataframe 。但是如果你将y_pred_default转换为 Dataframe ,你将失去值的顺序,结果它将显示新数据集的nan值。所以我将数据集转换为numpy数组。然后与y_pred_default数组连接并转换为 Dataframe 。另外,你必须更改列名,因为现在有数字了。这样你就得到了你想要的,一个包含x值和相应的y预测值的 Dataframe ,用来计算spd指标。