飞道的博客

sklearn机器学习之朴素贝叶斯

426人阅读  评论(0)

🌟上次我们讲到了决策树算法,都是基于sklearn实现的,这次我们要学习的内容是朴素贝叶斯,何为“朴素”,朴素的含义即特征之间相互独立,没有关联关系。对以前内容感兴趣的小伙伴可以参考以下内容👇:

💌今天我们来学习第二个概率模型,朴素贝叶斯,概率模型是不需要做标准化的,请大家牢记!

1.贝叶斯公式简介

天气预报说今日降水概率为: 50 % − P ( A ) 50\%-P(A) 50%PA
晚高峰堵车概率为: 80 % − P ( B ) 80\%-P(B) 80%PB
如果下雨,晚高峰堵车的概率为: 95 % − P ( B / A ) 95\%-P(B/A) 95%PB/A
请问晚高峰堵车时下雨的概率是多少?

P ( A / B ) = P ( B / A ) ∗ P ( A ) P ( B ) = 0.5 ∗ 0.95 ÷ 0.8 = 0.593 \color{aqua}{P(A/B)=\frac{P(B/A)*P(A)}{P(B)}}=0.5*0.95\div0.8=0.593 P(A/B)=P(B)P(B/A)P(A)=0.50.95÷0.8=0.593
得出结论为下雨概率为59%,这就是一个简单的条件概率的计算方法。

2.朴素贝叶斯的应用

刮北风 闷热 多云 天气预报有雨 真下雨?
第一天 0
第二天 1
第三天 1
第四天 0
第五天 1
第六天 0
第七天 0

我们采用one-hot编码来解决这个问题,并对x为[0,0,1,0]的情况进行预测!

import numpy as np
x=np.array([[0,1,0,1],
           [1,1,1,0],
           [0,1,1,0],
           [0,0,0,1],
           [0,1,1,0],
           [0,1,0,1],
           [1,0,0,1]]
          )
y=np.array([0,1,1,0,1,0,0])
#导入朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
clf=BernoulliNB()
clf.fit(x,y)
#将下一天的情况输入模型
Next_Day=[[0,0,1,0]]
pre=clf.predict(Next_Day)
pre2=clf.predict_proba(Next_Day)
#输出模型预测结果
print("预测结果为:",pre)
#输出模型预测的分类概率
print("预测的概率为:",pre2)

结果为:

3.朴素贝叶斯的种类

在sklearn中,朴素贝叶斯有三种方法,分别是贝努力朴素贝叶斯、高斯贝叶斯、多项式朴素贝叶斯。
在前面的例子中,我们使用的就是贝努利朴素贝叶斯,这种方法比较适合于符合“二项分布”或者说是“0-1”分布的数据集,每个特征都只有0,1两个数值。但是如果我们使用更复杂的数据,效果可能就不尽人意。

3.1 贝努力朴素贝叶斯

我们这里采用make_blobs自制数据集进行分类
首先是贝努力朴素贝叶斯分类

#导入数据集
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
#这里构建了一个500个样本,5类的数据
x,y=make_blobs(n_samples=500,centers=5,random_state=8)
print(x.shape)
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(nb.score(x_test,y_test))

#画图
import matplotlib.pyplot as plt
#设置横轴与纵轴最大值
x_min,x_max=x[:,0].min()-0.5,x[:,0].max()+0.5
y_min,y_max=x[:,1].min()-0.5,x[:,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.Pastel1)
#将测试集与训练集用散点图表示
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolor='k')
plt.scatter(x_test[:,0],x_test[:,1],c=y_test,cmap=plt.cm.cool,marker="*",edgecolor="k")
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("BERNOULLINB")
plt.show()

我们看一下结果:准确率只有0.544

看来贝努力朴素贝叶斯真的只适合0—1变量的分类任务。

3.2 高斯朴素贝叶斯

然后是高斯朴素贝叶斯分类

#高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
gnb=GaussianNB()
gnb.fit(x_train,y_train)
gnb.score(x_test,y_test)
#画图
z=gnb.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastel1)
#将测试集与训练集用散点图表示
plt.scatter(x_train[:,0],x_train[:,1],c=y_train,cmap=plt.cm.cool,edgecolor='k')
plt.scatter(x_test[:,0],x_test[:,1],c=y_test,cmap=plt.cm.cool,marker="*",edgecolor="k")
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("gaussianNB")
plt.show()

结果是:准确率达到0.968 ,超级高

看来高斯分布很适合这个数据集

3.3 多项式朴素贝叶斯

再来看看多项式朴素贝叶斯

#使用多项式朴素贝叶斯进行分类
from sklearn.naive_bayes import MultinomialNB
#使用多项式朴素贝叶斯进行拟合数据
mnb=MultinomialNB()
mnb.fit(x_train,y_train)
mnb.score(x_test,y_test)

直接报错:显示x不可为负

多项式朴素贝叶斯只适合对非负离散型数值特征进行分类,这里的数据具有负值,不适合采用该方法分类。

4.案例分析

其实在贝叶斯中,大家最常用的就是高斯朴素贝叶斯,因为自然学科和社会科学领域有大量现象都是符合正态分布的规律,高斯朴素贝叶斯能够胜任大部分的分类任务。
我们对sklearn中的肿瘤数据集进行分类,该数据集包含569个样本数据,30个特征值,我们来看看效果。

  • 导入数据集
#我们来看看数据集的形式
from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()
print("数据集的主要内容",cancer.keys())
print("数据集的标签名",cancer["target_names"])
print("数据集的特征",cancer["feature_names"])

结果如下:

  • 划分数据集
#将数据集划分x和y
x,y=cancer.data,cancer.target
#使用数据集拆分训练集和测试集
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=38)
print("训练集形态;",x_train.shape)
print("测试集数据形态:",x_test.shape)

结果如下:

  • 高斯贝叶斯拟合
gnb=GaussianNB()
gnb.fit(x_train,y_train)
print("测试集得分:",gnb.score(x_train,y_train))
print("训练集得分:",gnb.score(x_test,y_test))

结果如下:

参考资料

《深入浅出python机器学习》
《统计学习方法》


转载:https://blog.csdn.net/weixin_48077303/article/details/117396838
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场