学习笔记-贝叶斯分类器及其python实现

朴素贝叶斯(NB)

[学生党学习笔记,如有错误谢谢各位大佬指出]
所用书籍:《统计学习方法》-李航

一、概述

  朴素贝叶斯模型首先基于特征条件独立假设,学习输入的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
  同时这也表明了朴素贝叶斯是一种生成式模型,是基于概率进行学习并分类的。
  关于生成式模型与判别式模型,大家可以点链接看看这篇文章[戳这里]

  相对于其它分类算法,朴素贝叶斯分类依赖于贝叶斯概率定理来预测未知数据集的类别,它的速度是非常快的。
  贝叶斯定理实际上就是计算”条件概率”的公式。
条件概率:
P ( A ∣ B ) = P ( B ∣ A ) ∗ P ( A ) P ( B ) P(A|B)=\frac{P(B|A)*P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)
在朴素贝叶斯分类器中,上式分别表示:

  • P(A|B)是给定预测变量(B,属性)的类(A,target)的后验概率。【即在看到新数据后,我们要计算的该假设的概率】
  • P(A)是类的先验概率。【即在得到新数据前某一假设的概率】
  • P(B|A)是预测器给定类的概率的可能性。【该假设下得到这一数据的概率,称为似然度】
  • P(B)是预测器的先验概率。【在任何假设下得到这一数据的概率,称为标准化常量】

  朴素贝叶斯分类器假设类中特定特征和其它特征的存在无关,因为前提条件便是基于特征独立的。这也是这个算法被称为“朴素”的原因。

二、贝叶斯算法数学原理

  这部分我建议大家去看李航老师的《统计学习方法》,我觉得写得很清楚,我这里就不过多赘述(也可能是我懒得打那些复杂的推导公式,我个人习惯在例子中搞明白)。

  这里直接上例题(例子来源于上书):

  例:由下表中的训练数据学习一个NB分类器并确定 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T的类标记y,表中 x ( 1 ) x^{(1)} x(1) x ( 2 ) x^{(2)} x(2)为特征,取值的集合分别为 A 1 A_1 A1={1,2,3}, A 2 A_2 A2={S,M,L},Y为类标记,Y ∈ \in C={1,-1}.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
x ( 1 ) x^{(1)} x(1) 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
x ( 2 ) x^{(2)} x(2) S M M S S S M M L L L M M L L
Y Y Y -1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1

  首先我们分析目标变量(Target)Y:
P ( Y = 1 ) = 9 15 , P ( Y = − 1 ) = 6 15 P(Y=1)=\frac{9}{15},P(Y=-1)=\frac{6}{15} P(Y=1)=159,P(Y=1)=156
  再看各特征的条件概率:
P ( x ( 1 ) = 1 ∣ Y = 1 ) = 2 9 , P ( x ( 1 ) = 2 ∣ Y = 1 ) = 3 9 , P ( x ( 1 ) = 3 ∣ Y = 1 ) = 4 9 P(x^{(1)}=1|Y=1)=\frac{2}{9},P(x^{(1)}=2|Y=1)=\frac{3}{9},P(x^{(1)}=3|Y=1)=\frac{4}{9} P(x(1)=1Y=1)=92,P(x(1)=2Y=1)=93,P(x(1)=3Y=1)=94
P ( x ( 2 ) = S ∣ Y = 1 ) = 1 9 , P ( x ( 2 ) = M ∣ Y = 1 ) = 4 9 , P ( x ( 2 ) = L ∣ Y = 1 ) = 4 9 P(x^{(2)}=S|Y=1)=\frac{1}{9},P(x^{(2)}=M|Y=1)=\frac{4}{9},P(x^{(2)}=L|Y=1)=\frac{4}{9} P(x(2)=SY=1)=91,P(x(2)=MY=1)=94,P(x(2)=LY=1)=94
P ( x ( 1 ) = 1 ∣ Y = − 1 ) = 3 6 , P ( x ( 1 ) = 2 ∣ Y = − 1 ) = 2 6 , P ( x ( 1 ) = 3 ∣ Y = − 1 ) = 1 6 P(x^{(1)}=1|Y=-1)=\frac{3}{6},P(x^{(1)}=2|Y=-1)=\frac{2}{6},P(x^{(1)}=3|Y=-1)=\frac{1}{6} P(x(1)=1Y=1)=63,P(x(1)=2Y=1)=62,P(x(1)=3Y=1)=61
P ( x ( 2 ) = S ∣ Y = − 1 ) = 3 6 , P ( x ( 2 ) = M ∣ Y = − 1 ) = 2 6 , P ( x ( 2 ) = L ∣ Y = − 1 ) = 1 6 P(x^{(2)}=S|Y=-1)=\frac{3}{6},P(x^{(2)}=M|Y=-1)=\frac{2}{6},P(x^{(2)}=L|Y=-1)=\frac{1}{6} P(x(2)=SY=1)=63,P(x(2)=MY=1)=62,P(x(2)=LY=1)=61
  再对于给定的 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T:
