如何利用不平衡数据创建准确的多类多项式朴素贝叶斯[已关闭]

问题描述 投票:0回答:2

我使用 sklearn 创建了一个基本的多类朴素贝叶斯文本分类器。我有 3 个类和大约 800 行数据。 A 类有 564 行,B 类有 159 行,C 类有 82 行。正如您所看到的,各类之间的数据不平衡,我知道这会影响准确性,因为贝叶斯定理考虑了单词出现在给定文本属于特定类别的文本,以便计算出文本在文本中包含该单词的情况下属于所述类别的概率。这是我第一次尝试,我计划获取更多数据,正如你可能想象的那样,A 级是最容易获得的,而 C 级是最难获得的。

然而,我对应该如何创建和改进这个模型以及班级数据集应该如何平衡感到困惑。如果我要为每个类别获取完全成比例的数据,例如每个类别 1000 行数据,或者对我已有的数据进行欠采样,这是否也会影响准确性?因为在现实中,C类出现的可能性实际上肯定小于A类和B类。实际上,类的比例与文本属于所述类的概率有些相似(尽管因人而异)。由于贝叶斯定理还考虑了一段文本作为特定类别的概率,以便计算文本作为特定类别的概率(假设它包含一个单词),因此不会创建具有相同数量的平衡数据集每个类的行数会降低准确性,因为没有考虑生产中出现的类的概率,因为概率现在基本上是恒定的,并且对于所有类来说都是相同的,因为它们同样出现。尽管使所有类相等确实消除了由于数据集不平衡而导致的单词偏差。

所以我不确定如何有效地创建这个模型,因为我觉得数据不平衡,模型认为 C 类中的常见单词更有可能出现在 A 类电子邮件中,而实际上它们可能更常见于C 但扭曲的数据造成了这种偏差。另一方面,使类别平衡忽略了一段文本作为特定类别的实际概率,尽管我无法计算每个类别对所有个体而言准确的通用概率(这是否意味着使类别平衡对准确性的负面影响较小?)。非常感谢任何指导,我对此很陌生。

machine-learning scikit-learn nlp naivebayes
2个回答
1
投票

太棒了;不要欠采样/过采样,而是使用文本增强。

欠采样/过采样在某些情况下可能会有帮助,但在只有 800 行数据的情况下肯定没有帮助。欠采样会使您丢失太多有价值的数据,而过采样会导致不可靠的结果。更好的解决方案是增强您的数据。

Snorkel 这样的库允许您通过以概率的方式交换或替换形容词、动词、名词等的同义词来增强文本数据,这可以大大增加您的数据大小。我强烈建议您看一下它,因为它在学术界和工业界都经常使用。

关于您对平衡数据集的担忧,有一些因素可能会影响结果。示例包括数据集的大小和过度拟合、样本分类时特征的独特性、异常值的存在等。仅仅因为您有 10k 个癌症患者样本和 5k 个健康人样本,并不一定意味着您的预测会是现实生活数据集上的比例为 2:1。这是因为模型不一定要记住每个类别的分布,而是要记住“特征如何”导致类别的预测。 因此,在您的示例中,如果每个类别都有独特的单词,通常可以将一个类别与另一个类别区分开来,那么您需要提供其他类别中这些单词的样本,以确保您不会在这些单词上过度拟合每个类别。


0
投票

如果可能,建议您从平衡的训练集(相同数量的“A”、“B”和“C”案例)进行训练。之后可以对

实际先验类别分布进行修正,请参阅后验概率修正公式 来自不同类别的案例子集必须从完整数据集中随机选择。这是为了避免任何选择偏差。

© www.soinside.com 2019 - 2024. All rights reserved.