如何使用 ce.TargetEncoder() 和 KNNImputer() 用于插补 MAR 的缺失值

How to Use ce.TargetEncoder() and KNNImputer() to Impute Missing Values for MAR

提问人:totallythemayor 提问时间:11/9/2023 最后编辑:totallythemayor 更新时间:11/9/2023 访问量:35

问:

我正在使用加州大学欧文分校机器学习存储库中的成人数据集来预测收入——> 50K 或 <= 50K——基于数据集中存在的变量。

我已经清理了数据,并进行了标签编码的性别、收入(50K 或 <= 50K),并进行了 One-Hot 编码的种族。我仍然必须(目标)对本国、职业、工人阶级、关系和婚姻状况进行编码。

至于缺失值,我用模式将缺失值插补在原生国家/地区,因为我觉得它是 MCAR。但是,occupation 和 workclass 的 null 值高度同时出现,这让我相信它是 MAR。

环顾四周后,我了解到最好先编码,然后插补缺失值(如果您不这么认为,请纠正我)。因此,我所做的是将数据集拆分为一个没有 occupation 和 workclass 的 null 值的数据集,以及一个具有 occupation 和 workclass 的所有 null 值的数据集。从那时起,我的计划是使用 ce。TargetEncoder() 到 Target 对数据集进行编码,而不使用 occupation 和 workclass 的 null 值,然后使用 pd.concat 将两个数据集连接在一起,以便最终使用 KNNImputer() 来插补 occupation 和 workclass 的缺失值。

但是,我收到一个错误(如下所示,以及其他相关代码),基本上是 ce。TargetEncoder() 要求另一个参数,但我不确定在这种情况下会是什么。

在使用 ce 之前,我查看的所有代码都已将数据集拆分为测试数据集和训练数据集。TargetEncoder(),所以如果有人能解释这是否是必需的以及如何最好地实现它,或者如果有人有任何其他建议,我将不胜感激!

# The dataset with no null values for occupationa and workclass.
df_workclass_occ_nonull = df[df['workclass'].notnull() & df['occupation'].notnull()]

# The dataset with all the null values for occupationa and workclass.
df_workclass_occ_allnull = df[df['workclass'].isnull() | df['occupation'].isnull()]
# This is my attempt at using ce.TargetEncoder() for the purpose stated above.
encoder = ce.TargetEncoder(cols=['workclass', 'occupation'])
df_workclass_occ_nonull = encoder.fit_transform(df_workclass_occ_nonull)

这是我尝试使用 ce 后收到的错误。df_workclass_occ_nonull上的 TargetEncoder:

TypeError:fit_transform() 缺少参数:y

编辑:我尝试使用ce。TargetEncoder() 使用两列(occupation 和 workclass)作为两个参数:

encoder = ce.TargetEncoder()

df_workclass_occ_nonull['workclass'] = encoder.fit_transform(df_workclass_occ_nonull['workclass'], df_workclass_occ_nonull['occupation'])
df_workclass_occ_nonull['occupation'] = encoder.fit_transform(df_workclass_occ_nonull['occupation'], df_workclass_occ_nonull['workclass'])

问题是它说它无法将值转换为数字,所以我将类型转换为“类别”,然后再次尝试:

df_workclass_occ_nonull['workclass'] = df_workclass_occ_nonull['workclass'].astype('category').cat.codes
df_workclass_occ_nonull['occupation'] = df_workclass_occ_nonull['occupation'].astype('category').cat.codes

但是,这似乎也没有奏效,因为我收到以下警告:

警告:未找到分类列。调用“transform”将仅返回输入数据。 警告:未找到分类列。调用“transform”将仅返回输入数据。

任何和所有的帮助将不胜感激!

编码 科学 编码 缺失数据 插补

评论


答: 暂无答案