机器学习测试笔记(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

目录
相关文章
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
491 6
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
333 1
|
机器学习/深度学习 计算机视觉 Python
模型预测笔记(三):通过交叉验证网格搜索机器学习的最优参数
本文介绍了网格搜索(Grid Search)在机器学习中用于优化模型超参数的方法,包括定义超参数范围、创建参数网格、选择评估指标、构建模型和交叉验证策略、执行网格搜索、选择最佳超参数组合,并使用这些参数重新训练模型。文中还讨论了GridSearchCV的参数和不同机器学习问题适用的评分指标。最后提供了使用决策树分类器进行网格搜索的Python代码示例。
1719 1
|
机器学习/深度学习 人工智能 安全
自动化测试的未来:AI与机器学习的结合
随着技术的发展,软件测试领域正迎来一场革命。自动化测试,一度被认为是提高效率和准确性的黄金标准,如今正在被人工智能(AI)和机器学习(ML)的浪潮所推动。本文将探讨AI和ML如何改变自动化测试的面貌,提供代码示例,并展望这一趋势如何塑造软件测试的未来。我们将从基础概念出发,逐步深入到实际应用,揭示这一技术融合如何为测试工程师带来新的挑战和机遇。
292 3
|
机器学习/深度学习 人工智能 自然语言处理
自动化测试的未来:AI与机器学习的融合
【9月更文挑战第29天】在软件测试领域,自动化测试一直是提高测试效率和质量的关键。随着人工智能(AI)和机器学习(ML)技术的飞速发展,它们正逐步渗透到自动化测试中,预示着一场测试革命的来临。本文将探讨AI和ML如何重塑自动化测试的未来,通过具体案例展示这些技术如何优化测试流程,提高测试覆盖率和准确性,以及它们对测试工程师角色的影响。
269 7
|
机器学习/深度学习 数据采集 人工智能
自动化测试的未来:AI与机器学习的融合之路
【10月更文挑战第41天】随着技术的快速发展,软件测试领域正经历一场由人工智能和机器学习驱动的革命。本文将探讨这一趋势如何改变测试流程、提高测试效率以及未来可能带来的挑战和机遇。我们将通过具体案例分析,揭示AI和ML在自动化测试中的应用现状及其潜力。
349 0
|
机器学习/深度学习 人工智能 数据挖掘
探索自动化测试的未来:AI与机器学习的融合
【9月更文挑战第29天】在软件测试领域,自动化测试一直是提高效率和准确性的关键。但随着技术的发展,特别是人工智能(AI)和机器学习(ML)的兴起,我们见证了一个新时代的到来——自动化测试的未来正逐渐被重新定义。本文将探讨AI和ML如何改变自动化测试的面貌,从智能测试脚本的生成到测试结果的深度分析,我们将一探究竟这些前沿技术是如何使测试流程更加智能化、高效化,并预测它们将如何塑造软件测试的未来趋势。
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
382 0
|
3月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
258 2
|
4月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
266 3

热门文章

最新文章