P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) = 9 15 ∗ 3 9 ∗ 1 9 = 1 45 P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{9}{15}*\frac{3}{9}*\frac{1}{9}=\frac{1}{45} P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=1599391=451
P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 6 15 ∗ 2 6 ∗ 3 6 = 1 15 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{6}{15}*\frac{2}{6}*\frac{3}{6}=\frac{1}{15} P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=1566263=151
  从这里便可以得出结果,下式概率大于上式,所以预测y=-1。

贝叶斯估计(使用拉普拉斯平滑)

  如果我们要估计的概率值有为0的情况,这时会影响到后验概率的计算,使模型产生偏差,这时我们便需要进行贝叶斯估计,条件概率的贝叶斯估计式如下:
P λ = Σ i = 1 N I ( y i = c k ) + λ N + K λ P_{\lambda}=\frac{\Sigma_{i=1}^N{I(y_i=c_k)}+\lambda}{N+K\lambda} Pλ=N+KλΣi=1NI(yi=ck)+λ
P λ ( X ( j ) = a j i ∣ Y = c k ) = Σ i = 1 N I ( x i ( j ) = a i j , y i = c k ) + λ Σ i = 1 N I ( y i = c k ) + S i λ P_{\lambda}(X^{(j)}=a_{ji}|Y=c_k)=\frac{\Sigma_{i=1}^N{I(x_i^{(j)}=a_{ij},y_i=c_k)}+\lambda}{\Sigma_{i=1}^N{I(y_i=c_k)}+S_i\lambda} Pλ(X(j)=ajiY=ck)=Σi=1NI(yi=ck)+SiλΣi=1NI(xi(j)=aij,yi=ck)+λ
  则同样以例题形式,数据同上表,按照拉普拉斯平滑估计概率,即取 λ = 1 \lambda=1 λ=1
  公式推导我就不多说了,贝叶斯参数估计的公式其实就是在条件概率公式的分子加一个 λ \lambda λ,分母加一个 K λ K\lambda Kλ S i λ S_{i}\lambda Siλ,其中K为y的种类, S i S_i Si为某特征的种类,本题中y=1或-1,所以K=2, x ( 1 ) x^{(1)} x(1)有1,2,3这三种,即 S 1 S_1 S1=3。
  接下来我们来进行计算,同样先计算目标函数y:

P ( Y = 1 ) = 9 + 1 15 + 2 ∗ 1 = 10 17 , P ( Y = − 1 ) = 6 + 1 15 + 2 ∗ 1 = 7 17 P(Y=1)=\frac{9+1}{15+2*1}=\frac{10}{17},P(Y=-1)=\frac{6+1}{15+2*1}=\frac{7}{17} P(Y=1)=15+219+1=1710,P(Y=1)=15+216+1=177
  再看各特征的条件概率:
P ( x ( 1 ) = 1 ∣ Y = 1 ) = 2 + 1 9 + 3 = 3 12 P(x^{(1)}=1|Y=1)=\frac{2+1}{9+3}=\frac{3}{12} P(x(1)=1Y=1)=9+32+1=123
  这里分母为什么加3呢,因为这是特征 x ( 1 ) x^{(1)} x(1)有1,2,3这三种,即 S 1 S_1 S1=3,同理 x ( 2 ) x^{(2)} x(2)也有S,M,L三种,因此下面的 S 2 S_2 S2=3.
  计算结果如下:
P ( x ( 1 ) = 2 ∣ Y = 1 ) = 4 12 , P ( x ( 1 ) = 3 ∣ Y = 1 ) = 5 12 P(x^{(1)}=2|Y=1)=\frac{4}{12},P(x^{(1)}=3|Y=1)=\frac{5}{12} P(x(1)=2Y=1)=124,P(x(1)=3Y=1)=125
P ( x ( 2 ) = S ∣ Y = 1 ) = 2 12 , P ( x ( 2 ) = M ∣ Y = 1 ) = 5 12 , P ( x ( 2 ) = L ∣ Y = 1 ) = 5 12 P(x^{(2)}=S|Y=1)=\frac{2}{12},P(x^{(2)}=M|Y=1)=\frac{5}{12},P(x^{(2)}=L|Y=1)=\frac{5}{12} P(x(2)=SY=1)=122,P(x(2)=MY=1)=125,P(x(2)=LY=1)=125
P ( x ( 1 ) = 1 ∣ Y = − 1 ) = 4 9 , P ( x ( 1 ) = 2 ∣ Y = − 1 ) = 3 9 , P ( x ( 1 ) = 3 ∣ Y = − 1 ) = 2 9 P(x^{(1)}=1|Y=-1)=\frac{4}{9},P(x^{(1)}=2|Y=-1)=\frac{3}{9},P(x^{(1)}=3|Y=-1)=\frac{2}{9} P(x(1)=1Y=1)=94,P(x(1)=2Y=1)=93,P(x(1)=3Y=1)=92
P ( x ( 2 ) = S ∣ Y = − 1 ) = 4 9 , P ( x ( 2 ) = M ∣ Y = − 1 ) = 3 9 , P ( x ( 2 ) = L ∣ Y = − 1 ) = 2 9 P(x^{(2)}=S|Y=-1)=\frac{4}{9},P(x^{(2)}=M|Y=-1)=\frac{3}{9},P(x^{(2)}=L|Y=-1)=\frac{2}{9} P(x(2)=SY=1)=94,P(x(2)=MY=1)=93,P(x(2)=LY=1)=92
  再对于给定的 x = ( 2 , S ) T x=(2,S)^T x=(2,S)T:
P ( Y = 1 ) P ( X ( 1 ) = 2 ∣ Y = 1 ) P ( X ( 2 ) = S ∣ Y = 1 ) = 10 17 ∗ 4 12 ∗ 2 12 = 5 153 = 0.0327 P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{10}{17}*\frac{4}{12}*\frac{2}{12}=\frac{5}{153}=0.0327 P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=1710124122=1535=0.0327
P ( Y = − 1 ) P ( X ( 1 ) = 2 ∣ Y = − 1 ) P ( X ( 2 ) = S ∣ Y = − 1 ) = 7 17 ∗ 3 9 ∗ 4 9 = 28 459 = 0.0610 P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{7}{17}*\frac{3}{9}*\frac{4}{9}=\frac{28}{459}=0.0610 P(Y=1)P(X(1)=2Y=1)P(X(2)=SY=1)=1779394=45928=0.0610
因此,预测y=-1。

三、朴素贝叶斯分类器的优缺点

