朴素贝叶斯方法是一组基于贝叶斯定理的有监督学习算法,在给定类变量值的情况下,假设每一对特征之间的条件独立性为“朴素”假设。贝叶斯定理给出了类变量y1和相关特征向量x1到xn之间的关系式:
使用朴素的条件独立性假设:
对所有的i, 这个关系可以被简化成:
由于P(x1,x2,......,xn)是输入的常量,我们可以使用以下分类规则:
本文所用的是 鸢尾花卉数据集。Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类 。
#导入程序所用到的包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn import metrics
# 读入数据
X_all,y_all=load_iris(return_X_y=True)
for i in range(0,4):
plt.subplot(2,2,i+1)
plt.hist(X_all[:,i], bins=20)
plt.xlabel('X%d' %(i+1), fontsize=15)
plt.ylabel('Count', fontsize=13)
划分训练集和测试集,20%数据为测试数据,80%数据为训练数据
# 划分训练集与测试集
X_train,X_test,y_train,y_test=train_test_split(X_all,y_all,test_size=0.2)
假设为正态分布,建立朴素贝叶斯模型,并对模型进行训练,训练后的模型在model中。
# 训练朴素贝叶斯模型
model=GaussianNB()
model.fit(X_train,y_train)
对模型进行预测,对测试集使用predict
# 模型预测
y_pred=model.predict(X_test)
y_comparison=np.vstack((list(y_test), list(y_pred)))
y_comparison=y_comparison.T
打开y_comparison后可以发现真实结果和预测结果,差别不是很大,说明精度较高。
计算精度和错误率,用预测值结果和测试集数据得到精度值。错误率=1-精度
# 计算精度和错误率
accuracy=metrics.accuracy_score(y_test,y_pred)
print("测试集精度:%.4f" %accuracy)
print("测试集错误率:%.4f" %(1-accuracy))
计算混淆矩阵:
# 计算并绘制混淆矩阵
cmatrix=metrics.confusion_matrix(y_test,y_pred)
plt.matshow(cmatrix, cmap=plt.cm.Blues)
for i in range(len(cmatrix)):
for j in range(len(cmatrix)):
plt.annotate(cmatrix[j, i], xy=(i, j), horizontalalignment='center', verticalalignment='center', fontsize=20)
plt.title('Confusion matrix', fontsize=20)
plt.xticks(ticks=range(0,3), fontsize=20)
plt.yticks(ticks=range(0,3), fontsize=20)
plt.ylabel('True label', fontsize=20)
plt.xlabel('Predicted label', fontsize=20)
结果如图:
由于结果是分为三类,故混淆矩阵大小为3×3。
计算查准率和查全率:
# 计算宏查准率和宏查全率
macro_precision=metrics.precision_score(y_test, y_pred, average='macro')
macro_recall=metrics.recall_score(y_test, y_pred, average='macro')
print("宏查准率:%.4f\n宏查全率:%.4f" %(macro_precision,macro_recall))
# 计算微查准率和微查全率
micro_precision=metrics.precision_score(y_test, y_pred, average='micro')
micro_recall=metrics.recall_score(y_test, y_pred, average='micro')
print("微查准率:%.4f\n微查全率:%.4f" %(micro_precision,micro_recall))
得到结果:
宏查准率:0.9583
宏查全率:0.9762
微查准率:0.9667
微查全率:0.9667
说明模型精度不错,具有可靠性。
以下是完整代码:
#导入程序所需要的包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn import metrics
# 读入数据
X_all,y_all=load_iris(return_X_y=True)
for i in range(0,4):
plt.subplot(2,2,i+1)
plt.hist(X_all[:,i], bins=20)
plt.xlabel('X%d' %(i+1), fontsize=15)
plt.ylabel('Count', fontsize=15)
# 划分训练集与测试集
X_train,X_test,y_train,y_test=train_test_split(X_all,y_all,test_size=0.2)
# 训练朴素贝叶斯模型
model=GaussianNB()
model.fit(X_train,y_train)
# 模型预测
y_pred=model.predict(X_test)
y_comparison=np.vstack((list(y_test), list(y_pred)))
y_comparison=y_comparison.T
# 计算精度和错误率
accuracy=metrics.accuracy_score(y_test,y_pred)
print("测试集精度:%.4f" %accuracy)
print("测试集错误率:%.4f" %(1-accuracy))
# 计算并绘制混淆矩阵
cmatrix=metrics.confusion_matrix(y_test,y_pred)
plt.matshow(cmatrix, cmap=plt.cm.Blues)
for i in range(len(cmatrix)):
for j in range(len(cmatrix)):
plt.annotate(cmatrix[j, i], xy=(i, j), horizontalalignment='center', verticalalignment='center', fontsize=20)
plt.title('Confusion matrix', fontsize=20)
plt.xticks(ticks=range(0,3), fontsize=20)
plt.yticks(ticks=range(0,3), fontsize=20)
plt.ylabel('True label', fontsize=20)
plt.xlabel('Predicted label', fontsize=20)
# 计算宏查准率和宏查全率
macro_precision=metrics.precision_score(y_test, y_pred, average='macro')
macro_recall=metrics.recall_score(y_test, y_pred, average='macro')
print("宏查准率:%.4f\n宏查全率:%.4f" %(macro_precision,macro_recall))
# 计算微查准率和微查全率
micro_precision=metrics.precision_score(y_test, y_pred, average='micro')
micro_recall=metrics.recall_score(y_test, y_pred, average='micro')
print("微查准率:%.4f\n微查全率:%.4f" %(micro_precision,micro_recall))