### 朴素贝叶斯文本分类在某一类别上失败的原因是什么?

我正在实现朴素贝叶斯分类器用于文本类别检测。我有37个类别,在测试集上的准确率约为36%。

为了提高准确率,我决定按照许多来源建议的方式实现37个二元分类器(其中之一是如何提高朴素贝叶斯分类器的准确率?),这些分类器将针对给定文本回答:

specific_category OR everything_else

我会通过顺序应用这些分类器来确定文本的类别。

但是,我在第一个分类器上遇到了问题,它总是无法正确分类到“specific_category”类别中。

我有训练数据 – 37个类别,每个类别有100个相同大小的文档。对于每个类别,我通过互信息标准选择了50个特征(特征只是单词)。

为了举例说明,我使用了两个类别“农业”和“其他一切”(除了农业)。

对于“农业”类别:

所有文档中单词的数量(http://nlp.stanford.edu/IR-book/pdf/13bayes.pdf中的分母第一项,(13.7))W_agriculture = 31649。词汇量大小V_agriculture = 6951。未知词(UNK)的对数概率P(UNK|agriculture) = -10.56类别的对数概率P(agriculture) = log(1/37) = -3.61(我们有37个相同大小的文档类别)

对于“其他一切”类别:

W_everything_else = 1030043V_everything_else = 44221P(UNK|everything_else) = -13.89P(everything_else) = log(36/37) = -0.03

然后我有一个与农业无关的文本,假设它主要由未知词(UNK)组成。它有270个单词,这些单词对于“农业”和“其他一切”类别大多是未知的。假设对于“其他一切”类别有260个单词是UNK,其余10个是已知的。

然后,当我计算概率时

P(text|agriculture) = P(agriculture) + SUM(P(UNK|agriculture) for 270 times) P(text|everything_else) = P(everything_else) + SUM(P(UNK|everything_else) for 260 times) + SUM(P(word|everything_else) for 10 times)

在最后一行中,我们将260个单词计为UNK,10个单词计为已知类别。

主要问题。由于P(UNK|agriculture) >> P(everything_else)(对于对数来说要大得多),这270个P(UNK|agriculture)项的影响超过了文本中每个单词的P(word|everything_else)的总和。因为

SUM(P(UNK|agriculture) for 270 times) = -2851.2SUM(P(UNK|everything_else) for 260 times) = -3611.4

第一个总和要大得多,无法通过P(agriculture)或10个单词的P(word|everything_else)的总和来纠正,因为差异巨大。然后我总是无法正确分类到“农业”类别,尽管文本不属于该类别。

问题是:我是不是遗漏了什么?或者我应该如何处理大量的UNK词及其在小类别中的概率显著更高的情况?

更新:尝试通过将“农业”类别的训练数据扩大(只是将文档连接36次)以使文档数量相等。这对一些类别有所帮助,对其他类别帮助不大,我怀疑这是由于单词数量和词典大小较少,P(UNK|specific_category)变大,在270次求和时超过了P(UNK|everything_else)。

所以这种方法似乎对训练数据中的单词数量和词汇大小非常敏感。如何克服这个问题?也许使用二元/三元语法会有所帮助?


回答:

好的,明白了。你似乎有些困惑,但我会给你一些基本的指导。

首先,即使你采用一对多的方案,你也不能为不同的类别使用不同的词汇表。如果这样做,随机变量的事件空间会不同,因此概率不可比较。你需要为所有类别决定一个共同的词汇表。

其次,抛弃未知标记。它对你没有帮助。忽略任何不在你决定的词汇表中的词。

最后,我不知道你在做什么概率求和。你对取对数有些困惑,我想。这个公式是不正确的:

P(text|agriculture) = P(agriculture) + SUM(P(UNK|agriculture) for 270 times)

正确的应该是:

p(text|agriculture) = p(agriculture) * p(unk|agriculture)^270 * p(all other words in doc|agriculture)

如果取对数,这将变为:

log( p(t|a) ) = log(p(agriculture)) + 270*log(p(unk|agriculture)) + log(p(all other words|agriculture))

最后,如果你的分类器是正确的,没有真正的理由相信一对多会比直接的多类分类更好。实证上可能如此,但理论上它们的效果应该是等同的。无论如何,你不应该顺序应用决策,而是进行所有n个二元问题,并将文本分配到正概率最高的类别中。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注