TypeError: ratio() missing 1 required positional argument: 'metric_fun'
TypeError: ratio() missing 1 required positional argument: 'metric_fun'
我正在尝试使用 ibm 的 aif360 库进行去偏。
我正在研究线性回归模型,想尝试一个指标来计算特权组和非特权组之间的差异。
但是,当此代码为 运行 时,出现以下错误:
TypeError:difference() 缺少 1 个必需的位置参数:'metric_fun'
我已经查看了此函数的 class,但他们指的是 metric_fun,还阅读了文档,但没有进一步了解。
该函数缺少一个参数,但我不知道它需要哪个参数。
一小段代码是:
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())
给出的堆栈跟踪是:
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'
创建函数后:
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))
仍然得到类似的错误回溯:
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
好吧,虽然对您正在使用的库一无所知,但错误消息似乎仍然很清楚,尤其是因为您只调用了一次 difference
,如下所示:
metric_orig_train.difference()
错误消息告诉您应该在此调用中传递一个参数。参数的名称是 metric_fun
,这表明您应该向它传递一个函数引用。
注意:difference() 可能在您的代码之外被调用。当您提供错误消息时,如果有的话,请始终提交伴随它而来的堆栈跟踪。然后我们就可以准确的看到代码哪里出了问题。
在 GitHub 上查看库的源代码,需要将对函数的引用传递给 difference(self, metric_fun)
。所有的区别都是用 privileged=False
作为输入减去函数的输出,用 privileged=True
作为输入减去函数的输出。
def difference(self, metric_fun):
"""Compute difference of the metric for unprivileged and privileged
groups.
"""
return metric_fun(privileged=False) - metric_fun(privileged=True)
创建一个这样的函数并将其传递给差异。
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)
我正在尝试使用 ibm 的 aif360 库进行去偏。 我正在研究线性回归模型,想尝试一个指标来计算特权组和非特权组之间的差异。 但是,当此代码为 运行 时,出现以下错误:
TypeError:difference() 缺少 1 个必需的位置参数:'metric_fun'
我已经查看了此函数的 class,但他们指的是 metric_fun,还阅读了文档,但没有进一步了解。 该函数缺少一个参数,但我不知道它需要哪个参数。
一小段代码是:
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())
给出的堆栈跟踪是:
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'
创建函数后:
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))
仍然得到类似的错误回溯:
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
好吧,虽然对您正在使用的库一无所知,但错误消息似乎仍然很清楚,尤其是因为您只调用了一次 difference
,如下所示:
metric_orig_train.difference()
错误消息告诉您应该在此调用中传递一个参数。参数的名称是 metric_fun
,这表明您应该向它传递一个函数引用。
注意:difference() 可能在您的代码之外被调用。当您提供错误消息时,如果有的话,请始终提交伴随它而来的堆栈跟踪。然后我们就可以准确的看到代码哪里出了问题。
在 GitHub 上查看库的源代码,需要将对函数的引用传递给 difference(self, metric_fun)
。所有的区别都是用 privileged=False
作为输入减去函数的输出,用 privileged=True
作为输入减去函数的输出。
def difference(self, metric_fun):
"""Compute difference of the metric for unprivileged and privileged
groups.
"""
return metric_fun(privileged=False) - metric_fun(privileged=True)
创建一个这样的函数并将其传递给差异。
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)