我正在使用简单的朴素贝叶斯算法在 mahout 中制作文档分类器。目前,我拥有的 98% 的数据(文档)属于 A 类,只有 2% 属于 B 类。我的问题是,由于 A 类文档与 B 类文档的百分比差距如此之大,那么分类器还能准确训练吗?
我正在考虑做的是忽略一大堆 A 类文档并“操纵”我拥有的数据集,以便文档的组成没有那么大的差距。因此,我最终将拥有的数据集将包含 30% 的 B 类和 70% 的 A 类。但是,这样做有什么我不知道的影响吗?
我正在使用简单的朴素贝叶斯算法在 mahout 中制作文档分类器。目前,我拥有的 98% 的数据(文档)属于 A 类,只有 2% 属于 B 类。我的问题是,由于 A 类文档与 B 类文档的百分比差距如此之大,那么分类器还能准确训练吗?
我正在考虑做的是忽略一大堆 A 类文档并“操纵”我拥有的数据集,以便文档的组成没有那么大的差距。因此,我最终将拥有的数据集将包含 30% 的 B 类和 70% 的 A 类。但是,这样做有什么我不知道的影响吗?
其中很多都涉及到作为性能衡量标准的“准确性”有多好,这取决于您的问题。如果将“A”误分类为“B”与将“B”误分类为“A”一样糟糕/正常,那么除了将所有内容都标记为“A”之外,没有什么理由做任何事情,因为你知道它会可靠地得到你有 98% 的准确率(只要不平衡的分布代表真实的分布)。
在不知道您的问题(如果准确性是您应该使用的衡量标准)的情况下,我能给出的最佳答案是“这取决于数据集”。使用标准朴素托架,您有可能获得超过 99% 的准确度,尽管这不太可能。特别是对于朴素贝叶斯,您可以做的一件事是禁用先验(先验本质上是每个类的比例)。尽管模型参数是从不均匀数量的数据中学习的,但这具有假装每个类别发生的可能性相同的效果。
您提出的解决方案是一种常见做法,有时效果很好。另一种做法是为较小的班级创建假数据(如何取决于您的数据,对于文本文档,我不知道有什么特别好的方法)。另一种做法是增加代表性不足的类中数据点的权重。
您可以搜索“不平衡分类”并找到有关这些类型问题的更多信息(它们是较难的问题之一)。
如果准确性实际上不是您问题的一个很好的衡量标准,您可以搜索有关“成本敏感分类”的更多信息,这应该会有所帮助。
您不一定要对数据集 A 进行采样以减少其实例。有几种方法可用于从不平衡数据集中进行有效学习,例如多数欠采样(正是您所做的)、少数过采样、SMOTE 等。以下是这些方法的经验比较:http: //machinelearning.org/proceedings/icml2007 /论文/62.pdf
或者,您可以为分类器定义自定义成本矩阵。换句话说,假设 B=Positive 类,你可以定义 cost(False Positive) < cost(False Negative)。在这种情况下,分类器的输出将偏向正类。这是一个非常有用的教程:http ://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.164.4418&rep=rep1&type=pdf