繁体   English   中英

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

[英]What is the difference between fit_transform and transform in sklearn countvectorizer?

我最近在练习词袋介绍:kaggle ,我想澄清几点:

使用vectorizer.fit_transform( " * on the list of *cleaned* reviews* " )

现在,当我们在火车评论中准备单词数组时,我们在火车评论列表中使用了fit_predict ,现在我知道fit_predict做了两件事,首先它适合数据并知道词汇量,然后它在每个评论上制作向量。 .

因此,当我们使用vectorizer.transform( "*list of cleaned train reviews* " ) review vectorizer.transform( "*list of cleaned train reviews* " )这只是将测试评论列表转换为每个评论的向量。

我的问题是,为什么不在测试列表中使用fit_transform呢? 我的意思是在文档中它说它会导致过度拟合,但无论如何使用它对我来说确实有意义; 让我给你我的前景:

当我们不使用fit_transform我们实际上是在说使用火车评论中最常用的词制作测试评论的特征向量。 为什么不使用测试本身中最常用的词来制作测试特征数组?

我的意思是随机森林关心吗? 如果我们给随机森林训练特征数组和训练特征情感来工作和训练自己,然后给它测试特征数组,它不会只是给出它对情感的预测吗?

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

现在如果我们专门讲CountVectorizer ,那么考虑下面的例子,让你的训练数据有以下 3 句话:

  1. 狗是黑色的。
  2. 天空是蓝色的。
  3. 狗在跳舞。

现在为此设置的词汇将是{Dog, is, black, sky, blue, dancing} 现在,您将训练的随机森林将尝试根据这 6 个词汇项的数量来学习规则。 所以你的特征将是长度为 6 的向量。 现在如果测试集如下:

  1. 狗是白色的。
  2. 天空是黑色的。

现在,如果您使用fit_transform的测试数据,您的词汇将类似于{Dog, white, is, Sky, black} 所以在这里你的每个文档将由一个长度为 5 的向量表示,表示这些术语中的每一个的计数。 现在,这就像比较苹果和橙子一样。 您学习了先前词汇计数的规则,而这些规则不能应用于此词汇表。 这就是为什么你只fit训练数据的原因。

基本上,您将整个数据拆分为训练和测试,以仅将训练数据暴露给模型和其他统计变量计算(如均值和标准差),如果暴露测试数据,您的模型可能不再泛化,并且可能会过度拟合。 因此,仅使用 fit_transform 公开训练数据,并通过变换将统计变量用于测试数据。

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

因此,您可以对测试数据使用fittransform ,但是当您重复工作(您的模型已经使用fit训练数据进行训练)时,这并不是明智的决定,而且从长远来看,它也可能会降低性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM