朴素贝叶斯算法与贝叶斯估计

1. 朴素贝叶斯算法

朴素贝叶斯算法是学习数据集的联合概率分布 P ( X , Y ) P(X,Y) P(X,Y),而这个过程是通过学习先验概率 P ( Y = C k ) P(Y=C_k) P(Y=Ck) 和条件概率分布 P ( X = x ∣ Y = C k ) P(X=x|Y=C_k) P(X=xY=Ck) 完成的。

1.1 定义一个数据集实例

定义一个数据集 T T T 为 :
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\{ (x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \} T={(x1,y1),(x2,y2),,(xN,yN)}
其中 x i = ( x i ( 1 ) , x i ( 2 ) , ⋯   , x i ( n ) ) , x i ( j ) ∈ { a j 1 , a j 2 , ⋯   , a j S j } x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)}), x_i^{(j)}\in\{a_{j1},a_{j2},\cdots,a_{jS_j}\} xi=(xi(1),xi(2),,xi(n)),xi(j){aj1,aj2,,ajSj}.
x i ( j ) x_i^{(j)} xi(j) 为第 i i i 个样本的第 j j j 个 feature, a j S j a_{jS_j} ajSj 为第 j j j 个 feature 可能取的第 S j S_j Sj个值, j = 1 , 2 , ⋯   , n j=1,2,\cdots,n j=1,2,,n. y i ∈ { C 1 , C 2 , ⋯   , C k } y_i \in \{C_1,C_2,\cdots,C_k\} yi{C1,C2,,Ck}

  • 概括描述该数据集
内容描述 数值 典型符号
数据集有N个样本标签 N y N y_N yN, x N x_N xN
数据集每一个x样本中对应有n个features n x i ( n ) x_i^{(n)} xi(n)
数据集的标签有K类,分别为 C 1 , C 2 , ⋯   , C k C_1,C_2,\cdots,C_k C1,C2,,Ck k C k C_k Ck
每个特征 x i ( j ) x_i^{(j)} xi(j) S j S_j Sj 个可能的取值 S j S_j Sj a j S j a_{jS_j} ajSj

