贝努利朴素贝叶斯
这种方法比较适合于符合贝努利分布的数据集,贝努利分布也被称为“二项分布”也就是“0-1分布”。
下面用一个例子来说明:
假设有一组关于一些因素与下雨之间的联系,例如刮北风、闷热、多云、天气预报是否有雨等等。
再给7天是否下雨的数据。
#导入贝努力贝叶斯
from sklearn.naive_bayes import BernoulliNB
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])
nb = BernoulliNB()
nb.fit(X,y)
#预测一天,无刮风,不闷热,多云,天气预报预测没雨
Next_Day = [[0,0,1,0]]
pre = nb.predict(Next_Day)
print(pre)
if pre == [1]:
print("下雨了,收衣服啦!")
else:
print("今天又是美好的一天!")
预测结果为:
预测结果和之前分析的结果基本相同。
高斯朴素贝叶斯
高斯朴素贝叶斯,顾名思义,是假设样本的特征符合高斯分布,或者说符合正态分布时所用的算法。
下面以乳腺肿瘤数据集的例子来说明:
#导入威斯康星乳腺肿瘤数据集
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
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=8)
nb = GaussianNB()
nb.fit(X_train,y_train)
#模型评分
print("========================")
print("训练集评分为:{:.3f}".format(nb.score(X_train,y_train)))
print("测试集评分为:{:.3f}".format(nb.score(X_test,y_test)))
print("========================")
#取第三百个样本来检测是否预测正确
print("模型预测的分类是:{}".format(nb.predict([X[300]])))
print("模型正确的分类是:",y[300])
运行结果为:
从结果上可以看出,模型得分和模型预测的准确性都还是挺不错的。事实上,高斯朴素贝叶斯也确实是能够胜任大部分的分类任务。因为在自然科学和社会领域,有大量的现象都是呈现正态分布的。
多项式朴素贝叶斯
从其名字可以看出来它主要是用来拟合多项式分布的数据集,多项式朴素贝叶斯要求输入的X值是非负的,所以在输入数据时需要进行预处理,将其变为非负的才行。
下面就对其做一个简单的评分测试:
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import MinMaxScaler
#生成样本数为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)
#预处理
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
print(X_train_scaled)
mnb = MultinomialNB()
mnb.fit(X_train_scaled,y_train)
print("==============================")
print("模型得分:{:.3f}".format(mnb.score(X_test_scaled,y_test)))
print("==============================")
运行结果为:
从结果可以看出,虽然经过了预处理将所有特征值转换为非负的,但是多项式朴素贝叶斯还是不能获得较高的分数。
总结
本次学习了朴素贝叶斯算法和它的几种变体-贝努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯。其中贝努利朴素贝叶斯适合于二项式分布的数据集,而多项式朴素贝叶斯适合计数类型的数据集,即非负、离散数值的数据集,而高斯朴素贝叶斯适合的就比较广,可以应用于任何连续数值型的数据集中,尤其在符合正态分布的数据集中表现更好。