您现在的位置是:首页 >学无止境 >机器学习:基于多项式贝叶斯对蘑菇毒性分类预测分析网站首页学无止境

机器学习:基于多项式贝叶斯对蘑菇毒性分类预测分析

i阿极 2023-06-02 08:00:03
简介机器学习:基于多项式贝叶斯对蘑菇毒性分类预测分析

在这里插入图片描述

基于多项式贝叶斯对蘑菇毒性分类预测分析

作者:i阿极

作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


专栏案例:机器学习案例
机器学习(一):线性回归之最小二乘法
机器学习(二):线性回归之梯度下降法
机器学习(三):基于线性回归对波士顿房价预测
机器学习(十四):基于逻辑回归对超市销售活动预测分析
机器学习(十五):基于神经网络对用户评论情感分析预测
机器学习(十六):线性回归分析女性身高与体重之间的关系
机器学习(十七):基于支持向量机(SVM)进行人脸识别预测
机器学习(十八):基于逻辑回归对优惠券使用情况预测分析
机器学习(十九):基于逻辑回归对某银行客户违约预测分析
机器学习(二十):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测


1、多项式贝叶斯算法原理

多项贝叶斯算法是贝叶斯分类算法的一种,适用于多类别离散型特征的分类问题。在多项贝叶斯算法中,假设每个类别 c c c都有一组特征 x 1 , x 2 , … , x n x_1,x_2,dots,x_n x1,x2,,xn,这些特征都是离散型的,每个特征的取值为 x i , 1 , x i , 2 , … , x i , k x_{i,1},x_{i,2},dots,x_{i,k} xi,1,xi,2,,xi,k,其中 k k k为第 i i i个特征的取值数量。则多项贝叶斯算法通过以下公式计算后验概率:

P ( c ∣ x 1 , x 2 , … , x n ) = P ( c ) ∏ i = 1 n P ( x i ∣ c ) ∑ c ′ P ( c ′ ) ∏ i = 1 n P ( x i ∣ c ′ ) Pleft(c mid x_1, x_2, ldots, x_n ight)=frac{P(c) prod_{i=1}^n Pleft(x_i mid c ight)}{sum_{c^{prime}} Pleft(c^{prime} ight) prod_{i=1}^n Pleft(x_i mid c^{prime} ight)} P(cx1,x2,,xn)=cP(c)i=1nP(xic)P(c)i=1nP(xic)

P ( c ) P(c) P(c)为类别 c c c在训练数据集中的概率, P ( x i ∣ c ) P(x_i|c) P(xic)为给定类别 c c c时特征 x i x_i xi的概率。

对于离散型特征, P ( x i ∣ c ) P(x_i|c) P(xic)可以使用多项式分布来计算,即:

P ( x i ∣ c ) = count ⁡ ( x i , c ) + α count ⁡ ( c ) + α × k i Pleft(x_{i} mid c ight)=frac{operatorname{count}left(x_{i}, c ight)+alpha}{operatorname{count}(c)+alpha imes k_{i}} P(xic)=count(c)+α×kicount(xi,c)+α

c o u n t ( x i , c ) count(x_i,c) count(xi,c)表示训练数据集中类别为 c c c,特征 x i x_i xi取值为 x i , j x_{i,j} xi,j的样本数量, c o u n t ( c ) count(c) count(c)表示训练数据集中类别为 c c c的样本数量, k i k_i ki表示第 i i i个特征的取值数量, α alpha α为拉普拉斯平滑系数,常取值为1。拉普拉斯平滑的作用是防止某些特征在某个类别下的取值为0,导致整个后验概率为0的情况发生。

通过计算后验概率,多项贝叶斯算法会将样本分到概率最大的类别中。在实际应用中,多项贝叶斯算法常用于文本分类、垃圾邮件识别等问题。

2、模型举例理解

为了更好的理解 P ( x i ∣ c ) P(x_i|c) P(xic)公式,通过例子来实现。

假设影响女孩是否参加相亲活动的重要因素有三个,分别是男孩的职业、受教育水平和收入状况;如果女孩参加相亲活动,则对应的Meet变量为1,否则为0。

职务学历收入是否参加
公务员本科1
公务员本科1
非公务员本科0
非公务员本科1
公务员硕士1
非公务员本科0
公务员本科1
非公务员硕士0
非公务员硕士0
非公务员硕士1

我们的目标是:对于高收入的公务员,并且其学历为硕士的男生来说,女孩是否愿意参与他的相亲。使用多项式贝叶斯分类器实现。

首先,计算因变量各类别频率:

