朴素贝叶斯分类器作为基于贝叶斯定理的监督学习算法,曾入选“数据挖掘十大算法”。本文结合个人学习笔记和scikit-learn中朴素贝叶斯算法的官方文档,总结朴素贝叶斯算法的基本思想原理和scikit-learn中三种类型的朴素贝叶斯分类器的适用范围,供以后学习使用。
朴素贝叶斯分类算法的基本原理:
最小化分类错误率的最优贝叶斯分类是使后验概率P(y|x)最大化,即:
根据贝叶斯公式:
朴素贝叶斯假设每个样本的所有属性相互独立,则有:
所以我们的贝叶斯公式可转化为:
这就是朴素贝叶斯的表达式。
1、Gaussian Naive Bayes(GaussianNB)
Gaussian Naive Bayes算法假设服从
所以对于连续属性,GaussianNB分类器是个不错的选择,这里附上scikit-learn官方文档中的一个例子的Python代码:
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> Y = np.array([1, 1, 1, 2, 2, 2])
>>> from sklearn.naive_bayes import GaussianNB
>>> clf = GaussianNB()
>>> clf.fit(X, Y)
GaussianNB(priors=None)
>>> print(clf.predict([[-0.8, -1]]))
[1]
>>> clf_pf = GaussianNB()
>>> clf_pf.partial_fit(X, Y, np.unique(Y))
GaussianNB(priors=None)
>>> print(clf_pf.predict([[-0.8, -1]]))
[1]
2、
Multinomial Naive Bayes(MultinomialNB)
MultinomialNB分类器假设样本属性服从多重伯努利分布,所以官方文档中特别提到了这种分类器适用于文本分类。所以对于
属性非连续,属性值取值离散的样本(一般有多种离散值),MultinomialNB是个不错的选择。官方文档中的代码:
>>> import numpy as np
>>> X = np.random.randint(5, size=(6, 100))
>>> y = np.array([1, 2, 3, 4, 5, 6])
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2:3]))
[3]
3、
Bernoulli Naive Bayes(BernoulliNB
)
BernoulliNB分类器顾名思义,伯努利贝叶斯分类器,是一种特殊的
MultinomialNB,其样本的
所有特征只取两种属性值(0,1),所以BernoulliNB分类器基于公式:
来计算
。官方文档中的样例代码:
>>> import numpy as np
>>> X = np.random.randint(2, size=(6, 100))
>>> Y = np.array([1, 2, 3, 4, 4, 5])
>>> from sklearn.naive_bayes import BernoulliNB
>>> clf = BernoulliNB()
>>> clf.fit(X, Y)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2:3]))
[3]
三种类型的朴素贝叶斯分类器,其适用的样本范围不同。本文参考scikit-learn官方文档的简单总结,以期以后在使用时能够用上。