机器学习测试笔记(21)——朴素贝叶斯算法

简介: 机器学习测试笔记(21)——朴素贝叶斯算法

1.朴素贝叶斯概率统计概念


1.1数学公式

                    P(B|A)· P(A)

P(A|B) = ——————————

                        P(B)

注:P(A|B):B已经成真,A发生的概率。

比如:

A事件:天要下暴雨,概率,P(A)60%

B事件:小明不来我家,概率,P(B)80%

天已经下暴雨,小明不来我家的概率,P(B|A)90%

那么,小明已经告知他不来我家,下暴雨的概率P(A|B) = 90%*60%/80%=67.5%


1.2实际案例

一周天气预报数据


刮风

闷热

多云

预报有雨

周一

周二

周三

周四

周五

周六

周日


这周过去了,实际情况本周3天下雨,4天不下雨,对应向量为y= [1,0,0,1,0,1,0],对应矩阵为X=[[1,1,0,1],[0,1,1,0],[1,0,0,1],[0,1,0,0],[1,0,1,0],[0,1,0,0],[0,0,1,0]]


def my_BernoulliNB():
        X =  np.array([[1,1,0,1],[0,1,1,0],[1,0,0,1],[0,1,0,0],[1,0,1,0],[0,1,0,0],[0,0,1,0]])
        y =  np.array([1,1,0,0,1,0,1])
        counts={}
for label in  np.unique(y):
                 counts[label] = X[y==label].sum(axis=0)
        print("特性统计:\n{}".format(counts))


输出

特性统计:
{0: array([1, 2, 0, 1]), 1: array([2, 2, 3, 1])}


表示:

  • y=0,没雨,1天刮风,2天闷热,0天多云,1天预报有雨
  • y=1,有雨,1天刮风,2天闷热,3天多云,1天预报有雨

简单就可以看出来,下雨好像与多云有关,多云就下雨,不多云就不下雨,让我们用程序来看一下贝叶斯算法出来的结果。


clf = BernoulliNB()
clf.fit(X,y)
        #明天多云
Next_Day =  [[0,0,1,0]]
pre1 =  clf.predict(Next_Day)
print(pre1)


输出

[1]

多云,果然下雨。


print(clf.predict_proba(Next_Day))

输出


[[0.16275954 0.83724046]]

Next_Day的没雨的概率为16.28%,有雨的概率为83.72%


接下来再看一个数据,另一天刮风、闷热、预报有雨,但不多云。

Another_Day =  [[1,1,0,1]]
        pre2 =  clf.predict(Another_Day)
        print(pre2)


输出

[0]

意料之中,没有雨。


print(clf.predict_proba(Another_Day))


输出


[[0.67464862 0.32535138]]

Another_Day的没雨的概率为67.46%,有雨的概率为32.54%


1.3朴素贝叶斯分类

朴素贝叶斯包括:贝努利贝叶斯(BernoulliNB)、高斯贝叶斯(GaussianNB)和多项式贝叶斯(MultinomailNB)。在sklearn 中分别用sklearn.naive_bayes.BernoulliNBsklearn.naive_bayes.GaussianNBsklearn.naive_bayes.MultinomialNB类来分别实现贝努利贝叶斯(BernoulliNB)、高斯贝叶斯(GaussianNB)和多项式贝叶斯(MultinomailNB)。下面我们来一一进行介绍。

2. 贝叶斯的实现


2.1贝努利贝叶斯(BernoulliNB)

from sklearn.datasets import make_blobs
def bernoulliNB():
       X,y =  make_blobs(n_samples=500,random_state=8,centers=8)
       X_train, X_test,  y_train, y_test = train_test_split(X, y, random_state=8)
       nb = BernoulliNB()
       nb.fit(X_train,y_train)
       print('训练集得分:  {:.2%}'.format(nb.score(X_train,y_train)))
       print('测试集得分:  {:.2%}'.format(nb.score(X_test,y_test)))
#分别将样本的两个特征值创建图像的横轴和纵轴
       x_min,x_max =  X_train[:,0].min()-0.5,X_train[:,0].max()+0.5
       y_min,y_max =  X_train[:,1].min()-0.5,X_train[:,1].max()+0.5
       xx, yy =  np.meshgrid(np.arange(x_min, x_max, .02),np.arange(y_min, y_max, .02))
#给每个样本分配不同的颜色
       Z =  nb.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
       plt.pcolormesh(xx,yy,Z,cmap=plt.cm.summer,shading='auto')
