机器学习-贝叶斯分类器
观察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,此时,对于伯努利贝叶斯分类器来说,所有特征都是平坦的,与之前的样本没有区别,也事无法预测。