【问题标题】:What is the difference between fit_transform and transform in sklearn countvectorizer?sklearn countvectorizer中的fit_transform和transform有什么区别?
【发布时间】:2016-12-06 03:51:00
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python scikit-learn tokenize text-processing


    【解决方案1】:

    您不对测试数据执行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 的原因。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        因此,您可以在测试数据上使用 fittransform,但这并不是明智的决定,因为您重复了这些努力(您的模型已经在训练数据上使用 fit 进行了训练),从长远来看,它可能会降低表现也很好。

        【讨论】:

          猜你喜欢
          • 2014-07-13
          • 2021-03-11
          • 2018-08-25
          • 2019-11-08
          • 2017-04-11
          • 2021-02-18
          • 2019-01-30
          • 2016-08-25
          • 1970-01-01
          相关资源
          最近更新 更多