Machine learning 如何创建具有不平衡数据的精确多类多项式朴素贝叶斯

Machine learning 如何创建具有不平衡数据的精确多类多项式朴素贝叶斯,machine-learning,scikit-learn,nlp,naivebayes,Machine Learning,Scikit Learn,Nlp,Naivebayes,我使用sklearn创建了一个基本的多类朴素贝叶斯文本分类器。我有3个类和大约800行数据。A类有564行,B类有159行,C类有82行。正如你所看到的,数据在类之间是不平衡的,我理解这可能会影响准确性,因为贝叶斯定理考虑了文本中出现单词的概率,假设文本属于特定类,以便计算文本属于所述类的概率,假设文本中有单词文本。这是我第一次尝试,我计划获得更多的数据,正如你可能想象的那样,类A是最容易获得的,而类C是最难获得的 然而,对于如何创建和改进这个模型以及类数据集应该如何平衡,我感到困惑。如果我要为

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

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


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

Tldr;不要采样不足/过采样,而是使用文本增强

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

有这样的库允许您通过交换或替换形容词、动词、名词等的同义词来扩充文本数据,这可能会大大增加数据量。我强烈建议你看看它,因为它经常在学术界和工业界使用

关于平衡数据集的问题,有几个因素会影响结果。示例包括数据集的大小和过度拟合、样本分类的特征有多明显、是否存在异常值等。仅仅因为有1万个癌症患者样本和5万个健康人样本,并不一定意味着您的预测将是现实生活数据集的2:1比例。这是因为该模型不一定记住每个类的分布,而是特征如何导致类的预测

因此,在您的示例中,如果每个类都有区别于其他类的独特单词,那么您需要提供其他类中这些单词的示例,以确保您没有在这些单词上过度拟合每个类


希望这有帮助

当从不平衡的训练集中训练时,分类器参数的方差会增大。你先前的类分布越不均匀(A,B,C),这个问题就越严重

如果可能,建议您从平衡的训练集中进行训练(a、B和C案例数量相同)。之前的实际班级分布的校正可以在之后进行,请参阅


必须从完整数据集中随机选择不同类别的案例子集。这是为了避免任何选择偏差。

我肯定会得到800多行,希望能多出几千行。数据扩充很有趣,因此本质上分类文本中的一些单词会被同义词替代,而扩充文本也会被类似地归类?我仍然不知道如何处理不平衡的数据,因为是的,而模型会记住“特征如何导致类的预测”就像你说的;贝叶斯定理的一部分实际上是在不考虑特征的情况下,上述类别发生的基本概率。它乘以条件概率,如果文本是所讨论的类,那么单词出现的概率是多少。该乘积除以该词在所有文本中出现的基本概率。因此,该分布确实影响概率和分类,以癌症/健康比率2:1为例。如果我想知道一段文字是否属于癌症类别,因为它在电子邮件中包含每个单词,那么计算的一部分将是癌症类别的基本概率,即10/15,因此在乘以与特征相关的条件概率时要考虑到这一点/