首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError: ratio()缺少1个必需的位置参数:“metric_fun”

TypeError: ratio()缺少1个必需的位置参数:“metric_fun”
EN

Stack Overflow用户
提问于 2020-10-18 04:13:07
回答 2查看 310关注 0票数 1

我正在尝试使用ibm的aif360库来进行去偏。我正在研究一个线性回归模型,并希望尝试一个度量来计算特权组和非特权组之间的差异。但是,当运行这段代码时,我得到以下错误:

TypeError: difference()缺少1个必需的位置参数:“metric_fun”

我已经研究了这个函数的类,但它们引用了一个metric_fun,也读取了文档,但没有得到进一步的信息。该函数缺少一个参数,但我不知道它需要哪个参数。

代码的一小段是:

代码语言:javascript
复制
train_pp_bld = StructuredDataset(df=pd.concat((x_train, y_train),
                                                axis=1),
                                  label_names=['decile_score'],
                                  protected_attribute_names=['sex_Male'],
                                  privileged_protected_attributes=1,
                                  unprivileged_protected_attributes=0)

privileged_groups = [{'sex_Male': 1}]
unprivileged_groups = [{'sex_Male': 0}]

# Create the metric object
metric_train_bld = DatasetMetric(train_pp_bld,
                                            unprivileged_groups=unprivileged_groups,
                                            privileged_groups=privileged_groups)

# Metric for the original dataset
metric_orig_train = DatasetMetric(train_pp_bld, 
                                              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.difference())

给定的堆栈跟踪为:

代码语言:javascript
复制
Traceback (most recent call last):

  File "/Users/sef/Desktop/Thesis/Python Projects/Stats/COMPAS_Debias_AIF360_Continuous_Variable.py", line 116, in <module>
    print("Difference in mean outcomes between unprivileged and privileged groups = %f" % metric_orig_train.difference())

  File "/Users/sef/opt/anaconda3/envs/AI/lib/python3.8/site-packages/aif360/metrics/metric.py", line 37, in wrapper
    result = func(*args, **kwargs)

TypeError: difference() missing 1 required positional argument: 'metric_fun'

创建函数后:

代码语言:javascript
复制
def privileged_value(self, privileged=False):
    if privileged:
        return unprivileged_groups['sex_Male']
    else:
        return privileged_groups['sex_Male']

display(Markdown("#### Original training dataset"))
print("Difference in mean outcomes between unprivileged and privileged groups = %f" % metric_orig_train.difference(privileged_value))

仍然会得到类似的错误回溯:

代码语言:javascript
复制
Traceback (most recent call last):

  File "/Users/sef/Desktop/Thesis/Python Projects/Stats/COMPAS_Debias_AIF360_Continuous_Variable.py", line 123, in <module>
    print("Difference in mean outcomes between unprivileged and privileged groups = %f" % metric_orig_train.difference(privileged_value))

  File "/Users/sef/opt/anaconda3/envs/AI/lib/python3.8/site-packages/aif360/metrics/metric.py", line 37, in wrapper
    result = func(*args, **kwargs)

  File "/Users/sef/opt/anaconda3/envs/AI/lib/python3.8/site-packages/aif360/metrics/dataset_metric.py", line 77, in difference
    return metric_fun(privileged=False) - metric_fun(privileged=True)

  File "/Users/youssefennali/Desktop/Thesis/Python Projects/Stats/COMPAS_Debias_AIF360_Continuous_Variable.py", line 120, in privileged_value
    return privileged_groups['sex_Male']

TypeError: list indices must be integers or slices, not str

有人能给我指个方向吗?在线上没有类似代码的示例。

致以敬意,

Sef

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-18 04:48:08

查看GitHub上的库的源代码,需要向difference(self, metric_fun)传递对函数的引用。唯一的区别是将privileged=False作为输入的函数的输出与privileged=True作为输入的函数的输出相减。

代码语言:javascript
复制
def difference(self, metric_fun):
    """Compute difference of the metric for unprivileged and privileged
    groups.
    """
    return metric_fun(privileged=False) - metric_fun(privileged=True)

创建一个类似这样的函数,并将其传递给difference。

代码语言:javascript
复制
def privilege_value(privileged=False) -> int:
    if privileged:
        return unprivileged_groups[0]['sex_male']
    else:
        return privileged_groups[0]['sex_male']

metric_orig_train.difference(privilege_value)
票数 1
EN

Stack Overflow用户

发布于 2020-10-18 04:18:51

在不了解您正在使用的库的情况下,错误消息看起来仍然非常清楚,特别是因为您只调用了difference一次,如下所示:

代码语言:javascript
复制
metric_orig_train.difference()

错误消息告诉您应该在此调用中传递一个参数。该参数的名称是metric_fun,这向我建议您应该向它传递一个函数引用。

注意: difference()有可能是在您的代码外部调用的。当您提供错误消息时,请始终提交随附的堆栈跟踪(如果有)。然后,我们可以确切地看到问题发生在代码中的哪个位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64406879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档