使用AIF360做偏差缓解时报DataFrame值必须为数值错误如何解决
问题原因
BinaryLabelDataset要求传入的整个DataFrame所有字段均为数值类型,你只检查了income、gender两个字段的类型,其余未用到的列如果存在字符串、object、布尔等非数值类型,也会触发该报错。
解决方案
按以下步骤排查处理即可:
- 第一步先定位非数值列,运行以下代码查看全表字段类型:
print(df.dtypes) - 选择对应方式处理:
- 若存在不需要用到的非数值列,直接截取需要的字段子集传入即可,示例:
# 替换为你实际需要使用的所有特征列+标签列+受保护属性列 used_cols = ['income', 'gender', 'age', 'education_num', 'work_hours'] df_used = df[used_cols].copy()- 若类别型字段需要保留参与训练,做数值编码转换即可:
- 无序类别列用独热编码:
df = pd.get_dummies(df, columns=['类别列名']) - 有序类别列用标签编码:
from sklearn.preprocessing import LabelEncoder df['类别列名'] = LabelEncoder().fit_transform(df['类别列名']) - 无序类别列用独热编码:
- 若存在看起来是数字实际存储为字符串的列,强制转换为数值:
df['列名'] = pd.to_numeric(df['列名'], errors='coerce')
- 额外检查:提前处理DataFrame中的缺失值,缺失值也可能导致类型判断异常:
df = df.fillna(0) # 可根据业务逻辑替换为均值、中位数等填充方式
修正后可用代码示例
# 预处理:只保留数值列 + 去除缺失值 df_processed = df.select_dtypes(include=['int64', 'float64']).dropna().copy() # 构造数据集 binaryLabelDataset = aif360.datasets.BinaryLabelDataset( favorable_label=1, unfavorable_label=0, df= df_processed, label_names=['income'], protected_attribute_names=['gender'])
内容的提问来源于stack exchange,提问作者Germa
相关产品推荐
相关产品推荐