#用散点把样本表示出来
       plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,s=20,edgecolors='k')
       plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,s=20,marker='*')
       plt.xlim(xx.min(),xx.max())  
       plt.ylim(yy.min(),yy.max())
       plt.rcParams['font.family']  = ['sans-serif']
       plt.rcParams['font.sans-serif']  = ['SimHei']
       plt.title(u"贝努利贝叶斯")
       plt.show()


输出


训练集得分: 38.13%
测试集得分:  37.60%


看来贝努利贝叶斯效果不太好。


2.2 高斯贝叶斯(GaussianNB)

def gaussianNB():
       X,y =  make_blobs(n_samples=500,random_state=8,centers=8)
       X_train, X_test,  y_train, y_test = train_test_split(X, y, random_state=8)
       gnb = GaussianNB()
       gnb.fit(X_train,y_train)
       print('训练集得分:  {:.2%}'.format(gnb.score(X_train,y_train)))
       print('测试集得分:  {:.2%}'.format(gnb.score(X_test,y_test)))
#分别将样本的两个特征值创建图像的横轴和纵轴
       x_min,x_max =  X_train[:,0].min()-0.5,X_train[:,0].max()+0.5
       y_min,y_max =  X_train[:,1].min()-0.5,X_train[:,1].max()+0.5
       xx, yy =  np.meshgrid(np.arange(x_min, x_max, .02),np.arange(y_min, y_max, .02))
#给每个样本分配不同的颜色
       Z =  gnb.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
       plt.pcolormesh(xx,yy,Z,cmap=plt.cm.summer,shading='auto')
#用散点把样本表示出来
       plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,s=20,edgecolors='k')
       plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,s=20,marker='*')
plt.xlim(xx.min(),xx.max())  
       plt.ylim(yy.min(),yy.max())
       plt.rcParams['font.family']  = ['sans-serif']
       plt.rcParams['font.sans-serif']  = ['SimHei']
       plt.title(u"高斯贝叶斯")
       plt.show()


输出

训练集得分: 85.60%
测试集得分: 91.20%


这个效果还是非常好的。


2.3 多项式贝叶斯(MultinomailNB)

from sklearn.preprocessing import MinMaxScaler
def multinomialNB():
       X,y = make_blobs(n_samples=500,random_state=8,centers=8)
       X_train, X_test,  y_train, y_test = train_test_split(X, y, random_state=8)
       scaler = MinMaxScaler()
       scaler.fit(X_train)
       X_train  = scaler.transform(X_train)
       X_test  = scaler.transform(X_test)
       mnb = MultinomialNB()
       mnb.fit(X_train,y_train)
       print('训练集得分:  {:.2%}'.format(mnb.score(X_train,y_train)))
       print('测试集得分:  {:.2%}'.format(mnb.score(X_test,y_test)))
#分别将样本的两个特征值创建图像的横轴和纵轴
       x_min,x_max =  X_train[:,0].min()-0.5,X_train[:,0].max()+0.5
       y_min,y_max =  X_train[:,1].min()-0.5,X_train[:,1].max()+0.5
       xx, yy =  np.meshgrid(np.arange(x_min, x_max, .02),np.arange(y_min, y_max, .02))
#给每个样本分配不同的颜色
Z =  mnb.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
       plt.pcolormesh(xx,yy,Z,cmap=plt.cm.summer,shading='auto')
#用散点把样本表示出来
       plt.scatter(X_train[:,0],X_train[:,1],c=y_train,cmap=plt.cm.cool,s=20,edgecolors='k')
       plt.scatter(X_test[:,0],X_test[:,1],c=y_test,cmap=plt.cm.cool,s=20,marker='*')
       plt.xlim(xx.min(),xx.max())  
       plt.ylim(yy.min(),yy.max())
       plt.rcParams['font.family']  = ['sans-serif']
       plt.rcParams['font.sans-serif']  = ['SimHei']
       plt.title(u"多项式叶斯")
       plt.show()


注意,由于MultinomailNB要求数据集必须为非负,所有我们需要对make_blobs产生的数据进行MinMaxScaler()处理,注意红色字部分。


输出

训练集得分: 13.33%
测试集得分: 9.60%


可以看出,多项式贝叶斯效果比贝努利贝叶斯更差。


3 示例

我们现在用乳腺癌数据来用高斯贝叶斯分析下第310个数据是良性还是恶性。

