机器学习算法——贝叶斯分类

朴素贝叶斯方法是一组基于贝叶斯定理的有监督学习算法,在给定类变量值的情况下,假设每一对特征之间的条件独立性为“朴素”假设。贝叶斯定理给出了类变量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))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值