在python中实现互补朴素贝叶斯?


9

问题

我曾尝试在标记的犯罪数据集上使用朴素贝叶斯,但结果却很差(准确性为7%)。朴素贝叶斯的运行速度比我一直在使用的其他算法要快得多,因此我想尝试找出分数为何如此之低的原因。

研究

阅读后,我发现朴素贝叶斯应与平衡数据集一起使用,因为它偏向于频率较高的类。由于我的数据不平衡,因此我想尝试使用互补朴素贝叶斯,因为它专门用于处理数据偏斜。在描述该过程的论文中,该应用程序用于文本分类,但是我不明白为什么该技术在其他情况下不起作用。您可以在这里找到我所指的论文。简而言之,想法是根据类未出现的情况使用权重。

经过一些研究,我能够找到Java的实现,但是不幸的是,我不了解任何Java,只是我对算法的理解不足以实现自己。

在哪里可以找到python的实现?如果不存在,我应该如何自己实施呢?

Answers:


5

朴素贝叶斯应该能够处理不平衡的数据集。回想一下贝叶斯公式是

P(yx)=P(xy)P(y)P(x)P(xy)P(y)

所以考虑了先前的。P(xy)P(y)P(y)

在您的情况下,也许您过拟合并且需要一些平滑处理?您可以从+1平滑开始,看看它是否有任何改进。在python中,当使用numpy时,我将通过以下方式实现平滑:

table = # counts for each feature 
PT = (table + 1) / (table + 1).sum(axis=1, keepdims=1)

请注意,这为您提供了多项朴素贝叶斯-仅适用于分类数据。

我还可以建议以下链接:http : //www.itshared.org/2015/03/naive-bayes-on-apache-flink.html。这是关于在Apache Flink上实现Naive Bayes的。虽然是Java,但可能会为您提供一些理论,以便您更好地理解算法。


您可能是正确的,看起来朴素的贝叶斯仅具有文本分类的不平衡问题。您能解释一下什么是平滑吗?

您看过链接了吗?在那里解释。简而言之,当估计有时在训练和平滑过程中永远不会看到,从而通过向所有特征添加一些额外的计数(在拉普拉斯或+1平滑的情况下)来确保它不会破坏分类器的性能。 。P(xy)x
Alexey Grigorev 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.