from sklearn.datasets import load_breast_cancer
def gaussianNB_for_breast_cancer():
       cancer =  load_breast_cancer()
       X , y =  cancer.data,cancer.target
       X_train,X_test,y_train,y_test  = train_test_split(X,y,random_state=38)
       gnb = GaussianNB()
       gnb.fit(X_train,y_train)
       print('训练集得分: {:.2%}'.format(gnb.score(X_train,y_train)))
       print('测试集得分:  {:.2%}'.format(gnb.score(X_test,y_test)))
       print('第310个样本预测结果: {}'.format(gnb.predict([X[310]])))


输出


训练集得分: 94.84%
测试集得分: 94.41%
第310个样本预测结果: [1]

因此,第310个数据是良性的。


4.学习曲线


最后我们来看一下高斯贝叶斯的学习曲线

from sklearn.model_selection import learning_curve,ShuffleSplit
#定义一个绘制学习曲线的函数
def plot_learning_curve(estimator, title,X,  y,ylim=None,cv=None,n_jobs=2,train_sizes=np.linspace(.1,1.0,5)):
       plt.figure()
       plt.title(title)
if ylim is not None:
              plt.ylim(*ylim)
       plt.rcParams['font.family']  = ['sans-serif']
       plt.rcParams['font.sans-serif']  = ['SimHei']
       plt.xlabel(u"训练样本")
       plt.ylabel(u"得分")
       plt.ylim(0,1.1)
       tarining_sizes,train_scores,test_scores  = learning_curve(estimator,X,y,cv=cv,n_jobs=n_jobs,train_sizes=train_sizes)
       train_scores_mean =  np.mean(train_scores,axis=1)
       test_scores_mean =  np.mean(test_scores,axis=1)
       plt.grid()
       plt.plot(tarining_sizes,train_scores_mean,'o-',label=u"训练得分",c='r')
plt.plot(tarining_sizes,test_scores_mean,'o-',label=u"交叉验证得分",c='g')
       plt.legend(loc='lower  right')
return plt
def learning_curve_for_gaussianNB():
       cancer =  load_breast_cancer()
       X , y =  cancer.data,cancer.target
       title =u"学习曲线"
       cv =  ShuffleSplit(n_splits=100,test_size=0.2,random_state=0)
       estimator =  GaussianNB()
       plot_learning_curve(estimator,title,X,  y,ylim=(0.9,1.01),cv=cv)
       plt.show()


训练集的数据随着样本从开始到150左右得分逐渐降低,然后持续持平,测试集得分一值保持不变,并且与训练集最后得分持平。


—————————————————————————————————


软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

目录
相关文章
|
2月前
|
机器学习/深度学习 存储 算法
强化学习算法基准测试:6种算法在多智能体环境中的表现实测
本文系统研究了多智能体强化学习的算法性能与评估框架,选用井字棋和连珠四子作为基准环境,对比分析Q-learning、蒙特卡洛、Sarsa等表格方法在对抗场景中的表现。实验表明,表格方法在小规模状态空间(如井字棋)中可有效学习策略,但在大规模状态空间(如连珠四子)中因泛化能力不足而失效,揭示了向函数逼近技术演进的必要性。研究构建了标准化评估流程,明确了不同算法的适用边界,为理解强化学习的可扩展性问题提供了实证支持与理论参考。
102 0
强化学习算法基准测试:6种算法在多智能体环境中的表现实测
|
3月前
|
自然语言处理 算法 数据可视化
文本聚类效果差?5种主流算法性能测试帮你找到最佳方案
本文探讨了自然语言处理中句子嵌入的聚类技术,使用Billingsmoore数据集(925个英语句子)进行实验。通过生成句子嵌入向量并可视化分析,对比了K-Means、DBSCAN、HDBSCAN、凝聚型层次聚类和谱聚类等算法的表现。结果表明,K-Means适合已知聚类数量的场景,DBSCAN和HDBSCAN适用于未知聚类数量且存在异常值的情况,而谱聚类在句子嵌入领域表现不佳。最终建议根据数据特征和计算资源选择合适的算法以实现高质量聚类。
148 0
文本聚类效果差?5种主流算法性能测试帮你找到最佳方案
|
4月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
|
5月前
|
机器学习/深度学习 存储 Kubernetes
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
200 6
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
|
10月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
954 6
|
8月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
1330 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
8月前
|
机器学习/深度学习 算法 网络安全
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
203 14
|
7月前
|
人工智能 编解码 算法
使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
114 0

热门文章

最新文章