使用简单输入器的正确方法?

问题描述 投票:0回答:2

我有一个带有 nan 值的测试和训练数据集。我想使用简单的 imputer 来使用以下代码处理它们。

#numerical values
imp= SImp(strategy= 'median') #or 'mean', 'median', 'most_frequent' 
my_df.loc[:, num_cols_nan]= imp.fit_transform(def_df.loc[:, num_cols_nan])

#categorical values
imp= SImp(strategy= 'most_frequent')
my_df.loc[:, cat_cols_nan]= imp.fit_transform(def_df.loc[:, cat_cols_nan])`

我的想法是使用中位数和

most_frequent
来填充NaNs。

但是,浏览网页时我发现有关如何使用输入器的不同信息:

  • 对训练数据集使用 fit_transform,对测试集使用 transform,以便根据训练集的分布执行替换。
  • 对训练集和测试集使用 fit_transform,以便根据每个集合的分布分别执行替换。

只是为了澄清版本 1. 是最常见的情况,但由于我是一个初学者,所以我在这里有点困惑。

python data-science imputation
2个回答
0
投票

您提到的两种方法都是有效的,可用于在训练和测试集中估算缺失值。不同之处在于训练输入器并将其应用于数据的方式。

方法 1:训练集上的 fit_transform 和测试集上的 transform

在这种方法中,您使用 fit_transform 将插补器拟合到训练集上,它根据训练数据的分布学习插补模型的参数(例如均值、中值、最频繁)。然后,您对测试集使用转换,以使用相同的学习参数来估算测试集中的缺失值。这种方法确保根据训练数据的分布估算测试集,这是大多数情况下的目标。

方法 2:分别在训练集和测试集上进行 fit_transform

在这种方法中,您使用 fit_transform 在训练集和测试集上分别拟合输入器。这意味着插补参数将根据每个集合的分布分别学习,这可能会导致两组之间不同的插补结果。这种方法不太常见,一般不推荐使用,因为它可能会导致对测试集的过度拟合。

一般来说,建议使用方法 1 来估算训练集和测试集中的缺失值。这确保了插补是根据训练数据的分布完成的,这正是我们想要学习的。此外,它确保对训练集和测试集使用相同的插补模型,这对于确保建模过程的一致性非常重要。


0
投票

选项 2 是正确的,因为选项 1 会导致 数据泄露

来自维基百科:

在统计和机器学习中,泄漏(也称为数据 泄漏或目标泄漏)是模型中信息的使用 预计不会提供的培训过程 预测时间,导致预测分数(指标) 在生产中运行时高估模型的效用 环境。1

泄漏通常是微妙的和间接的,因此难以检测和 排除。泄漏可能导致统计人员或建模人员选择一个 次优模型,可以通过无泄漏 模型。1

如果你用从火车数据中获取的信息修改测试数据,那么测试数据将包含从火车数据中获取的信息,因此它不会像它应该的那样完全独立,你的评估质量将受到影响,因为结果会比实际情况更好。

© www.soinside.com 2019 - 2024. All rights reserved.