在sklearn countvectorizer中fit_transform和transform之间有什么区别?

时间:2016-08-01 06:46:27

标签: python scikit-learn tokenize random-forest

我刚刚开始学习随机森林,所以如果这听起来很愚蠢我很抱歉

我最近在练习bag of words introduction : kaggle,我想澄清一些事情:

使用vectorizer.fit_transform(“*在已清理评论*列表中*”)

现在,当我们在火车评论上准备一堆单词数组时,我们在列车评论列表中使用了 fit_predict ,现在我知道fit_predict做了两件事,&gt ;首先,它适合数据并知道词汇,然后在每次审核时生成向量。

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

我的问题是.....为什么不在测试列表上使用 fit_transform !!我的意思是在文件中它说它会导致过度拟合,但等待它对我来说是否有意义无论如何使用它,让我给你我的预期:

当我们不使用fit_transform时,我们基本上是说使用最常用的火车评论词来制作测试评论的特征向量!!为什么不使用测试中最频繁的单词来制作测试特征数组呢?

我的意思是随机关怀吗?如果我们给随机森林列车特征数组和训练特征情绪来工作和训练自己,然后给它测试 特征数组赢了'它只是给出了对情绪的预测。

注意:我可能没有以正确的方式提出问题,但是当人们尝试回答时,我会更新问题以便更清楚。

3 个答案:

答案 0 :(得分:6)

您不对测试数据执行fit_transform,因为当您适应随机森林时,随机森林会根据您提供的功能的值来学习分类规则。如果要应用这些规则来对测试集进行分类,则需要确保使用相同的词汇表以相同的方式计算测试要素。如果训练的词汇和测试特征不同,那么特征就不会有意义,因为它们会反映出与文档训练分开的词汇。

现在,如果我们专门讨论CountVectorizer,请考虑以下示例,让您的训练数据包含以下3个句子:

  1. 狗是黑色的。
  2. 天空是蓝色的。
  3. 狗在跳舞。
  4. 现在为此设置的词汇将是{Dog,is,black,sky,blue,dancing}。现在,您将训练的随机森林将尝试根据这6个词汇表的计数来学习规则。因此,您的要素将是长度为6的向量。现在,如果测试集如下:

    1. 狗是白色的。
    2. 天空是黑色的。
    3. 现在,如果您使用fit_transform的测试数据,您的词汇表将类似于{Dog,white,is,Sky,black}。因此,您的每个文档将由长度为5的向量表示,表示每个术语的计数。现在,这就像将苹果与橙子进行比较一样。您将学习先前词汇计数的规则,并且这些规则不能应用于此词汇表。这就是您仅对培训数据fit的原因。

      希望有所帮助!

答案 1 :(得分:0)

基本上,您将整个数据分为训练和测试,以仅将训练数据公开给模型以及其他统计变量计算(例如均值和标准差),如果公开测试数据,则可能无法再推广模型,并且有机会过拟合。 因此,仅使用fit_transform公开训练数据,并使用transform将统计变量用于测试数据。

答案 2 :(得分:0)

简而言之,fit用于训练模型,一旦训练完成就可以使用该模型。要当然使用,请使用transform。 (请记住,fit通常会进行数据的计算或规范化。)

因此,您可以在测试数据上使用fittransform,但是重复工作量(您的模型已经在训练数据上使用fit进行了训练),所以这不是一个明智的决定。从长远来看,它也会降低性能。