朴素贝叶斯典型的三种算法
朴素贝叶斯主要有三种算法:贝努利朴素贝叶斯、高斯贝叶斯和多项式贝叶斯三种算法
**贝努利朴素贝叶斯:**也称为二项分布或者0-1分布,元素的结果只有两种可能的结果。
**高斯贝叶斯:**样本符合正态分布或者说高斯分布时采用的算法
**多项式贝叶斯:**用于拟合多项式分布的数据集,相似与贝努利,比如说抛骰子,元素的结果可能有n种结果
贝叶斯定理:
比如说出门带伞的问题:
天气预报说出门下雨的概率为50%–P(A)
下班时间堵车的概率为80%–P(B)
如果下雨堵车的概率为95%–P(B|A)
如果堵车了,那么下雨的概率为
0.5*0.95/0.8=0.59375
这个时候遇到雨的概率为六成左右,建议带伞
简单一个应用
我们结合七天的内天气情况来来建立一个模型看看是否会下雨
比如说过去的七天,三天下雨,四天没有下雨,我们可以数组表示:y=[0,1,1,0,1,0,0]
还有一些天气情况
| |刮北风|闷热|多云|天气预报有雨|
|–|–|–|–|–|–|–|–|
|第1天|否|是|否|是|
| 第2天|是|是|是|否|
| 第3天 |否|是|是|否|
| 第4天|否|否|否|是|
| 第5天 |否|是|是|否|
| 第6天 |否|是|否|是|
| 第7天 |是|否|否|是|
这个也可以用数组来表示:[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]
我们可以先用Jupyter Motebook 来查看数据关系
import numpy as np
#将X,y赋值为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])
#对不同分类计算特征量为1的数
counts={}
for label in np.unique(y):
counts[label]=X[y==label].sum(axis=0)
print("feature counts:\n{}".format(counts))
会得到下面的结果
feature counts:
{0: array([1, 2, 0, 4]), 1: array([1, 3, 3, 0])}
这里的意思是y=0时,即没有下雨的天中,有一天刮北风、有两天闷热、没有出现多云、四天天气预报都说有雨
接下来我们用贝努利朴素贝叶斯来预测下明天会不会有雨,我们假设明天的天起情况是[1,1,0,1]。
#导入贝努利
from sklearn.naive_bayes import BernoulliNB
#拟合
clf=BernoulliNB()
clf.fit(X,y)
Next_day=[[0,0,1,0]]
#预测
pre=clf.predict(Next_day)
print('\n\n\n')
print('output')
if pre==[1]:
print("it will be rainy")
else:
print("it's a sunny day")
print('\n\n\n')
output
it will be rainy
结果反应是命题哪有雨,那我们再来预测多一天,假设他是[1,1,0,1]
another_day=[[1,1,0,1]]
pre2=clf.predict(another_day)
print('\n\n\n')
if pre2==[1]:
pirnt("it will be rainy")
else:
print("it's sunny day")
print('\n\n\n')
结果预测是晴天
it’s sunny day
那他们的准确率怎么样,我们可以用这个函数打印出概率
print('\n\n\n')
print(clf.predict_proba(Next_day))
print('\n\n\n')
[[0.13848881 0.86151119]]
这个意思是明天不下雨的概率是13.8%,下雨的概率是86.2%
print('\n\n\n')
print(clf.predict_proba(another_day))
print('\n\n\n')
[[0.92340878 0.07659122]]
这个意思是不下雨的概率是92.3%%,下雨的概率是7.7%%
上面的情况是比较简单的情况,如果数据比较复杂这个模型就没办法胜任了
#数据生成
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)
#数据拆分成训练集和测试集
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('\n\n\n')
print('score:{:.3f}'.format(nb.score(X_test,y_test)))
print('\n\n\n')
打分不算太高
score:0.544
我们也可以画图来理解这个算法模型
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.Pastell)
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,edgecolor='*')
plt.xlim(xx,min(),xx.max())
plt.ylim(yy,min(),yy.max())
plt.title('classifier : bernoullinb')
plt.show()
我们可以看到这个模型的逻辑是把按0、1来划分的,分成了四块,很多数据介于这之间的就没办法分类,所以我们这个时候我们需要使用高斯贝叶斯。
高斯贝叶斯
#导入高斯贝叶斯
from sklearn.naive_bayes import GaussianNB
#拟合
gnb=GaussianNB()
gnb.fit(X_train,y_train)
print('\n\n\n')
#打分
print('score:{:.3f}'.format(gnb.score(X_test,y_test)))
print('\n\n\n')
这里我们可以看到,模型的打分相当高的
score:0.968
我们也可以来画出的这个模型工作的分块
z=gnb.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastell)
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,edgecolor='*')
plt.xlim(xx,min(),xx.max())
plt.ylim(yy,min(),yy.max())
plt.title('classifier : GaussianNB')
plt.show()
可以看到基本上数据点都进入到分类中了。
最后我们再来看下多项式贝叶斯,这个方法比较少接触,而且拟合出来的效果在这里也不怎么好,同时输入的X的值必须是非负的
#导入多相式贝叶斯
from sklearn.naive_bayes import MultinomialNB
#数据预处理工具,用于除负
from sklearn.preprocessing import MinMaxScaler
#除负
scaler=MinMaxScaler()
#拟合
scaler.fit(X_train)
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)
mnb=MultinomialNB()
mnb.fit(X_train_scaled,y_train)
print('\n\n\n')
print('score:{:.3f}'.format(mnb.score(X_test_scaled,y_test)))
print('\n\n\n')
最后打分是相当低的
score:0.320
z=mnb.predict(np.c_[(xx.ravel(),yy.ravel())]).reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastell)
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,edgecolor='*')
plt.xlim(xx,min(),xx.max())
plt.ylim(yy,min(),yy.max())
plt.title('classifier : MultinomialNB')
plt.show()
我们可以画出的他的图像来观察下他的分类过程