在进行文本分类时,训练集中的词袋是否应该包含测试集数据?

数据挖掘 机器学习 文本挖掘 支持向量机 文本分类 词袋
2022-03-04 12:19:56

我正在使用简单的词袋模型和线性 SVM 分类器进行文本分类以从 Wikipedia 评论中识别“攻击”。由于班级不平衡,我使用 F1 分数作为我的错误度量。我想知道我在训练数据中拥有的标记是否还应该包含仅存在于测试数据中的单词,或者没关系?我的印象是这无关紧要,因为这些特征的计数在训练集中无论如何都是零。这应该使它们在训练时与模型无关。显然,这也是 SO 上的一些人所说的(虽然它没有找到任何明确的答案)。

为了测试这一点,我决定以两种方式训练我的模型并查看差异:一次只包含训练数据中的特征,另一次包含包含测试数据的特征。CV 的 N 倍数设置为 10。我得到了非常相似的 CV 错误,但是当我为测试数据生成预测时,包含测试数据特征的模型的 F1 分数高出 0.06 - 0.64 对 0.58。因为这是一个 Kaggle 作业,所以我看不到测试集的真实标签。我倾向于相信,如此大的差异不能只是随机的。似乎包含测试数据中的所有特征确实改善了我的模型,但这怎么可能呢?谁能给我一个解释?

1个回答

这是词汇表外(OOV)单词的问题。

通常,出于以下几个原因,培训不应使用测试集中的任何内容:

  • 数据泄露的风险,这会导致测试集的性能被高估。
  • 在训练期间,模型无论如何都不能使用这些词来区分类别,因为它们不存在。因此,将它们包括在内是没有意义的。
  • 原则上,该模型适用于任何新的输入文本,而不仅仅是当前测试集中的文档。使用测试集单词作为模型中的特征实际上限制了模型,因为它不能应用于测试集以外的任何其他文本。

处理OOV词的正确方法是:

  • 简单地完全忽略它们,即在应用模型之前将它们过滤掉。
  • 从一开始就在模型中考虑这种可能性。通常,这可以通过使用特殊令牌来完成UNKNOWN此选项通常与从训练集中过滤掉稀有词结合使用:每一次出现的稀有词都可以被UNKNOWN标记替换。

包含这些功能时性能更高的原因尚不清楚。我怀疑包含这些特征会导致模型以一种偶然发生的方式不同,从而对测试集产生积极影响。一般来说,这不太可能,我不确定。