P (  Meet  = 0 ) = 4 / 10 = 0.4 P (  Meet  = 1 ) = 6 / 10 = 0.6 egin{array}{l} P( ext { Meet }=0)=4 / 10=0.4 \ P( ext { Meet }=1)=6 / 10=0.6 end{array} P( Meet =0)=4/10=0.4P( Meet =1)=6/10=0.6

其次,计算单变量条件概率:

P (  Occupation  =  公务员  ∣  Meet  = 0 ) = 0 + 1 4 + 2 × 1 = 1 6 P (  Occupation  =  公务员  ∣  Meet  = 1 ) = 4 + 1 6 + 2 × 1 = 5 8 P (  Edu  =  硕士  ∣  Meet  = 0 ) = 2 + 1 4 + 2 × 1 = 3 6 P (  Edu  =  硕 士 ∣  Meet  = 1 ) = 2 + 1 6 + 2 × 1 = 3 8 P (  Income  =  高  ∣  Meet  = 0 ) = 0 + 1 4 + 2 × 1 = 1 6 P (  Income  =  高  ∣  Meet  = 1 ) = 3 + 1 6 + 2 × 1 = 4 8 egin{array}{l} P( ext { Occupation }= ext { 公务员 } mid ext { Meet }=0)=frac{0+1}{4+2 imes 1}=frac{1}{6} \ P( ext { Occupation }= ext { 公务员 } mid ext { Meet }=1)=frac{4+1}{6+2 imes 1}=frac{5}{8} \ P( ext { Edu }= ext { 硕士 } mid ext { Meet }=0)=frac{2+1}{4+2 imes 1}=frac{3}{6} \ P( ext { Edu }= ext { 硕 } 士 mid ext { Meet }=1)=frac{2+1}{6+2 imes 1}=frac{3}{8} \ P( ext { Income }= ext { 高 } mid ext { Meet }=0)=frac{0+1}{4+2 imes 1}=frac{1}{6} \ P( ext { Income }= ext { 高 } mid ext { Meet }=1)=frac{3+1}{6+2 imes 1}=frac{4}{8} end{array} P( Occupation = 公务员  Meet =0)=4+2×10+1=61P( Occupation = 公务员  Meet =1)=6+2×14+1=85P( Edu = 硕士  Meet =0)=4+2×12+1=63P( Edu =   Meet =1)=6+2×12+1=83P( Income =   Meet =0)=4+2×10+1=61P( Income =   Meet =1)=6+2×13+1=84

最后,计算贝叶斯后验概率:

P ( Meet  = 0 ∣  Occupation  =  公务员  ,  Edu  = 硕士 , Income = 高 ) = 4 10 × 1 6 × 3 6 × 1 6 = 1 180 P( ext{Meet } = 0mid ext { Occupation }= ext { 公务员 } , ext { Edu }=硕士, ext{Income} = 高) = frac{4}{10} imesfrac{1}{6} imesfrac{3}{6} imesfrac{1}{6} = frac{1}{180} P(Meet =0 Occupation = 公务员 , Edu =硕士,Income=)=104×61×63×61=1801
P ( Meet  = 1 ∣  Occupation  =  公务员  ,  Edu  = 硕士 , Income = 高 ) = 6 10 × 5 8 × 3 8 × 4 8 = 18 256 P( ext{Meet } = 1mid ext { Occupation }= ext { 公务员 } , ext { Edu }=硕士, ext{Income} = 高) = frac{6}{10} imesfrac{5}{8} imesfrac{3}{8} imesfrac{4}{8} = frac{18}{256} P(Meet =1 Occupation = 公务员 , Edu =硕士,Income=)=106×85×83×84=25618

由结果得,当男生为高收入的公务员,并且受教育水平也很高时,女生愿意见面的概率约为0.0703、不愿意见面的概率约为0.0056。所以根据 a r g m a x P ( C i ) P ( X ∣ C i ) argmax P(C_i)P(X|C_i) argmaxP(Ci)P(XCi)的原则,最终女生会选择参加这位男生的相亲。

3、实验环境

Python 3.9

Anaconda

Jupyter Notebook

4、多项式贝叶斯模型-蘑菇毒性判别

4.1数据说明

数据集信息:

该数据集包括对应于姬松茸和鳞片菌科 23 种有鳃蘑菇的假设样本的描述(第 500-525 页)。每个物种都被确定为绝对可食用、绝对有毒或未知可食性且不推荐。后一类与有毒的一类结合在一起。该指南明确指出,没有简单的规则来确定蘑菇的可食用性;对于毒橡树和常春藤,没有像“传单三,顺其自然”这样的规则。