1.2 朴素贝叶斯算法步骤

  1. 计算先验概率 P ( Y = C k ) P\left(Y=C_{k}\right) P(Y=Ck) : 得到训练集中每一类 C k C_k Ck 的概率.
    P ( Y = C k ) = ∑ i = 1 N I ( y i = C k ) N , k = 1 , 2 , ⋯   , K P\left(Y=C_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=C_{k}\right)}{N}, \quad k=1,2, \cdots, K P(Y=Ck)=Ni=1NI(yi=Ck),k=1,2,,K
  2. 计算条件概率 P ( X ( j ) = a j l ∣ Y = c k ) P\left(X^{(j)}=a_{j l} \mid Y=c_{k}\right) P(X(j)=ajlY=ck)
    P ( X ( j ) = a j l ∣ Y = C k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k )    , j = 1 , 2 , ⋯   , n ; l = 1 , 2 , ⋯   , S j ; k = 1 , 2 , ⋯   , K P\left(X^{(j)}=a_{j l} \mid Y=C_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{j l}, y_{i}=c_{k}\right)}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)} \ \ , j=1,2, \cdots, n ; \quad l=1,2, \cdots, S_{j} ; \quad k=1,2, \cdots, K P(X(j)=ajlY=Ck)=i=1NI(yi=ck)i=1NI(xi(j)=ajl,yi=ck)  ,j=1,2,,n;l=1,2,,Sj;k=1,2,,K
  3. 对于给定的实例 x = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) ) T x=(x^{(1)}, x^{(2)}, \cdots, x^{(n)})^T x=(x(1),x(2),,x(n))T, 利用贝叶斯定理计算其后验概率 P ( Y = C k ∣ X ( j ) = x ( j ) ) P\left(Y=C_{k} \mid X^{(j)}= x^{(j)}\right) P(Y=CkX(j)=x(j)):
    P ( Y = C k ∣ X ( j ) = x ( j ) ) = P ( X ( j ) = x ( j ) ∣ Y = C k ) P ( Y = C k ) ∑ k P ( X ( j ) = x ( j ) ∣ Y = C k ) P ( Y = C k ) = P ( Y = C k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) ∑ k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) , k = 1 , 2 , ⋯   , K \begin{aligned} P\left(Y=C_{k} \mid X^{(j)} = x^{(j)}\right) &=\frac{P\left(X^{(j)}= x^{(j)} \mid Y=C_{k}\right) P\left(Y=C_{k}\right)}{\sum_{k} P\left(X^{(j)}= x^{(j)} \mid Y=C_{k}\right) P\left(Y=C_{k}\right)} \\ &= \frac{P\left(Y=C_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} \mid Y=c_{k}\right)}, \quad k=1,2, \cdots, K \end{aligned} P(Y=CkX(j)=x(j))=kP(X(j)=x(j)Y=Ck)P(Y=Ck)P(X(j)=x(j)Y=Ck)P(Y=Ck)=kP(Y=ck)jP(X(j)=x(j)Y=ck)P(Y=Ck)jP(X(j)=x(j)Y=ck),k=1,2,,K
  • 补充知识贝叶斯定理
    P ( Y ∣ X ) = P ( X , Y ) P ( X ) = P ( Y ) P ( X ∣ Y ) ∑ Y P ( Y ) P ( X ∣ Y ) P(Y \mid X)=\frac{P(X, Y)}{P(X)}=\frac{P(Y) P(X \mid Y)}{\sum_{Y} P(Y) P(X \mid Y)} P(YX)=P(X)P(X,Y)=YP(Y)P(XY)P(Y)P(XY)
    利用条件概率和先验概率计算 P ( Y ∣ X ) P(Y \mid X) P(YX)

由于上述公式的分母对于任意 k,均相等,那么只需要比较分子的大小,即可得到后验概率最大的类别,便可以判断出实例 x = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) ) T x=(x^{(1)}, x^{(2)}, \cdots, x^{(n)})^T x=(x(1),x(2),,x(n))T 对应的分类是什么。

  • 朴素贝叶斯之所以被称为朴素,是因为输入X的强独立性假设

因此,仅需计算分子部分,及计算下面公式,并且比较大小:
P ( Y = C k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = C k ) , k = 1 , 2 , ⋯   , K P\left(Y=C_{k}\right) \prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} \mid Y=C_{k}\right), \quad k=1,2, \cdots, K P(Y=Ck)j=1nP(X(j)=x(j)Y=Ck),k=1,2,,K
4. 最后我们确定实例 x = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( n ) ) T x=(x^{(1)}, x^{(2)}, \cdots, x^{(n)})^T x=(x(1),x(2),,x(n))T 对应的分类:
y = arg ⁡ max ⁡ C k P ( Y = C k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = C k ) y=\arg \max _{C_{k}} P\left(Y=C_{k}\right) \prod_{j=1}^{n} P\left(X^{(j)}=x^{(j)} \mid Y=C_{k}\right) y=argCkmaxP(Y=Ck)j=1nP(X(j)=x(j)Y=Ck)

2. 贝叶斯估计

在朴素贝叶斯中(极大似然估计),估计的概率可能会出现0的情况,而这会影响后验概率的计算(1.2 朴素贝叶斯算法步骤 - 4) 因此我们需要加上Laplace 平滑使得概率大于0,从而使得连乘不至于=0.

2.1 Laplace smoothing 拉普拉斯平滑

