机器学习-高斯贝叶斯分类器-多项式贝叶斯分类器-伯努利贝叶斯分类器

机器学习-贝叶斯分类器

观察Digit Dataset数据集。Digit Dataset是scikit-learn自带的手写识别数据集:

#加载包
from sklearn import datasets,model_selection,naive_bayes
import numpy as np
import matplotlib.pyplot as plt
#观察Digit Dataset数据集。Digit Dataset是scikit-learn自带的手写识别数据集
def show_digits():
    digits=datasets.load_digits()
    fig = plt.figure()
    print("vector from images 0:",digits.data[0])
    for i in range(25):
        ax = fig.add_subplot(5,5,i+1)
        ax.imshow(digits.images[i],cmap=plt.cm.gray_r,interpolation='nearest')
    plt.show()
#调用show_digits()函数
show_digits()

运行结果分析:

vector from images 0: [ 0.  0.  5. 13.  9.  1.  0.  0.  0.  0. 13. 15. 10. 15.  5.  0.  0.  3.
 15.  2.  0. 11.  8.  0.  0.  4. 12.  0.  0.  8.  8.  0.  0.  5.  8.  0.
  0.  9.  8.  0.  0.  4. 11.  0.  1. 12.  7.  0.  0.  2. 14.  5. 10. 12.
  0.  0.  0.  0.  6. 13. 10.  0.  0.  0.]

在这里插入图片描述

采用分层抽样,保证测试样本集中各类别样本的比例与原始样本集中各类别样本的比例相同

每一张图片都是8*8大小的手写数字位图,scikit-learn将样本转换成64维的向量;Vector from images 0代表了图片的灰度值。

加载scikit-learn自带的digits数据集:

#加载scikit-learn自带的digits数据集
def load_data():
    '''
    加载用于分类问题的数据集。这里使用scikit-learn自带的digits数据集
    '''
    digits=datasets.load_digits()
    return model_selection.train_test_split(digits.data,digits.target,test_size=0.25,random_state=0)
#调用load_data()函数
load_data()

元组依次是:训练样本集、测试样本集、训练样本集对的应标签值、测试样本集对应的标签值。

高斯贝叶斯分类器

测试高斯贝叶斯分类器GaussianNB函数:

def test_GaussianNB(*data):
    X_train,X_test,y_train,y_test = data
    cls = naive_bayes.GaussianNB()
    cls.fit(X_train,y_train)#训练模型
    print('Training Score: %.2f' % cls.score(X_train,y_train))
    print('Testing Score : %.2f' % cls.score(X_test,y_test))

产生用于分类问题的数据集:

X_train,X_test,y_train,y_test=load_data()

调用test_GaussianNB函数:

test_GaussianNB(X_train,X_test,y_train,y_test)

运行结果分析:

Training Score: 0.86
Testing Score : 0.83

从结果可以看出高斯贝叶斯分类器对训练数据集的预测准确率为86%,对测试数据集的预测准确率为83%。

多项式贝叶斯分类器

多项式贝叶斯分类器MultinomialNB模型:

def test_MultinomialNB(*data):
    X_train,X_test,y_train,y_test=data
    cls=naive_bayes.MultinomialNB()
    cls.fit(X_train,y_train)
    print('Training Score: %.2f' % cls.score(X_train,y_train))
    print('Testing Score : %.2f' % cls.score(X_test,y_test))

调用test_MultinomialNB函数:

test_MultinomialNB(X_train,X_test,y_train,y_test)

运行结果分析:

Training Score: 0.91
Testing Score : 0.91

从结果可以看出,多项式贝叶斯分类器对训练数据集的预测准确率为91%,对测试数据集的预测准确率为91%。

检验不同的阿尔法对多项式贝叶斯分类器的预测性能的影响:

def test_MultinomialNB_alpha(*data):
    X_train,X_test,y_train,y_test=data
    alphas=np.logspace(-2,5,num=200)
    train_scores=[]
    test_scores=[]
    for alpha in alphas:
        cls=naive_bayes.MultinomialNB(alpha=alpha)
        cls.fit(X_train,y_train)
        train_scores.append(cls.score(X_train,y_train))
        test_scores.append(cls.score(X_test,y_test))   
    #绘图
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.plot(alphas,train_scores,label="Training Score")
    ax.plot(alphas,test_scores,label="Testing Score")
    ax.set_xlabel(r"$\alpha$")
    ax.set_ylabel("score")
    ax.set_ylim(0,1.0)
    ax.set_title("MultinomialNB")
    ax.set_xscale("log")
    plt.show()

