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

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】在使用K-means聚类算法时,如何选择K的值?
【5月更文挑战第11天】【机器学习】在使用K-means聚类算法时,如何选择K的值?
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】为什么K-means算法使用欧式距离度量?
【5月更文挑战第11天】【机器学习】为什么K-means算法使用欧式距离度量?
|
1天前
|
机器学习/深度学习 算法 数据可视化
【机器学习】描述K-means算法的步骤
【5月更文挑战第11天】【机器学习】描述K-means算法的步骤
|
1天前
|
机器学习/深度学习 人工智能 算法
【机器学习】K-means和KNN算法有什么区别?
【5月更文挑战第11天】【机器学习】K-means和KNN算法有什么区别?
|
2天前
|
机器学习/深度学习 算法
【机器学习】比较朴素贝叶斯算法与逻辑回归算法
【5月更文挑战第10天】【机器学习】比较朴素贝叶斯算法与逻辑回归算法
|
2天前
|
机器学习/深度学习
【机器学习】朴素贝叶斯分类器的缺点是什么?
【5月更文挑战第10天】【机器学习】朴素贝叶斯分类器的缺点是什么?
|
2天前
|
机器学习/深度学习 自然语言处理 算法
【机器学习】朴素贝叶斯分类器的优点是什么?
【5月更文挑战第10天】【机器学习】朴素贝叶斯分类器的优点是什么?
|
2天前
|
机器学习/深度学习 数据采集 算法
【机器学习】朴素贝叶斯分类器的工作流程?
【5月更文挑战第10天】【机器学习】朴素贝叶斯分类器的工作流程?
|
2天前
|
机器学习/深度学习 算法
【机器学习】如何使用朴素贝叶斯分类器来处理类别特征?
【5月更文挑战第10天】【机器学习】如何使用朴素贝叶斯分类器来处理类别特征?
|
2天前
|
机器学习/深度学习 算法
【机器学习】朴素贝叶斯分类器的假设?
【5月更文挑战第10天】【机器学习】朴素贝叶斯分类器的假设?

热门文章

最新文章