1.9 朴素贝叶斯

朴素贝叶斯方法是一组基于贝叶斯定理的有监督学习算法,在给定类变量值的情况下,假设每一对特征之间的条件独立性为“朴素”假设。贝叶斯定理给出了类变量和相关特征向量之间的关系式:

使用朴素的条件独立性假设:

对所有的, 这个关系可以被简化成:

由于是输入的常量,我们可以使用以下分类规则:

我们可以用最大后验(MAP)估计来估计,前者是训练集中类的相对频率。

不同的朴素贝叶斯分类器主要根据它们对的分布所作的假设而不同。

尽管他们的假设显然过于简单化,但是朴素贝叶斯分类器在许多现实世界的情况下已经工作地相当好,最出名的就是文档分类和垃圾邮件过滤。它们需要少量的训练数据来估计必要的参数。(为什么朴素贝叶斯工作良好,以及它适用于哪些数据,请参见下面的引用。)

与更复杂的方法相比,朴素贝叶斯学习器和分类器可以非常快。类条件特征分布的解耦意味着每个分布可以独立地估计为一维分布。这反过来又有助于缓解因维度诅咒而产生的问题。

另一方面,虽然朴素贝叶斯被认为是一种很好的分类器,但它是一种糟糕的估计器,因此来自于predict_proba的概率输出不应受到太大的重视。

参考

H. Zhang (2004). The optimality of Naive Bayes. Proc. FLAIRS.

1.9.1 高斯朴素贝叶斯

GaussianNB实现了高斯朴素贝叶斯分类算法。假设特征的可能性是高斯分布的:

用极大似然估计参数

>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.naive_bayes import GaussianNB
>>> X, y = load_iris(return_X_y=True)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(X_train, y_train).predict(X_test)
>>> print("Number of mislabeled points out of a total %d points : %d"
...       % (X_test.shape[0], (y_test != y_pred).sum()))
Number of mislabeled points out of a total 75 points : 4

1.9.2 多项式朴素贝叶斯

MultinomialNB实现了多项式朴素贝叶斯,是文本分类中使用的两个经典朴素贝叶斯变体之一(其中数据通常表示为词向量,尽管在实际中 tf-idf向量也是很好的)。分布由每个类的向量参数化, 其中n是特征数(在文本分类中,词汇表的大小),是特征出现在属于y类的样本中的概率

参数是用平滑的最大似然(即相对频率计数)估计的:

其中,是训练集类样本中特征出现的次数,类所有特征的总数。

平滑先验为在学习样本中没有出现的特征而设计,防止了进一步计算中的零概率。设置称为拉普拉斯平滑,而称为Lidstone平滑。

1.9.3 补充朴素贝叶斯

ComplementNB 实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种自适应算法,特别适用于不平衡的数据集。具体而言,CNB使用来自每个类的补充的统计数据来计算模型的权重。CNB的发明者经验性地表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务方面经常优于MNB(通常以相当大的幅度)。计算权重的程序如下:

其中对不在类中的所有记录求和, 要么是记录中的的计数, 要么是tf-idf形式的值, 就像MNB中的一个光滑的超参数, 同时

第二个归一化解决了较长记录在MNB中支配参数估计的趋势。分类规则是:

也就是说, 记录被分配给最糟糕的匹配度的类。

参考

Rennie, J. D., Shih, L., Teevan, J., & Karger, D. R. (2003). Tackling the poor assumptions of naive bayes text classifiers. In ICML (Vol. 3, pp. 616-623).

1.9.4 伯努利朴素贝叶斯

BernoulliNB实现了按多元伯努利分布的数据的朴素贝叶斯训练和分类算法,即可能有多个特征,但每个特征都被假定为一个二元值(Bernoulli,boole)变量。因此,该类要求样本被表示为二值化的特征向量;如果传递任何其他类型的数据,BernoulliNB实例可能会对其输入进行二值化(取决于binarize参数)。

伯努利朴素贝叶斯的决策规则基于:

它不同于多项式朴素贝叶斯的规则,因为它明确地惩罚一个特征的不出现,它是类的指示,而多项式朴素贝叶斯会简单地忽略一个未出现的特征。

在文本分类的情况下,可以使用单词出现向量(而不是单词统计向量)来训练和使用该分类器。BernoulliNB可能在一些数据集上表现更好,特别是那些文档较短的数据集。如果时间允许,最好对这两种模式都进行评估。

参考

C.D. Manning, P. Raghavan and H. Schütze (2008). Introduction to Information Retrieval. Cambridge University Press, pp. 234-265.

A. McCallum and K. Nigam (1998). A comparison of event models for Naive Bayes text classification. Proc. AAAI/ICML-98 Workshop on Learning for Text Categorization, pp. 41-48.

V. Metsis, I. Androutsopoulos and G. Paliouras (2006). Spam filtering with Naive Bayes – Which Naive Bayes? 3rd Conf. on Email and Anti-Spam (CEAS).

1.9.5 类别朴素贝叶斯

CategoricalNB 对分类分布的数据实现了类别朴素贝叶斯算法。它假设由索引描述的每个特征都有自己的分类分布。它假设由索引描述的每个特征都有自己的绝对分布。

对于训练集中的每一个特征CategoricalNB估计类中的每个特征的分类分布,样本的索引集定义为,m为样本数。

给定类的特征类的概率估计为:

其中是样本中出现类的次数, 这些样本属于类别属于类的样本数,是平滑参数,是特征的可用类别数。

CategoricalNB 假设样本矩阵是编码的(例如,在OrdinalEncoder的帮助下),这样每个特征的所有类别都用数字表示,其中是特征的可用类别数。

1.9.6 外核朴素贝叶斯模型拟合

朴素贝叶斯模型可以解决整个训练集不能导入内存的大规模分类问题。为了处理这种情况, MultinomialNB, BernoulliNB, andGaussianNB 公开了一个可以像其他分类器一样递增地使用的partial_fit方法, 这可以在文本文档的核外分类中被证实。所有朴素贝叶斯分类器都支持样本加权。

fit方法相反, partial_fit 的需要传递的第一个是所有预期类标签的列表。

有关scikit-learn中可用策略的概述,请参见文本文档的核外分类文档。

注意:朴素贝叶斯模型的partial_fit方法调用引入了一些计算开销。建议使用尽可能大的数据块,即到RAM允许的大小。