调用 test_BernoulliNB_ninarize函数:

test_MultinomialNB_alpha(X_train,X_test,y_train,y_test)

运行结果分析:
在这里插入图片描述
自摘

伯努利贝叶斯分类器

伯努利贝叶斯分类器BernoulliNB模型:

def test_BernoulliNB(*data):
    X_train,X_test,y_train,y_test=data
    cls=naive_bayes.BernoulliNB()
    cls.fit(X_train,y_train)
    print('Training Score: %.2f'% cls.score(X_train,y_train))
    print('Testing Score: %.2f'% cls.score(X_test,y_test))
#调用 test_BernoulliNB 函数
test_BernoulliNB(X_train,X_test,y_train,y_test)

调用 test_BernoulliNB 函数:

test_BernoulliNB(X_train,X_test,y_train,y_test)

运行结果分析:

Training Score: 0.87
Testing Score: 0.85

通过结果可以看到伯努利贝叶斯分类器对训练数据集的预测准确率为87%,对测试数据集的预测准确率为85%。

考察binarize的参数对伯努利贝叶斯分类器的预测性能的影响:

def test_BernoulliNB_alpha(*data):
    X_train,X_test,y_train,y_test=data
    alphas=np.logspace(-2,5,num=200)
    train_scores=[]
    test_scores=[]
    for alpha in alphas:
        cls=naive_bayes.BernoulliNB(alpha=alpha)
        cls.fit(X_train,y_train)
        train_scores.append(cls.score(X_train,y_train))
        test_scores.append(cls.score(X_test,y_test))    
    #绘图
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.plot(alphas,train_scores,label="Training Score")
    ax.plot(alphas,test_scores,label="Testing Score")
    ax.set_xlabel(r"$\alpha$")
    ax.set_ylabel("score")
    ax.set_ylim(0,1.0)
    ax.set_title("BernoulliNB")
    ax.set_xscale("log")
    ax.legned(loc="best")
    plt.show()

调用 test_BernoulliNB_ninarize函数:

test_BernoulliNB_alpha(X_train,X_test,y_train,y_test) 

运行结果分析:在这里插入图片描述
从图片看出,alpha>100之后,随着的增长,预测准确率在下降。原因和上面一样。

考察binarize的参数对伯努利贝叶斯分类器的预测性能的影响 :

def test_BernoulliNB_binarize(*data):
    X_train,X_test,y_train,y_test=data
    min_x=min(np.min(X_train.ravel()),np.min(X_test.ravel()))-0.1
    max_x=max(np.max(X_train.ravel()),np.max(X_test.ravel()))+0.1
    binarizes=np.linspace(min_x,max_x,endpoint=True,num=100)
    train_scores=[]
    test_scores=[]
    for binarize in binarizes:
        cls=naive_bayes.BernoulliNB(binarize=binarize)
        cls.fit(X_train,y_train)
        train_scores.append(cls.score(X_train,y_train))
        test_scores.append(cls.score(X_test,y_test))    
    #绘图
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.plot(binarizes,train_scores,label="Training Score")
    ax.plot(binarizes,test_scores,label="Testing Score")
    ax.set_xlabel(r"$\alpha$")
    ax.set_ylabel("score")
    ax.set_ylim(0,1.0)
    ax.set_xlim(min_x-1,max_x+1)
    ax.set_title("BernoulliNB")
    ax.legned(loc="best")
    plt.show()  

调用test_BernoulliNB_binarize函数:

test_BernoulliNB_binarize(X_train,X_test,y_train,y_test)  

运行结果分析:
在这里插入图片描述

从图片可以看出当binarize太小时,预测准确率断崖式下降,这是因为此时所有特征的所有值都视为0,此时,对于伯努利贝叶斯分类器来说,所有特征都是平坦的,与之前的样本没有区别,也就无法预测。

从图片可以看出当binarize太大时,预测准确率断崖式下降,这是因为此时所有特征的所有值都视为1,此时,对于伯努利贝叶斯分类器来说,所有特征都是平坦的,与之前的样本没有区别,也事无法预测。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步至万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值