一、贝叶斯分类器详解
贝叶斯分类器是一类分类算法的总称,这类算法均以贝叶斯定理为理论基础。贝叶斯分类器的分类原理是通过先验概率,利用贝叶斯公式计算出后验概率,选择最大后验概率所对应的分类结果。
贝叶斯准则
其中,P(c)是先验概率,P(x|c)样本x相对于;类标记c的类条件概率,或称为似然(likelihood);P(x)是用于归一化的证据因子。对于给定样本x,证据因子与类标记无关,则估计P(c|x)可转换为基于训练数据D来估计鲜艳P(c)和似然P(x|c)。类先验概率P(c)可通过各类样本出现的频率来进行估计。对于类条件概率P(x|c),一种常用策略是先假定其具有某种确定的概率分布形式,再基于训练样本对概率分布的参数进行估计。
对于朴素贝叶斯分类器,朴素(naive)的含义是各个特征属性之间是相互独立的。例如,在计算p(w|ci)时,我们将特征向量w展开为独立子特征,则转化为,这里我们有假设所有特征都独立,即可以使用以下公式来计算,这就是利用了朴素的原则。(wi和下文的xi是相同含义,表示各个特征属性分量)
基于以上,朴素贝叶斯分类器的训练过程就是基于训练集D来估计类先验概率P(c),并为每个特征属性估计条件概率P(xi|c)。对于类先验概率,在有足够独立同分布训练样本的条件下,通过计算各类样本占总样本数的比例来计算。计算条件概率时,对于离散属性而言,,对于连续属性考虑概率密度函数,
式中的两个未知参数均值和方差极大似然法估计得到。假设概率密度函数,则参数的极大似然估计为:
这就是说,通过极大似然法得到的正态分布均值就是样本均值,方差就是的均值。
为了避免其他属性携带的信息被训练集中未出现的属性值“抹去”,在估计概率值时通常要进行“平滑”(smoothing),常用拉普拉斯修正。具体来说,令N表示训练集D中可能的类别数,Ni表示第i个属性可能的取值数,修正为和。
拉普拉斯修正避免了因训练集样本不充分而导致概率估值为零的问题,并且在训练集变大时,修正过程所引入的先验的影响也会逐渐变得可忽略,使得估值逐渐趋向于实际的概率值。
二、Sklearn程序代码及实验结果
GaussianNB、MultinomialNB、BernoulliNB分别是高斯贝叶斯分类器、多项式贝叶斯分类器、伯努利贝叶斯分类器,他们的区别就在于假设了不同的P(xi|c)分布。
完整代码:
- from sklearn import datasets, cross_validation, naive_bayes
- import matplotlib.pyplot as plt
- # 可视化手写识别数据集Digit Dataset
- def show_digits():
- digits = datasets.load_digits()
- fig = plt.figure()
- for i in range(20):
- ax = fig.add_subplot(4, 5, i+1)
- ax.imshow(digits.images[i], cmap = plt.cm.gray_r, interpolation=’nearest’)
- plt.show()
- show_digits()
- # 加载Digit数据集
- def load_data():
- digits = datasets.load_digits()
- return cross_validation.train_test_split(digits.data, digits.target,
- test_size = 0.25, random_state = 0)
- def test_GaussianNB(*data):
- X_train, X_test, y_train, y_test = data
- cls = naive_bayes.GaussianNB()
- cls.fit(X_train, y_train)
- print(‘GaussianNB Classifier’)
- print(‘Training Score: %.2f’ % cls.score(X_train, y_train))
- print(‘Test Score: %.2f’ % cls.score(X_test, y_test))
- X_train, X_test, y_train, y_test = load_data()
- test_GaussianNB(X_train, X_test, y_train, y_test)
- def test_MultinomialNB(*data):
- X_train, X_test, y_train, y_test = data
- cls = naive_bayes.MultinomialNB()
- cls.fit(X_train, y_train)
- print(‘MultinomialNB Classifier’)
- print(‘Training Score: %.2f’ % cls.score(X_train, y_train))
- print(‘Test Score: %.2f’ % cls.score(X_test, y_test))
- X_train, X_test, y_train, y_test = load_data()
- test_MultinomialNB(X_train, X_test, y_train, y_test)
- def test_BernoulliNB(*data):
- X_train, X_test, y_train, y_test = data
- cls = naive_bayes.BernoulliNB()
- cls.fit(X_train, y_train)
- print(‘BernoulliNB Classifier’)
- print(‘Training Score: %.2f’ % cls.score(X_train, y_train))
- print(‘Test Score: %.2f’ % cls.score(X_test, y_test))
- X_train, X_test, y_train, y_test = load_data()
- test_BernoulliNB(X_train, X_test, y_train, y_test)
from sklearn import datasets, cross_validation, naive_bayes
import matplotlib.pyplot as plt
实验结果:
- GaussianNB Classifier
- Training Score: 0.86
- Test Score: 0.83
- MultinomialNB Classifier
- Training Score: 0.91
- Test Score: 0.91
- BernoulliNB Classifier
- Training Score: 0.87
- Test Score: 0.85
GaussianNB Classifier
Training Score: 0.86
Test Score: 0.83
MultinomialNB Classifier
Training Score: 0.91
Test Score: 0.91
BernoulliNB Classifier
Training Score: 0.87
Test Score: 0.85