Sklearn 朴素贝叶斯 GaussianNB MultinomialNB BernoulliNB

Sklearn 朴素贝叶斯 GaussianNB MultinomialNB BernoulliNB

贝叶斯定理 在概率论与统计学中,贝叶斯定理(或称贝叶斯法则、贝叶斯规则)描述了一个事件的可能性,这个可能性是基于预先对于一些与该事件相关的情况的知识。举例来说,如果癌症和年龄有关,那么知道了一个人的年龄的话,使用贝叶斯定理,相比于根本不了解关于此人的任何其他信息,就可以更准确地帮助评估这个人得癌症与否的概率。

贝叶斯定理所阐述的也就是后验概率的获得方法。

用数学公式来表述贝叶斯定理:

c表示的是随机事件发生的一种情况。x表示的就是证据(evidence),泛指与随机事件相关的因素。

P(c|x):在x条件下,随机事件出现c情况的概率,(后验概率)。

P(c):(不考虑相关因素)随机事件出现c情况的概率,(先验概率)。

P(x|c):在已知事件出现c情况的条件下,条件x出现的概率,(后验概率)。

P(x):x出现的概率,(先验概率)。

何为“朴素”? “朴素”(naive)指的是属性条件独立性假设。因为我们为了能够获得合理的p(c|x)的值,采用了“很不科学”的假设,即事件的各个属性不相关,称为属性条件独立性假设。这个假设用公式表达是这样的:

公式的左边等式就是我们熟悉的贝叶斯定理的公式,而右边新加的一个式子是将P(x|c)(条件联合概率)表达成了

(多个条件概率的相乘)。用俗话说,这个假设认为每个属性取它的各个值的可能性是独立的,与其它属性的取值不相关。

 

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是:

GaussianNB 先验为高斯分布(正态分布)的朴素贝叶斯。

MultinomialNB 先验为多项式分布的朴素贝叶斯。

BernoulliNB 先验为伯努利分布的朴素贝叶斯。

一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。 关于分类,我们仍然使用了Iris数据集,Iris数据集给出的三种花是按照顺序来的,前50个是第0类,51-100是第1类,101~150是第二类,如果我们分训练集和测试集的时候要把顺序打乱。

# 导入高斯模型
from sklearn.naive_bayes import GaussianNB
import numpy as np

# 定义预测变量与目标变量
x= np.array([[-3,7],[1,5], [1,2], [-2,0], [2,3], [-4,0], [-1,1], [1,1], [-2,2], [2,7], [-4,1], [-2,7]])
Y = np.array([3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4])
# 创建高斯分类器
model = GaussianNB()
# 使用刚才定义的训练集训练模型
model.fit(x, Y)
# 预测并输出
predicted= model.predict([[1,2],[3,4]])
print (predicted)
# 创建多项式分类器
from sklearn.naive_bayes import MultinomialNB
import numpy as np

# 定义预测变量与目标变量
X = np.random.randint(5, size=(6, 10))
print (X)
y = np.array([1, 2, 3, 4, 5, 6])

clf = MultinomialNB()
clf.fit(X, y)

# 预测并输出
predicted = clf.predict(X[2:])
print (predicted)
# 创建伯努利分类器
from sklearn.naive_bayes import BernoulliNB
import numpy as np

# 定义预测变量与目标变量
X = np.random.randint(2, size=(6, 10))
Y = np.array([1, 2, 3, 4, 4, 5])

clf = BernoulliNB()
clf.fit(X, Y)

# 预测并输出
print(clf.predict(X[2:]))
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import naive_bayes

iris = datasets.load_iris()
X = iris["data"]
y = iris["target"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 样本特征的分布大部分是连续值,因此使用GaussianNB,如果样本是离散值则选择MultinomialNB或BernoulliNB
Model = naive_bayes.GaussianNB()
Model.fit(X_train, y_train)
predict = Model.predict(X_test)
print(predict)
print(y_test)
score = Model.score(X_test, y_test)
print('the score is :', score)

 

randint函数说明

numpy.random.randint(low, high=None, size=None, dtype=’l’)

输入:
low    为最小值。
high   为最大值。
size    为数组维度大小。
dtype 为数据类型,默认的数据类型是np.int。
返回值:
返回随机整数或整型数组,范围区间为[low,high),包含low,不包含high;
high没有填写时,默认生成随机数的范围是[0,low)。

 

发表回复

您的电子邮箱地址不会被公开。