属性信息:
1.cap-shape: bell=b,conical=c,convex=x,flat=f, knobbed=k,sunken=s
2.cap-surface: fibrous=f,grooves=g,scaly=y,smooth=s
3.cap-color: brown=n,buff=b,cinnamon=c,gray=g,green=r, pink=p,purple=u,red=e,white=w,yellow=y
4.bruises?: bruises=t,no=f
5. odor: almond=a,anise=l,creosote=c,fishy=y,foul=f, musty=m,none=n,pungent=p,spicy=s
6. gill-attachment: attached=a,descending=d,free=f,notched=n
7. gill-spacing: close=c,crowded=w,distant=d
8. gill-size: broad=b,narrow=n
9. gill-color: black=k,brown=n,buff=b,chocolate=h,gray=g, green=r,orange=o,pink=p,purple=u,red=e, white=w,yellow=y
10. stalk-shape: enlarging=e,tapering=t
11. stalk-root: bulbous=b,club=c,cup=u,equal=e, rhizomorphs=z,rooted=r,missing=?
12. stalk-surface-above-ring: fibrous=f,scaly=y,silky=k,smooth=s
13. stalk-surface-below-ring: fibrous=f,scaly=y,silky=k,smooth=s
14. stalk-color-above-ring: brown=n,buff=b,cinnamon=c,gray=g,orange=o, pink=p,red=e,white=w,yellow=y
15. stalk-color-below-ring: brown=n,buff=b,cinnamon=c,gray=g,orange=o, pink=p,red=e,white=w,yellow=y
16. veil-type: partial=p,universal=u
17. veil-color: brown=n,orange=o,white=w,yellow=y
18. ring-number: none=n,one=o,two=t
19.ring-type: cobwebby=c,evanescent=e,flaring=f,large=l, none=n,pendant=p,sheathing=s,zone=z
20. spore-print-color: black=k,brown=n,buff=b,chocolate=h,green=r, orange=o,purple=u,white=w,yellow=y
21. population: abundant=a,clustered=c,numerous=n, scattered=s,several=v,solitary=y
22. habitat: grasses=g,leaves=l,meadows=m,paths=p, urban=u,waste=w,woods=d

4.2数据准备

导入数据

# 导入第三方包
import pandas as pd
# 读取数据
mushrooms = pd.read_csv(r"D:CSDNmachine learningdatamushrooms.csv")
# 数据的前5行
mushrooms.head()

在这里插入图片描述

将字符型数据作因子化处理,将其转换为整数型数据

columns = mushrooms.columns[1:]
for column in columns:
    mushrooms[column] = pd.factorize(mushrooms[column])[0]
mushrooms.head()

在这里插入图片描述

4.3划分训练集和测试集

from sklearn import model_selection
# 将数据集拆分为训练集合测试集
Predictors = mushrooms.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(mushrooms[Predictors], mushrooms['type'], 
                                                                 test_size = 0.25, random_state = 10)

4.4多项式贝叶斯模型建立

from sklearn import naive_bayes
from sklearn import metrics
import seaborn as sns
import matplotlib.pyplot as plt
# 构建多项式贝叶斯分类器的“类”
mnb = naive_bayes.MultinomialNB()
# 基于训练数据集的拟合
mnb.fit(X_train, y_train)
# 基于测试数据集的预测
mnb_pred = mnb.predict(X_test)

4.5绘制混淆矩阵

mnb_pred = mnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(mnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()

在这里插入图片描述

4.6查看模型预测的准确率

# 模型的预测准确率
print('模型的准确率为:
',metrics.accuracy_score(y_test, mnb_pred))
print('模型的评估报告:
',metrics.classification_report(y_test, mnb_pred))

在这里插入图片描述

由图发现,模型在测试数据集上的整体预测准确率为87%,无毒蘑菇的预测覆盖率为92%,有毒蘑菇的预测覆盖率为82%。

4.7计算正例的预测概率,用于生成ROC曲线的数据

from sklearn import metrics
# 计算正例的预测概率,用于生成ROC曲线的数据
y_score = mnb.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test.map({'edible':0,'poisonous':1}), y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

在这里插入图片描述


总结

对于离散型自变量的数据集而言,在分类问题上并非都可以使用多项式贝叶斯分类器,如果自变量在特定y值下的概率不服从多项式分布的话,分类器的效果是不理想的。通常情况下,会利用多项式贝叶斯模型作文本分类,如判断邮件是否为垃圾邮件,用户评论是否为正面等等。

📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。