如何使用在训练数据集上创建的自定义 Imputer 在测试集中估算缺失值

数据挖掘 机器学习 Python scikit-学习 预处理 数据插补
2022-02-21 04:25:43

我正在做一个玩具项目来预测索赔。其中一个输入特征具有空值,我在其上应用了自定义插补技术。在这种技术下,我用目标特征的两个类别的平均值替换了缺失值。代码片段如下:

dataframe['Feature'] = dataframe['Feature'].fillna(dataframe.groupby('Target Feature')['Feature'].transform('mean'))

使用这种策略,我设计了基于逻辑回归和支持向量分类器的分类模型。现在我必须在测试集上运行我的模型,但被困在预处理阶段。测试集在相同的特征中也有缺失值(与训练集中一样),现在我如何用模型从训练集中学习到的平均值来更新这些缺失值。

1个回答

您估算特征的方式无法在测试集中复制,因为它需要目标类的知识!

您需要选择依赖于目标特征的不同插补策略。


假设您正在使用另一个功能,与您使用目标的方式相同,您需要存储您在训练集中对每一列进行插补的值,然后使用与训练集相同的值来插补测试集. 这看起来像这样:

# we have two dataframes, train_df and test_df

impute_values = train_df.groupby('Another Feature')['Feature'].mean()

train_df['Feature'] = pd.Series(train_df['Feature'].values, index=train_df['Another Feature']).fillna(impute_values).reset_index(drop=True)

# train your model ...

test_df['Feature'] = pd.Series(test_df['Feature'].values, index=test_df['Another Feature']).fillna(impute_values).reset_index(drop=True)

例子:

train_df = pd.DataFrame({'f1': ['a'] * 5 + ['b'] * 5, 'f2': range(10)})
test_df = pd.DataFrame({'f1': ['a'] * 3 + ['b'] * 7, 'f2': range(10, 20)})
train_df.loc[[1, 6], 'f2'] = np.nan
test_df.loc[[1, 6], 'f2'] = np.nan

impute_values = train_df.groupby('f1')['f2'].mean()

train_df['f2'] = pd.Series(train_df['f2'].values, index=train_df['f1']).fillna(impute_values).reset_index(drop=True)

test_df['f2'] = pd.Series(test_df['f2'].values, index=test_df['f1']).fillna(impute_values).reset_index(drop=True)