实验三:朴素贝叶斯算法实验
【实验目的】
理解朴素贝叶斯算法原理,掌握朴素贝叶斯算法框架。
【实验内容】
针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测;
熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测;
【实验报告要求】
对照实验内容,撰写实验过程、算法及测试结果;
代码规范化:命名规则、注释;
查阅文献,讨论朴素贝叶斯算法的应用场景。
色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 碍滑 | 是 |
乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 碍滑 | 是 |
浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 碍滑 | 是 |
青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
1.针对下表中的数据,编写python程序实现朴素贝叶斯算法(不使用sklearn包),对输入数据进行预测
(1)
import numpy as np import pandas as pd import random get_data=pd.read_excel("D:/data/西瓜.xlsx") get_data
(2)
#求先验概率函数 def prob1(data,cls_val): cnt=0.0 for index,row in data.iterrows(): if row[-1]==cls_val: cnt+=1 return cnt/len(data) # 统计每种属性的取值可能,拉普拉斯修正用 def prob2(data,cls_val): cnt=0.0 for index,row in data.iterrows(): if row[-1]==cls_val: cnt+=1 return (cnt+1)/(len(data)+len(set(data['好瓜']))) # 计算条件概率 # data为样本数据和分类结果;cls_val是分类字符,是/否;attr_index是属性的序号;attr_val是属性的取值;s是属性的特征数目 def conditionp1(data,cls_val,attr_index,attr_val): cnt1=0.0 cnt2=0.0 for index,row in data.iterrows(): if row[-1]==cls_val: cnt1+=1 if row[attr_index]==attr_val: cnt2+=1 return cnt2/cnt1 # 统计每种属性的取值可能,拉普拉斯修正用 def conditionp2(data,cls_val,attr_index,attr_val,s): cnt1=0.0 cnt2=0.0 for index,row in data.iterrows(): if row[-1]==cls_val: cnt1+=1 if row[attr_index]==attr_val: cnt2+=1 return (cnt2+1)/(cnt1+s) # 利用后验概率计算先验概率 # data为样本数据和分类结果;testlist是新样本数据列表;cls_y、cls_n是分类字符,是/否;s是属性的特征数目 def nb(data,testlist,cls_y,cls_n): py=prob1(data,cls_y) pn=prob1(data,cls_n) for i,val in enumerate(testlist): py*=conditionp1(data,cls_y,i,val) pn*=conditionp1(data,cls_n,i,val) if (py==0) or (pn==0): py=prob2(data,cls_y) pn=prob2(data,cls_n) for i,val in enumerate(testlist): s=len(set(data[data.columns[i]])) py*=conditionp2(data,cls_y,i,val,s) pn*=conditionp2(data,cls_n,i,val,s) if py>pn: result=cls_y else: result=cls_n return {cls_y:py,cls_n:pn,'好瓜':result} #测试结果 tsvec = ['青绿','蜷缩','沉闷','稍糊','稍凹','硬滑'] prob = nb(data,tsvec,'是','否') print("测试结果:",prob)
2.熟悉sklearn库中的朴素贝叶斯算法,使用sklearn包编写朴素贝叶斯算法程序,对输入数据进行预测
from sklearn import datasets from pandas import DataFrame import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB#这种分类器使用高斯分布为先验分布 from sklearn.naive_bayes import MultinomialNB#这种分类器使用多项式分布为先验分布 from sklearn.naive_bayes import BernoulliNB#这种分类器使用伯努利分布为先验分布 iris=datasets.load_iris() df=DataFrame(iris.data,columns=iris.feature_names) pd.set_option('display.width',None) df['target']=list(iris.target) # print(df) X=df.iloc[:,0:4].values Y=df.iloc[:,4].values X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.3,random_state=0)#划分测试集与训练集 sc=StandardScaler() sc.fit(X) standard_train=sc.transform(X_train) standard_test=sc.transform(X_test) #由于iris的属性是连续值,我们优先使用正态分布作为先验分布,即使用GaussianNB GaussianClassifier=GaussianNB() GaussianClassifier.fit(standard_train,Y_train) result=GaussianClassifier.predict(standard_test) print("测试集合的y值:",list(Y_test)) print("高斯先验朴素贝叶斯预测的的y值:",list(result)) print("预测的正确率为:",GaussianClassifier.score(standard_test,Y_test)) # 我们顺带着测试多项式分布作为先验分布的分类器(实测发现,多项式分布中自变量不允许出现负数,所以不能使用标准化的数据,只能使用原数据) mc=MultinomialNB() mc.fit(X_train,Y_train) result=mc.predict(X_test) print("测试集合的y值:",list(Y_test)) print("多项式先验朴素贝叶斯预测的的y值:",list(result)) print("预测的正确率为:",GaussianClassifier.score(X_test,Y_test)) #测试伯努利分布作为先验分布的分类器 bc=BernoulliNB() bc.fit(standard_train,Y_train) result=bc.predict(standard_test) print("测试集合的y值:",list(Y_test)) print("伯努利先验朴素贝叶斯预测的的y值:",list(result)) print("预测的正确率为:",GaussianClassifier.score(standard_test,Y_test))
优点
朴素贝叶斯算法假设了数据集属性之间是相互独立的,因此算法的逻辑性十分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素贝叶斯的分类性能不会有太大的差异。换句话说就是朴素贝叶斯算法的健壮性比较好,对于不同类型的数据集不会呈现出太大的差异性。当数据集属性之间的关系相对比较独立时,朴素贝叶斯分类算法会有较好的效果。
缺点
属性独立性的条件同时也是朴素贝叶斯分类器的不足之处。数据集属性的独立性在很多情况下是很难满足的,因为数据集的属性之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果大大降低
应用场景
朴素贝叶斯算法在文字识别, 图像识别方向有着较为重要的作用。 可以将未知的一种文字或图像,根据其已有的分类规则来进行分类,最终达到分类的目的。
现实生活中朴素贝叶斯算法应用广泛,如文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律