🌟上次我们讲到了决策树算法,都是基于sklearn实现的,这次我们要学习的内容是朴素贝叶斯,何为“朴素”,朴素的含义即特征之间相互独立,没有关联关系。对以前内容感兴趣的小伙伴可以参考以下内容👇:
- 决策树模型: sklearn之决策树.
- 线性回归模型: sklearn机器学习之线性回归模型.
💌今天我们来学习第二个概率模型,朴素贝叶斯,概率模型是不需要做标准化的,请大家牢记!
1.贝叶斯公式简介
天气预报说今日降水概率为: 50 % − P ( A ) 50\%-P(A) 50%−P(A)
晚高峰堵车概率为: 80 % − P ( B ) 80\%-P(B) 80%−P(B)
如果下雨,晚高峰堵车的概率为: 95 % − P ( B / A ) 95\%-P(B/A) 95%−P(B/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.5∗0.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