在朴素贝叶斯的基础上,我们在分子分母都加上一个与 λ \lambda λ 相关的正系数,其中 λ > 0 \lambda >0 λ>0. 当 λ = 0 \lambda =0 λ=0则为极大似然估计。当 λ = 1 \lambda =1 λ=1时,为拉普拉斯平滑。
P λ ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = C k ) + λ ∑ i = 1 N I ( y i = C k ) + S j λ P_{\lambda}\left(X^{(j)}=a_{j l} \mid Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{(j)}=a_{j l}, y_{i}=C_{k}\right)+\lambda}{\sum_{i=1}^{N} I\left(y_{i}=C_{k}\right)+S_{j} \lambda} Pλ(X(j)=ajlY=ck)=i=1NI(yi=Ck)+Sjλi=1NI(xi(j)=ajl,yi=Ck)+λ
此时,先验概率变为:
P λ ( Y = C k ) = ∑ i = 1 N I ( y i = C k ) + λ N + K λ P_{\lambda}\left(Y=C_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=C_{k}\right)+\lambda}{N+K \lambda} Pλ(Y=Ck)=N+Kλi=1NI(yi=Ck)+λ

可以看到,当 λ = 1 \lambda =1 λ=1 时,相当于在N个样本的基础上增加了K个样本,并且这K个样本涵盖了每一个类别。

  • 其实平滑过程相当于对原始数据集进行一个人为添加噪声的过程, λ \lambda λ 越大,可能精度越低
  • 朴素贝叶斯假设输入变量都是条件独立的,如果他们之间存在概率依存关系,则模型变成了贝叶斯网络

3. 朴素贝叶斯的代码实现 [Python]

利用 sklearn 对 Iris dataset 进行一个测试

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB

​# 加载数据
iris = load_iris()
iris.data.shape  # (150, 4)

x = iris.data[:, :-1]
y = iris.target

# 对数据集进行切分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)
"""
使用sklearn库实现朴素贝叶斯
"""
Classify = BernoulliNB(alpha=1)
Classify.fit(x_train,y_train)
"""
查看模型的准确率
"""
print("The training accuracy of Naive Bayesian is :",Classify.score(x_train,y_train))
print("The classifying accuracy of Naive Bayesian is :",Classify.score(x_test,y_test))
[Results]:
The training accuracy of Naive Bayesian is : 0.35
The classifying accuracy of Naive Bayesian is : 0.26666666666666666

可见朴素贝叶斯的分类的准确度并不是很高,需要进一步提升,因为Iris 数据集的标签为 0,1,2,3. 则我们想到可以改变 朴素贝叶斯的二值化阈值 (Binarize)来提升性能。

  • Sklearn 中的解释为
    binarizefloat or None, default=0.0
    Threshold for binarizing (mapping to booleans) of sample features. If None, input is presumed to already consist of binary vectors.

通过改变 Binarize 的值,其精确度分布为:朴素贝叶斯算法与贝叶斯估计_第1张图片
可以看到,当以2.5~3之间的数字作为输入 X 的二值化阈值时,此时分类的精确度最高

除了改变参数,把模型换成 高斯朴素贝叶斯(GaussianNB)和多项式贝叶斯(MultinomialNB)试试

gaussian_clf = GaussianNB()
multinomial_clf = MultinomialNB()

gaussian_clf.fit(x_train, y_train)
multinomial_clf.fit(x_train, y_train)

print("The training accuracy of Gaussian is :",gaussian_clf.score(x_test,y_test))
print("The training accuracy of Multinomial is :",multinomial_clf.score(x_test,y_test))
[Results]:
The training accuracy of Gaussian is : 0.9666666666666667
The training accuracy of Multinomial is : 0.7666666666666667

可以看到 高斯朴素贝叶斯(GaussianNB)和多项式贝叶斯(MultinomialNB)效果均比 Naive Bayesian 好, 其原因可能为:

  • 高斯朴素贝叶斯(GaussianNB): 适用于处理连续型变量,因此精度可能更高
  • 多项式贝叶斯(MultinomialNB): 适用于处理离散型变量
  • 朴素贝叶斯: 适合处理布尔类型的二进制变量(离散)

你可能感兴趣的:(算法,概率论,机器学习,python)