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

数据挖掘 机器学习 分类 Python 朴素贝叶斯分类器
2021-10-09 07:33:09

问题

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

研究

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

在做了一些研究之后,我能够在 Java 中找到一个实现,但不幸的是我不知道任何 Java,而且我对算法的理解还不够好,无法自己实现。

问题

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

2个回答

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

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 上实现朴素贝叶斯。虽然它是 Java,但也许它会给你一些理论,你需要更好地理解算法。

我在 scikit-learn 中的 Complement Naive Bayes 实现可以在这里找到。