优点:

  • 预测测试数据集的类别是容易且快速的,它在多分类预测中也表现良好。
  • 当独立性假设成立时,朴素贝叶斯分类器与逻辑回归等其他模型相比表现更好,而且需要更少的训练数据。
  • 与数值变量相比,该模型在分类输入变量的情况下表现更好。
  • 对缺失数据不敏感,所以常用于文本分类。

缺点:

  • 如果出现“零概率”时,模型不能进行预测。因此我们需要使用平滑技术。最简单的平滑技术之一是拉普拉斯评估。
  • 另一方面,朴素贝叶斯(Bayes)也被称为不好的估计器,所以来自predict_proba的概率输出不应该被过于重视。
  • 对训练数据的依赖性很强,如果训练数据误差较大,那么预测出来的效果就会不佳。
  • 朴素贝叶斯的另一个局限是独立预测因子的假设。在现实生活中,我们得到一组完全独立的预测变量几乎是不可能的。
    注:我们知道朴素贝叶斯模型中的输入变量都是条件独立的,这是该模型的基本前提,但如果输入变量之间存在概率依存关系,那这时模型就变成了贝叶斯网络。

四、朴素贝叶斯算法的应用

  实时预测:该模型速度很快。 因此,它可以用于实时预测。

  多分类器:由贝叶斯公式可知,这种算法也是一个多分类器。因此我们可以预测多个目标变量类别的概率。

  文本分类/垃圾邮件过滤/情感分析:该模型被广泛用于垃圾邮件过滤识别和情感分析。可以用于文本分类,成功率很高。

  推荐系统:朴素贝叶斯分类器和协作过滤一起构建推荐系统,该系统使用机器学习和数据挖掘技术来过滤看不见的信息并预测用户是否喜欢给定的资源。

五、朴素贝叶斯的分类

sklearn库中有三种类型的朴素贝叶斯模型:

  高斯(Gaussian):它用于分类,它假设特征遵循正态分布,意思就是对连续型数据进行处理。

  多项式(Multinomial):用于离散计数。计算数据的条件概率(使用拉普拉斯估计器进行平滑的一个模型)。

  伯努利(Bernoulli):取值特征是布尔型,即ture或false,在进行文档分类时,就是一个单词有没有在一个文档中出现过。

六、朴素贝叶斯的调优

以下是提高Naive Bayes模型功能的一些建议:

  • 如果连续性特征不具有正态分布,则应采用变换或不同的方法将其转换为正态分布。
  • 如果测试数据集具有零频率问题,则应用平滑技术“拉普拉斯修正”来预测测试数据集的类别。
  • 删除相关特征,因为高度相关的特征在模型中被投票两次,并且可能导致过度膨胀的重要性。
  • 朴素贝叶斯是根据训练集进行分类,分类出来的结果基本上就是确定了的。所以是没有超参数可以调整的,只能通过alpha = 1来平滑,alpha值并不算超参数;或者使用fit_prior = [True | False]来学习- 类别先验概率。个人觉得用朴素贝叶斯模型的话要把重点放在数据的预处理和特征选择上。
  • 最后,一些常用的分类器组合技术是没有效果的,如集合,装袋和提高。因为它们的目的是减少变化。而朴素贝叶斯没有任何变化可以最小化。

七、python实现代码

直接在下一篇博客中,写之前kaggle竞赛的项目,项目中会用到NB,实现的话用sklearn是很简单的。稍微写一下核心(没有前后文,单独运行肯定是不行的)

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
model = GaussianNB()
# 用训练数据拟合
model.fit(X_train,y_train)
# 预测
predict_train = model.predict(X_train)
trainaccuracy = accuracy_score(y_train,predict_train)
print('accuracy_score on train dataset : ', trainaccuracy)

用sklearn库基本上这些机器学习代码就这么多,我只能说开发sklearn的是神。

你可能感兴趣的:(python,分类,机器学习)