sklearn中的CountVectorizer中的fit_transform和transform有什么区别?

10

最近我正在练习袋装词(Bag of Words):kaggle 入门指南,我想澄清几件事:

使用 vectorizer.fit_transform("*清理后的评论列表*")

现在,当我们在训练评论上准备袋装词数组时,我们使用了fit_predict在训练评论列表上,现在我知道fit_predict做了两件事,首先它适应数据并了解词汇表,然后对每篇评论进行向量化。

因此,当我们使用vectorizer.transform("*清理后的测试评论列表*")时,这只是将测试评论列表转换为每个评论的向量。

我的问题是,为什么不在测试列表上也使用fit_transform呢?我是说,在文件中说会导致过度拟合,但我认为无论如何都可以使用;让我给你我的观点:

当我们不使用fit_transform时,我们实质上是说要使用训练评论中最常见的单词来制作测试评论的特征向量。为什么不使用测试本身最常见的单词制作测试特征数组呢?

我的意思是,随机森林在乎吗?如果我们给随机森林训练功能数组和训练情感,让它进行训练并给出对测试 特征数组的预测,它不会只给出情感的预测吗?

3个回答

14

在使用随机森林进行分类时,不应该对测试数据使用 fit_transform。因为当你对随机森林进行训练时,它会根据你提供的特征值学习分类规则。如果想要应用这些规则对测试集进行分类,那么你需要确保测试特征以相同的词汇表相同的方式进行计算。如果训练和测试特征的词汇表不同,那么这些特征就没有实际意义,因为它们反映的是一个不同于文档训练时的词汇表。

现在,如果我们特别讨论 CountVectorizer,请考虑以下示例,假设你的训练数据包含以下三个句子:

  1. Dog is black.
  2. Sky is blue.
  3. Dog is dancing.

现在这个训练集的词汇表为 {Dog, is, black, sky, blue, dancing}。现在你将要训练的随机森林将尝试基于这 6 个词汇的计数来学习规则。因此,你的特征向量将是长度为 6 的向量。如果测试集如下所示:

  1. Dog is white.
  2. Sky is black.

如果你在测试数据上使用 fit_transform,你的词汇表将变成 {Dog, white, is, Sky, black}。因此,你的每个文档将用长度为 5 的向量来表示,表示每个词的计数。这就像在比较苹果和橙子。你学习的是以前词汇表的计数规则,而这些规则无法应用于这个词汇表。这就是为什么只在训练数据上进行 fit 的原因。


0

基本上,您将整个数据分为训练集和测试集,仅向模型公开训练数据和其他统计变量计算,例如平均值和标准差。如果您暴露测试数据,则您的模型可能不再具有泛化能力,并且过度拟合的可能性会增加。因此,请使用fit_transform仅公开训练数据,并使用transform将统计变量应用于测试数据。


-1
简而言之,fit 用于训练模型,一旦训练完成,您可以使用该模型。当然,要使用它,您需要使用 transform。(请记住,fit 通常会计算或标准化数据。)
因此,虽然您可以在测试数据上使用 fittransform,但这并不明智,因为这样会重复努力(您的模型已经使用 fit 在训练数据上进行了训练),而且从长远来看,这可能会降低性能。

在测试数据上使用 fit(或 fit_transform)不是一个“不太明智的决定”,因为这样会重复劳动 - 这是完全错误的,可能会导致多个下游问题,包括纯编程错误 - desertnaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接