Scikit learn 使用TF-IDF测试和训练具有不同数量特征的集合

Scikit learn 使用TF-IDF测试和训练具有不同数量特征的集合,scikit-learn,classification,tf-idf,training-data,Scikit Learn,Classification,Tf Idf,Training Data,我正在做一个简单的二元分类,我给你们举一个我遇到的问题的例子:假设我们有n文档(文档1,文档2,…,文档n)。我们将使用TF-IDF作为特征值,使用单词包训练二元分类器。我们的培训文件具有m功能(从技术上讲,m是我们在清理和预处理后在所有这些n个文档中拥有的唯一标记的数量) 现在,假设我们有一个经过训练的模型,我们将预测一个新文档的标签。我们首先应该像对待培训文档一样对测试文档进行预处理。然后,我们应该使用TF-IDF为测试文档构建一个特征向量。这里有两个问题: 对于训练集和测试集,特性的数量

我正在做一个简单的二元分类,我给你们举一个我遇到的问题的例子:假设我们有n文档(文档1,文档2,…,文档n)。我们将使用TF-IDF作为特征值,使用单词包训练二元分类器。我们的培训文件具有m功能(从技术上讲,m是我们在清理和预处理后在所有这些n个文档中拥有的唯一标记的数量)

现在,假设我们有一个经过训练的模型,我们将预测一个新文档的标签。我们首先应该像对待培训文档一样对测试文档进行预处理。然后,我们应该使用TF-IDF为测试文档构建一个特征向量。这里有两个问题:

  • 对于训练集和测试集,特性的数量不会相同。我读过一些关于这个问题的解决方案,但是,从科学的角度来看,我不能满足
  • 仅为一个测试文档或其中几个文档计算TF-IDF是没有意义的。因为我们在训练集和测试集中拥有的标记字典不一定相同,即使我们在这两个集合中拥有相同数量的特性,也不一定意味着这些特性相同
所以现在我只是想弄清楚,我们如何准确地使用一个模型来标记一个新文档,这个模型是我们用单词包模型和TF-IDF值训练的。特别是,我正在为我上面提到的两个具体问题寻找一个合理的答案

我们可以计算模型的准确性(例如使用交叉验证),但我不知道我们应该如何标记新文档

另外,我正在使用scikit学习和python

更新:我可以找到我问题的答案。在这种情况下,我们可以简单地使用与训练分类器相同的TFIDFvectorier。因此,每次我训练一个新分类器并使用tfidfVectorizer构建我的特征向量时,我都会使用pickle将我的向量器保存在一个文件中,并在创建测试集特征向量时使用该向量器


我无法科学地证实这一点,但您可以尝试使用m功能字典,并计算测试集中这些功能的TF-IDF分数。这将为每个测试文档创建一个向量,该向量与训练向量大小相同,并且与训练模型时使用的相同特征相关。但是,您必须解决训练集中没有出现在测试集中的单词的问题


我可以问一下为什么您使用TF-IDF,而不是像朴素贝叶斯或随机森林这样的东西吗?

您应该在培训期间找出所有可能的特征及其IDF权重;在测试时,使用基于训练数据集找到的特征和权重。不要在测试文档上计算IDF

1) 使用单词袋法时,常用的方法是丢弃训练过程中看不到的单词。如果你在训练期间没有看到一个单词,你就没有关于它的任何信息,因此它不会影响预测结果

2) 是的,在预测时建立词汇表和计算IDF权重是没有意义的。使用在训练阶段发现的特征和重量

scikit learn提供了一个解决方案


将tf*idf放在比训练数据集更大的数据集上可能是有意义的,以便对训练数据中发现的单词进行更精确的idf估计,但我不确定人们这样做的频率。

“训练集中没有出现在测试集中的单词”这正是我要寻找答案的问题!据我所知,一旦我们有了特征向量,我们就可以使用随机森林和朴素贝叶斯算法。问题在于使用TF-IDF创建用于训练和测试集的特征向量。特别是,我认为无论我们使用什么算法,我们都应该首先创建特征向量。想想在现实世界场景中,你将如何处理,在现实世界中,你已经用所有可用数据进行了训练,但仍然在预测时出现了新的文本数据。