认识高斯朴素贝叶斯
class sklearn.naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09)
如果Xi是连续值,通常Xi的先验概率为高斯分布(也就是正态分布),即在样本类别Ck中,Xi的值符合正态分布。以此来估计每个特征下每个类别上的条件概率。对于每个特征下的取值,高斯朴素贝叶斯有如下公式:
其中, μ k \mu_k μk和 σ k 2 \sigma_k^2 σk2是正态分布的期望和方差,可通过极大似然估计求得。
对于任意一个Y的取值,贝叶斯都以求解最大化P(xi=Xi(test)|Y=Ck)为目标,这样才能够比较在不同标签下的样本究竟更更靠近哪一个取值。
μ k \mu_k μk为样本类别Ck中,所有Xi的平均值。 σ k 2 \sigma_k^2 σk2为在样本类别Ck中,所有Xi的方差。对于一个连续的样本值,带入正态分布的公式,就能够得到一个P(xi=Xi(test)|Y=Ck)的概率取值。
这个类包含两个参数:
prior
可输入任何类数组结构,形状为(n_classes,)
表示类的先验概率。如果指定,则不根据数据调整先验,如果不指定,则自行根据数据计算先验概率P(Y)。
var_smoothing
浮点数,可不填(默认值= 1e-9)
在估计方差时,为了追求估计的稳定性,将所有特征的方差中最⼤大的方差以某个比例添加到估计的方差中。这个比例,由var_smoothing参数控制。
但在实例化的时候,不需要对高斯朴素贝叶斯类输入任何参数,调用的接口也全部是sklearn中比较标准的一些搭配,可以说是一个非常轻量量级的类,操作非常容易。但过于简单也意味着贝叶斯没有太多的参数可以调整,因此贝叶斯算法的成长空间并不是太大,如果贝叶斯算法的效果不是太理想,一般都会考虑换模型。
无论如何,先来进行一次预测试吧:
#高斯朴素贝叶斯
'''手写数字识别,数据是标记过的手写数字的图片,
即采集足够多的手写样本,选择合适模型,进行模型训练,
最后验证手写识别程序的正确性'''
#导入需要的库和数据
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits #load_digits手写数字数据集
from sklearn.model_selection import train_test_split
#定义数据集
digits = load_digits()
#数据集赋值
X, y = digits.data, digits.target
#切分数据集
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
#把数据所代表的图片显示出来
images_and_labels = list(zip(digits.images,digits.target))
plt.figure(figsize=(4,3.5),dpi=100) #宽高,单位是inches, 分辨率
for index, (image,label) in enumerate(images_and_labels[:12]):
plt.subplot(3,4,index+1) #行数,列数(从1开始),第几张图(按行数)
plt.axis("off") #关闭坐标轴
plt.imshow(image,cmap=plt.cm.gray_r,interpolation="nearest")
# cmap设置色图到灰色 interpolation 像素间颜色连接方法
plt.title("Digit: %i" % label, fontsize=6)
'''图片数据一般使用像素点作为特征,
由于图片的特殊性,相邻像素点间的数值(RGB三通道色)往往是接近的,
故可以采用矩阵变换的方法压缩矩阵,得到相对较少的特征数
数据总共包含1797张图片,每张图片的尺寸是8×8
像素大小,共有十个分类(0-9),每个分类约180个样本.
所有的图片数据保存在digits.image里,
数据分析的时候需要转换成单一表格,即行为样本列为特征(类似的还有文档词矩阵),
此案例中这个表格已经在digits.data里,可以通过digits.data.shape查看数据格式'''
print("shape of raw image data: {0}".format(digits.images.shape))
print("shape of data: {0}".format(digits.data.shape))
shape of raw image data: (1797, 8, 8)
shape of data: (1797, 64)
#建模,探索建模结果
gnb = GaussianNB().fit(Xtrain,Ytrain)
#查看分数
acc_score = gnb.score(Xtest,Ytest)
acc_score
0.8592592592592593
#查看预测结果
Y_pred = gnb.predict(Xtest)
Y_pred
array([6, 1, 3, 0, 4, 5, 0, 8, 3, 8, 6, 8, 7, 8, 8, 8, 5, 9, 5, 6, 5, 4,
7, 4, 8, 2, 7, 2, 8, 9, 2, 8, 3, 6, 0, 3, 8, 8, 1, 5, 2, 8, 8, 9,
2, 2, 0, 7, 3, 6, 7, 2, 8, 0, 5, 4, 1, 9, 4, 0, 5, 8, 9, 1, 7, 8,
7, 5, 8, 2, 4, 4, 8, 2, 6, 1, 2, 1, 7, 8, 8, 5, 9, 4, 3, 6, 9, 7,
4, 2, 4, 8, 0, 5, 7, 7, 7, 4, 7, 8, 8, 7, 0, 7, 2, 1, 9, 9, 8, 7,
1, 5, 1, 8, 0, 4, 8, 9, 5, 6, 4, 8, 3, 8, 0, 6, 8, 6, 7, 6, 1, 8,
5, 0, 8, 2, 1, 8, 8, 6, 6, 0, 2, 4, 7, 8, 9, 5, 9, 4, 7, 8, 8, 6,
7, 0, 8, 4, 7, 2, 2, 6, 4, 4, 1, 0, 3, 4, 3, 8, 7, 0, 6, 9, 7, 5,
5, 3, 6, 1, 6, 6, 2, 3, 8, 2, 7, 3, 1, 1, 6, 8, 8, 8, 7, 7, 2, 5,
0, 0, 8, 6, 6, 7, 6, 0, 7, 5, 5, 8, 4, 6, 5, 1, 5, 1, 9, 6, 8, 8,
8, 2,