朴素贝叶斯分类器是与线性模型非常相似的一种分类器,它的训练速度往往更快,但是泛化能力比线性分类器稍差。
朴素贝叶斯分类器高效的原因是:通过单独查看每个特征来学习参数,并从每个特征中收集简单的类别统计数据。
scikit-learn中实现了3中朴素贝叶斯分类器:GaussianNB、BernoulliNB、MultinomialNB。GaussianNB可用于任意连续数据,BernoulliNB假定输入数据为二分类数据,MultinomialNB假定输入数据为计数数据,也就是每个特征代表某个对象的整数计数。BernoulliNB、MultinomialNB主要用于文本数据的分类。
BernoulliNB分类器计算每个类别中每个特征不为0的元素个数,举例:
import numpy as np
X=np.array([[0,1,0,1]
,[1,0,1,1]
,[0,0,0,1]
,[1,0,1,0]])
y=np.array([0,1,0,1])
counts={}
for label in np.unique(y):
counts[label]=X[y==label].sum(axis=0)
print('特征数:\n{}'.format(counts))
上述例子中,先对数据点分类,第1、3个数据点为类别0,其他的为类别1。
在类别0里,特征为1 的个数分别为0、1、0、2个;
类别1里,特征为1的个数分别为2、0、2、1个。
MultinomialNB和GaussianNB计算的统计数据类型略有不同,MultinomialNB计算的是每个类别中每个特征的平均值,GaussianNB会保存每个类别中每个特征的平均值和标准差。
MultinomialNB和BernoulliNB预测公式的形式与线性模型完全相同,但是朴素贝叶斯模型coef_的含义与线性模型稍有不同。
MultinomialNB和BernoulliNB都只有一个参数alpha,用于控制模型复杂度。alpha的原理是,算法向数据中添加alpha这么多的虚拟数据点,这些数据点对所有特征取正值,这样将统计数据平滑化。alpha越大,平滑性越强,模型复杂度越低。alpha值对模型性能不重要,但是调整这个参数通常会使精度略有提高。
GaussianNB主要用于高维数据,而另外两种广泛用在稀疏计数数据,比如文本数据。MultinomialNB性能通常优于BernoulliNB,特别是包含很多非零特征的数据集上。