过度拟合朴素贝叶斯

数据挖掘 分类 朴素贝叶斯分类器 过拟合 方差
2021-10-07 15:23:31

我的问题是朴素贝叶斯在训练集上表现良好但在测试集上表现不佳的潜在原因是什么?

我正在使用20news dataset的变体。数据集包含文档,这些文档表示为没有元数据的“词袋”。我的目标是将每个文档分类为 20 个标签中的 1 个。我在训练数据上的错误率是 20%,但我在测试数据上的错误率是 90%(相比之下,猜测的错误率是 95%)。出于某种原因,我的分类器为测试集中的几乎所有文档预测第 16 类。在火车组中不会发生此问题。此外,这个问题在不同的训练/测试拆分中仍然存在。我试图弄清楚我做错了什么。

以下是我考虑过的一些事情:

  • 朴素贝叶斯是否过度拟合训练集?如果正确实施朴素贝叶斯,我认为它不应该像这样在它被认为适合(文本分类)的任务上过度拟合。
  • 我的火车/测试分开不好吗?我尝试以不同的方式拆分数据,但似乎没有什么不同。现在,我通过将随机 90% 的文档样本放入训练集中并将其余样本放入测试集中来拆分数据 - 分别针对每个标签。
  • 数值精度问题?我已经在对数概率中实现了计算,但无论如何,我希望这个问题也会在训练集中体现出来。
  • 看不见的单词有问题吗?对于训练集和测试集,相对于特定新闻组的未见词的比例相同,均为 20%。
  • 拉普拉斯平滑问题?我不确定为这项任务实施拉普拉斯平滑的合适方法是什么,所以我尝试了多种方法。令我惊讶的是,它们都产生了非常相似的结果。
  • 数据集不平衡?看起来不像。标签为 16 的文档中的唯一词大约与其他类别中的一样多。每个标签的文档数量也大致均匀。

编辑:原来我有一个实现错误。我不会在这里详细介绍它,因为它不太可能帮助任何有类似问题的人。

3个回答

让我试着逐点回答你的问题。也许你已经解决了你的问题,但是你的问题很有趣,所以其他人也许可以从这个讨论中受益。

  • 朴素贝叶斯是否过度拟合训练集?如果正确实施朴素贝叶斯,我认为它不应该像这样在它被认为适合(文本分类)的任务上过度拟合。

朴素贝叶斯在文档分类方面表现良好,但这并不意味着它不能过度拟合数据。任务、文档分类和数据之间存在差异。即使正确实施了朴素贝叶斯,也可能发生过度拟合。

  • 我的火车/测试分开不好吗?我尝试以不同的方式拆分数据,但似乎没有什么不同。现在,我通过将随机 90% 的文档样本放入训练集中并将其余样本放入测试集中来拆分数据 - 分别针对每个标签。

最好在训练和测试集中保持类分布相同。你在使用交叉验证吗?也许尝试一下,因为即使它很少见,也可能会因为一些种子而导致你的分裂不走运。

  • 数值精度问题?我已经在对数概率中实现了计算,但无论如何,我希望这个问题也会在训练集中体现出来。

你是对的,如果这是一个问题,它也会显示在训练集中。

  • 看不见的单词有问题吗?对于训练集和测试集,相对于特定新闻组的未见词的比例相同,均为 20%。

那时这似乎不是问题。您也许可以通过使用词干或词形还原来降低该百分比。

  • 拉普拉斯平滑问题?我不确定为这项任务实施拉普拉斯平滑的合适方法是什么,所以我尝试了多种方法。令我惊讶的是,它们都产生了非常相似的结果。

拉普拉斯平滑非常有用,尤其是当您没有大量数据并且需要考虑一些不确定性时。对于此数据集,这似乎不是问题,如您所经历的类似结果所示。

  • 数据集不平衡?看起来不像。标签为 16 的文档中的唯一词大约与其他类别中的一样多。每个标签的文档数量也大致均匀。

文件的长度是否相同?因为标签 16 可能只包含更大的文档,因此具有更大的词频。它们也可能包含非常常见的单词。查看每个类中单词的直方图会很有趣。这对于理解标签 16 是否与其他标签非常不同可能非常有用。

文本挖掘是机器学习应用的一个相当棘手的领域,因为你所拥有的只是“非结构化和半结构化数据”,而预处理和特征提取步骤非常重要。文本挖掘手册是该研究领域的无价参考书。但要具体说明您的情况,我可以提出两个答案:

  • 如前所述,预处理步骤在这里起着非常重要的作用。在文本挖掘中,它可能会陷入维度的诅咒,因为您可能已经说过大约 1000 个文档,但数据集中有超过 15000 个唯一词。诸如词干提取和词形还原、静态和动态停用词以及标点删除等技术都旨在解决这个问题。所以预处理和特征提取不是一种选择。这是必须的

  • 朴素贝叶斯模型是一种线性分类器。尽管它是文本分类中非常流行的算法,但仍然存在出现像您这样的问题的风险。主要原因可能是您的单词空间矩阵非常稀疏。您一定已经注意到,在计算属于某个类的后验概率时,朴素贝叶斯将 的所有单个概率天真地相乘P(y|x_i)如果至少有一个零概率,那么无论其他逆观察概率是多少,您的最终答案都是零。如果您自己实现了算法,请尝试使用 MATLAB 中已经构建的工具、Python sci-kit 学习库或 KNIME 和 RapidMiner 等数据挖掘软件。他们在实现朴素贝叶斯算法时巧妙地处理了这些实际问题。

除非您在其他相关文件上执行此操作,否则您不会删除停用词。如果标签 16 充分利用了这一点,那么这就是对这种结果的合理解释。

另一方面(除非您再次在其他文件上执行此操作),否则您不会将单词简化为它们的语素。不这样做可能会导致此类异常。查看 Nltk 文档以了解如何执行此操作。