【问题标题】:Testing and Training sets with different number of features using TF-IDF使用 TF-IDF 测试和训练具有不同数量特征的集
【发布时间】:2017-11-26 11:12:06
【问题描述】:

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

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

  • 训练集和测试集的特征数量不会相同。我已经阅读了一些解决方案,但是从科学的角度来看,我不能满足!
  • 仅针对一个测试文档甚至其中几个文档计算 TF-IDF 并没有真正意义。因为我们在训练集和测试集中拥有的token字典不一定相同,即使我们对这两者有相同数量的特征,也不一定意味着这些特征是相同的。

所以现在我只是想弄清楚如何使用我们用词袋模型和 TF-IDF 值训练的模型准确地标记新文档。特别是,我正在寻找我上面提到的两个具体问题的合理答案。

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

附:我正在使用 scikit-learn 和 python。

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

【问题讨论】:

  • 想想你将如何在现实世界的场景中进行,你已经使用所有可用数据进行了训练,但在预测时仍然存在新的文本数据。

标签: scikit-learn classification tf-idf training-data


【解决方案1】:

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

1) 使用词袋方法时,常用的方法是丢弃训练期间未见过的词。如果您在训练期间没有看到一个单词,那么您对它的信息为零,因此它不会影响预测结果。

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

scikit-learn 提供了一个 tutorial 涵盖了这一点。

将 tf*idf 拟合到比训练数据集更大的数据集上可能是有意义的,以便为训练数据中找到的单词获得更精确的 IDF 估计,但我不确定人们这样做的频率。

【讨论】:

    【解决方案2】:

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

    我能问一下您为什么使用 TF-IDF 而不是朴素贝叶斯或随机森林之类的东西吗?

    【讨论】:

    • “训练集中没有出现在测试集中的单词”这正是我正在寻找答案的问题!据我了解,一旦我们有了特征向量,随机森林和朴素贝叶斯就是我们使用的算法。问题是使用 TF-IDF 为训练和测试集创建特征向量。特别是,我认为无论我们使用什么算法,我们都应该首先创建特征向量。
    猜你喜欢
    • 2017-04-05
    • 2021-06-19
    • 2015-01-17
    • 2020-06-08
    • 1970-01-01
    • 2020-09-22
    • 2017-11-21
    • 2018-08-19
    • 2020-09-27
    相关资源
    最近更新 更多