机器学习之朴素贝叶斯
文章目录
一、原理
1.1、定义
- 朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。
1.2、原理过程
了解朴素贝叶斯模型之前,先复习条件概率和贝叶斯公式
条件概率:在事件B的条件下,事件A的发生概率为
P
(
A
∣
B
)
=
P
(
A
B
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
P
(
B
)
P(A|B)=frac{P(AB)}{P(B)}=frac{P(B|A)P(A)}{P(B)}
P(A∣B)=P(B)P(AB)=P(B)P(B∣A)P(A),其中P(A)、P(B)、P(AB)分别为事件A、事件B、事件A和事件B同时发生的概率。
贝叶斯公式:
P
(
Y
=
c
k
∣
X
=
x
)
=
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
∑
k
=
1
n
P
(
X
=
x
∣
Y
=
c
k
)
P
(
Y
=
c
k
)
P(Y=c_k|X=x)=frac{P(X=x|Y=c_k)P(Y=c_k)}{sum_{k=1}^nP(X=x|Y=c_k)P(Y=c_k)}
P(Y=ck∣X=x)=∑k=1nP(X=x∣Y=ck)P(Y=ck)P(X=x∣Y=ck)P(Y=ck) 其中
P
(
Y
=
c
k
)
P(Y=c_k)
P(Y=ck)为先验概率即没有前提条件的概率,
P
(
Y
=
c
k
∣
X
=
x
)
P(Y=c_k|X=x)
P(Y=ck∣X=x)为后验概率即有前提条件的概率。
看个例子了解朴素贝叶斯计算过程:根据天气和是否是周末预测一个人是否会出门。
index | 天气的好坏X1 | 是否周末X2 | 是否出门Y |
---|---|---|---|
1 | 好 | 是 | 出门 |
2 | 好 | 否 | 出门 |
3 | 好 | 是 | 不出门 |
4 | 好 | 否 | 出门 |
5 | 不好 | 是 | 出门 |
6 | 不好 | 否 | 不出门 |
- 以天气为例,需计算天气不好的条件下出门和不出门的概率P(Y=出门|X1=不好)。
P
(
Y
=
出
门
)
=
2
3
P(Y=出门) = frac{2}{3}
P
(
X
1
=
不
好
)
=
1
3
P(X1=不好)=frac 1 3
P
(
Y
=
出
门
∣
X
1
=
不
好
)
=
P
(
X
1
=
不
好
∣
Y
=
出
门
)
P
(
Y
=
出
门
)
P
(
X
1
=
不
好
)
=
2
/
3
∗
1
/
4
1
/
3
=
1
/
2
P(Y=出门|X1=不好) = frac{P(X1=不好|Y=出门)P(Y=出门)}{P(X1=不好)}=frac{2/3*1/4}{1/3}=1/2
P
(
Y
=
不
出
门
∣
X
1
=
不
好
)
=
1
−
P
(
Y
=
出
门
∣
X
1
=
不
好
)
=
1
/
2
P(Y=不出门|X1=不好) = 1-P(Y=出门|X1=不好) =1/2
- 结果表示:天气不好的情况下,出门和不出门的概率都是12。
1.3、基本算法
- 根据算法的特征类型将其分成两类:
- 连续:这意味着最终的标签为实值(可以存在小数)。可以用高斯模型(正态分布)分类器。
- 离散:这以为着最终的结果为分类的类别值(只能为整数)可以使用伯努利(只存在两种分类结果)或者多项式模型(可以存在多个分类结果)。
1.4、优缺点
-
优点: 朴素贝叶斯算法主要基于经典的贝叶斯公式进行推倒,具有很好的数学原理。而且在数据量很小的时候表现良好,数据量很大的时候也可以进行增量计算。由于朴素贝叶斯使用先验概率估计后验概率具有很好的模型的可解释性。
-
缺点:
- 具有最小的理论误差率。但特征之间相互独立的假设在现实生活中往往不成立。
- 在特征较多或相关性较大时,分类效果不好;相关性较小时,朴素贝叶斯性能最为良好。
- 解决特征之间的相关性,我们还可以使用数据降维(PCA)的方法,去除特征相关性。
1.4、应用
- 朴素贝叶斯算法假设所有特征的出现相互独立互不影响,每一特征同等重要,又因为其简单,而且具有很好的可解释性一般。相对于其他精心设计的更复杂的分类算法,朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。朴素贝叶斯算法一般应用在文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等。
二、实战
2.1、高斯模型分类器
import numpy as np
from sklearn.naive_bayes import GaussianNB # 高斯模型
x = np.array([[0.5,0],[1.4,2.8],[4.6,5.4]]) # 生成数据集
#给定我们训练集的分类标签
y = np.array(['cat', 'dog', 'rabbit']) # 标签
# 生成高斯分类器并训练数据
gs = GaussianNB()
gs.fit(x, y)
#下面我们运用我们的模型进行测试
print(gs.predict([[1.3, 8.2]])) # 输出类别 ['rabbit']
print(gs.predict_proba([[0.3, 5.2]])) # 输出属于哪个类别的概率 [[0. 1. 0.]]
2.2、伯努利模型分类器
import numpy as np
from sklearn.naive_bayes import BernoulliNB
# 例子是上面的是否出门; 特征编码:天气好1 天气不好0; 是周末1 不是周末0
x = np.array([[1,1],[1,0],[1,1],[1,0],[0,1],[0,0]])
y = np.array(['出门','出门','不出门','出门','出门','不出门'])
bl = BernoulliNB()
bl.fit(x,y)
print(bl.predict([[1,1]])) # ['出门'] 天气好且是周末很有可能出门
print(bl.predict_proba([[1,1]])) # [[0.27272727 0.72727273]] 天气好且是周末出门的概率为72.73%,不出门的概率为27.27%。
2.2、多项式模型分类器
import numpy as np
from sklearn import datasets # 自带数据集
from sklearn.model_selection import train_test_split # 训练集和测试集拆分
from sklearn.naive_bayes import MultinomialNB # 多项式模型分类器
from sklearn.metrics import accuracy_score
x, y = datasets.load_iris(return_X_y=True) # 加载数据鸾尾花 并分别返回特征x和标签y
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2) # 按2:8分割测试集和训练集 random_state说明每次分割数据都是一样的
M = MultinomialNB() # 创建分类器
M.fit(x_train,y_train) # 训练数据
y_pred = M.predict(x_test) # 对测试集进行预测
print(y_pred) # 输出预测值 [0 0 2 0 0 1 0 2 2 0 0 0 0 0 1 1 0 1 2 1 1 1 2 1 1 0 0 2 0 2]
print(M.predict_proba(x_test)) # 输出各类别的概率 部分结果如下图
print(accuracy_score(y_test,y_pred)) # 测试集准确率 0.9666666666666667
为什么叫朴素呢
- 朴素贝叶斯模型英文是:Naive Bayesian Model。在现实中,特征之间存在依赖关系(例如人的年龄和薪资)。然而,朴素贝叶斯假设样本的特征间相互独立,这个假设在现实生活中是很不真实的。是不是觉得这个模型很天真,Naive的意思即是天真。 参考这里
参考:
阿里云天池:机器学习原理与实践