You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AIF360做偏差缓解时报DataFrame值必须为数值错误如何解决

问题原因

BinaryLabelDataset要求传入的整个DataFrame所有字段均为数值类型,你只检查了income、gender两个字段的类型,其余未用到的列如果存在字符串、object、布尔等非数值类型,也会触发该报错。

解决方案

按以下步骤排查处理即可:

  • 第一步先定位非数值列,运行以下代码查看全表字段类型:
    print(df.dtypes)
  • 选择对应方式处理:
    1. 若存在不需要用到的非数值列,直接截取需要的字段子集传入即可,示例:
    # 替换为你实际需要使用的所有特征列+标签列+受保护属性列
    used_cols = ['income', 'gender', 'age', 'education_num', 'work_hours']
    df_used = df[used_cols].copy()
    
    1. 若类别型字段需要保留参与训练,做数值编码转换即可:
      • 无序类别列用独热编码:df = pd.get_dummies(df, columns=['类别列名'])
      • 有序类别列用标签编码:
      from sklearn.preprocessing import LabelEncoder
      df['类别列名'] = LabelEncoder().fit_transform(df['类别列名'])
      
    2. 若存在看起来是数字实际存储为字符串的列,强制转换为数值:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:36:03