朴素贝叶斯介绍
基本公式:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac{P(B|A)P(A)}{P(B)} P(A∣B)=P(B)P(B∣A)P(A)
假如换成我们的分类问题或许可能更好理解:
P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) P ( 类别 ) P ( 特征 ) P(类别|特征) = \frac{P(特征|类别)P(类别)}{P(特征)} P(类别∣特征)=P(特征)P(特征∣类别)P(类别)
可以通过一个小例子形象地描述该算法,请见下表:
颜值 | 性格 | 努力程度 | 嫁与否 |
---|---|---|---|
帅 | 好 | 上进 | 嫁 |
不帅 | 好 | 一般 | 不嫁 |
不帅 | 不好 | 不上进 | 不嫁 |
帅 | 好 | 一般 | 嫁 |
不帅 | 好 | 上进 | 嫁 |
帅 | 不好 | 一般 | 不嫁 |
帅 | 好 | 不上进 | 嫁 |
不帅 | 不好 | 上进 | 不嫁 |
帅 | 不好 | 上进 | 嫁 |
不帅 | 好 | 不上进 | 不嫁 |
假设现在有个男生/女生向你求婚,他的特征是(帅,不好,不上进),你是否会选择嫁呢?
我们通过已有的许多数据,使用朴素贝叶斯算法预测一下:
P ( 类别 ∣ 特征 ) = P ( 特征 ∣ 类别 ) P ( 类别 ) P ( 特征 ) P(类别|特征) = \frac{P(特征|类别)P(类别)}{P(特征)} P(类别∣特征)=P(特征)P(特征∣类别)P(类别)
可得出以下公式:
P ( 嫁 ∣ 帅,不好,不上进 ) = P ( 帅,不好,不上进 ∣ 嫁 ) P ( 嫁 ) P ( 帅,不好,不上进 ) P(嫁|帅,不好,不上进) = \frac{P(帅,不好,不上进|嫁)P(嫁)}{P(帅,不好,不上进)} P(嫁∣帅,不好,不上进)=P(帅,不好,不上进)P(帅,不好,不上进∣嫁)P(嫁)
P ( 不嫁 ∣ 帅,不好,不上进 ) = P ( 帅,不好,不上进 ∣ 不嫁 ) P ( 不嫁 ) P ( 帅,不好,不上进 ) P(不嫁|帅,不好,不上进) = \frac{P(帅,不好,不上进|不嫁)P(不嫁)}{P(帅,不好,不上进)} P(不嫁∣帅,不好,不上进)=P(帅,不好,不上进)P(帅,不好,不上进∣不嫁)P(不嫁)
我们通过计算 P(嫁|帅,不好,不上进) 与 P(不嫁|帅,不好,不上进) 的概率,通过比较进行预测嫁还是不嫁?
P(嫁): 5 10 = 1 2 \frac{5}{10} = \frac{1}{2} 105=21
P(不嫁): 5 10 = 1 2 \frac{5}{10} = \frac{1}{2} 105=21
由于朴素贝叶斯设定特征之间均是独立的,故有:
P(帅,不好,不上进|嫁) = P(帅|嫁)* P(不好|嫁)* P(不上进|嫁): 4 5 \frac{4}{5} 54 * 1 5 \frac{1}{5} 51 * 1 5 \frac{1}{5} 51 = 0.032
P(帅,不好,不上进|不嫁) = P(帅|不嫁)* P(不好|不嫁)* P(不上进|不嫁): 1 5 \frac{1}{5} 51 * 3 5 \frac{3}{5} 53 * 2 5 \frac{2}{5} 52 = 0.048
由全概率公式可知:
P(帅,不好,不上进) = P(帅,不好,不上进|嫁)P(嫁) + P(帅,不好,不上进|不嫁)P(不嫁) = 1 2 \frac{1}{2} 21 * ( 4 5 \frac{4}{5} 54 * 1 5 \frac{1}{5} 51 * 1 5 \frac{1}{5} 51 + 1 5 \frac{1}{5} 51 * 3 5 \frac{3}{5} 53 * 2 5 \frac{2}{5} 52) = 0.04
故可得以下结果:
P ( 嫁 ∣ 帅,不好,不上进 ) = 0.5 ∗ 0.032 0.04 = 40 % P(嫁|帅,不好,不上进) = \frac{0.5 * 0.032}{0.04} = 40\% P(嫁∣帅,不好,不上进)=0.040.5∗0.032=40%
P ( 不嫁 ∣ 帅,不好,不上进 ) = 0.5 ∗ 0.048 0.04 = 60 % P(不嫁|帅,不好,不上进) = \frac{0.5 * 0.048}{0.04} = 60\% P(不嫁∣帅,不好,不上进)=0.040.5∗0.048=60%
根据贝叶斯概率的比较,女生会选择不嫁, 故这就是朴素贝叶斯算法的具体思想。
朴素贝叶斯的三种实现方式
朴素贝叶斯,主要有三种朴素贝叶斯分类器,分别为 GaussianNB(高斯分布)、MultinomialNB(多项式贝叶斯)、BernoulliNB(伯努利贝叶斯)。
GaussianNB–高斯贝叶斯
一般来说,如果样本特征的分布大部分是连续值,使用 GaussianNB 会比较好。
我们也可使用该模型测试一下 鸢尾花分类,得到以下评估结果。
import numpy as np #导入numpy包
import pandas as pd #导入pandas包
from sklearn.naive_bayes import GaussianNB #导入高斯贝叶斯
from sklearn.model_selection import train_test_split #导入拆分 训练集与测试集 的方法
from sklearn.metrics import accuracy_score
import sklearn
import mglearn
#使用sklearn的iris鸢尾草数据集
dataset_iris = sklearn.datasets.load_iris()
#划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(dataset_iris.data, dataset_iris.target)
print(X_train.shape)
print(y_train.shape)
#训练模型
gaussian_nb = GaussianNB().fit(X_train, y_train)
#输出所有的预测结果及每个结果的可能性
predict = gaussian_nb.predict(X_test)
predict_pro = gaussian_nb.predict_proba(X_test) #预测结果的可能性,一个列表,每个元素表示3个种类的各个可能性,预测结果为最大的那个种类
print(predict) #所有预测结果
#分别用高斯贝叶斯模型对训练集与测试集进行评估
train_score = gaussian_nb.score(X_train, y_train)
test_score = gaussian_nb.score(X_test, y_test)
#输出评估的精确度
print('The train_score: {}'.format(train_score))
print('The test_score: {}'.format(test_score))
运行结果
(112, 4)
(112,)
[0 2 2 2 1 0 2 2 0 2 1 1 1 1 2 0 2 1 1 1 2 2 1 0 2 2 1 1 1 0 2 0 0 1 0 1 1
2]
The train_score: 0.9464285714285714
The test_score: 0.9736842105263158
MultinomialNB----多项式贝叶斯
MultinomialNB就是先验为多项式分布的朴素贝叶斯。
它假设特征是由一个简单多项式分布生成的。
多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数或者出现次数比例的特征.该模型常用于文本分类,特征表示的是次数,例如某个词语的出现次数。
若样本特征的分布大部分是多元离散值,使用 MultinomialNB 比较合适。
BernoulliNB----伯努利贝叶斯
BernoulliNB 就是先验为伯努利分布的朴素贝叶斯。
在伯努利模型中,每个特征的取值是布尔型的,即true和false,或者1和0。
若样本特征是二元离散值或者很稀疏的多元离散值,应该使用 BernoulliNB 。