机器学习一:朴素贝叶斯(Naive Bayes)


Reference:

  1. Naive Bayes
  2. 周志华《机器学习》

相关文章:贝叶斯法则

1. Introduction

朴素贝叶斯方法是一组基于贝叶斯定理的有监督学习算法,该算法的"幼稚"假设是给定类变量值的每一对特征之间的条件独立性

不难发现,基于贝叶斯公式 P ( y ∣ x ) = P ( y ) P ( x ∣ y ) P ( x ) P(y \mid \boldsymbol{x})=\frac{P(y) P(\boldsymbol{x} \mid y)}{P(\boldsymbol{x})} P(yx)=P(x)P(y)P(xy) 来估计后验概率 P ( y ∣ x ) P(y \mid \boldsymbol{x}) P(yx) 的主要用难在于:类条件概率 P ( x ∣ y ) P(\boldsymbol{x} \mid y) P(xy) 是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避开这个障碍,朴素贝叶斯分类器 (naÏve Bayes classifier)采用了"属性条件独立性假设" (attribute conditional independence assumption): 对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果发生影响

通过贝叶斯定理,给出 类变量 y y y 与 相关特征向量 x 1 x_1 x1 x n x_n xn 的关系:
P ( y ∣ x 1 , … , x n ) = P ( y ) P ( x 1 , … , x n ∣ y ) P ( x 1 , … , x n ) P\left(y \mid x_{1}, \ldots, x_{n}\right)=\frac{P(y) P\left(x_{1}, \ldots, x_{n} \mid y\right)}{P\left(x_{1}, \ldots, x_{n}\right)} P(yx1,,xn)=P(x1,,xn)P(y)P(x1,,xny)

使用朴素条件独立假设:
P ( x i ∣ y , x 1 , … , x i − 1 , x i + 1 , … , x n ) = P ( x i ∣ y ) P\left(x_{i} \mid y, x_{1}, \ldots, x_{i-1}, x_{i+1}, \ldots, x_{n}\right)=P\left(x_{i} \mid y\right) P(xiy,x1,,xi1,xi+1,,xn)=P(xiy)

对于所有 i i i,关系简化为:
P ( y ∣ x 1 , … , x n ) = P ( y ) ∏ i = 1 n P ( x i ∣ y ) P ( x 1 , … , x n ) P\left(y \mid x_{1}, \ldots, x_{n}\right)=\frac{P(y) \prod_{i=1}^{n} P\left(x_{i} \mid y\right)}{P\left(x_{1}, \ldots, x_{n}\right)} P(yx1,,xn)=P(x1,,xn)P(y)i=1nP(xiy)

因为 P ( x 1 , … , x n ) P\left(x_{1}, \ldots, x_{n}\right) P(x1,,xn) 是给定常数,我们可以使用下面的分类规则:
P ( y ∣ x 1 , … , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) ⇓ y ^ = arg ⁡ max ⁡ y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \begin{array}{r} P\left(y \mid x_{1}, \ldots, x_{n}\right) \propto P(y) \prod_{i=1}^{n} P\left(x_{i} \mid y\right) \\ \Downarrow \\ \hat{y}=\arg \max _{y} P(y) \prod_{i=1}^{n} P\left(x_{i} \mid y\right) \end{array} P(yx1,,xn)P(y)i=1nP(xiy)y^=argmaxyP(y)i=1nP(xiy)
然后利用最大后验估计(Maximum A Posteriori MAP)来估计 P ( y ) P(y) P(y) P ( x i ∣ y ) P\left(x_{i} \mid y\right) P(xiy);前者是类 y y y 在训练集中出现的相对频率。

不同的朴素贝叶斯分类器的区别主要在于它们对分布 P ( x i ∣ y ) P\left(x_{i} \mid y\right) P(xiy) 的假设

尽管朴素贝叶斯分类器的假设明显过于简化,但它们在许多现实世界的情况下都工作得相当好,比如著名的文档分类和垃圾邮件过滤。它们需要少量的训练数据来估计必要的参数。(关于朴素贝叶斯的理论原因,以及它适用于哪些类型的数据,请参见下面的参考资料。)

与更复杂的方法相比,朴素贝叶斯学习器和分类器可以非常快。类条件特征分布的解耦意味着每个分布都可以独立地估计为一维分布。这反过来有助于缓解来自维度灾难的问题。

另一方面,虽然朴素贝叶斯被认为是一个不错的分类器,但它被认为是一个糟糕的估计器,所以来自 predict_proba 的概率输出不必太认真。

朴素贝叶斯分类器的训练过程就是基于训练集 D D D 来估计类先验概率 P ( y ) P(y) P(y) ,并为每个属性估计条件概率 P ( x i ∣ y ) P(x_i \mid y) P(xiy)

D y D_y Dy 表示训练集 D D D 中第 y y y 类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
P ( y ) = ∣ D y ∣ ∣ D ∣ P\left( y\right)=\frac{\left|D_{y}\right|}{|D|} P(y)=DDy

1.1 离散属性

对离散属性而言,令 D y , x i D_{y, x_{i}} Dy,xi 表示 D y D_{y} Dy 中在第 i i i 个属性上取值为 x i x_i xi 的样本组成的集合,则条件概率 P ( x i ∣ y ) P(x_{i} \mid y) P(xiy) 可估计为:
P ( x i ∣ y ) = ∣ D y , x i ∣ ∣ D y ∣ P\left(x_{i} \mid y\right)=\frac{\left|D_{y, x_{i}}\right|}{\left|D_{y}\right|} P(xiy)=DyDy,xi

1.2 连续属性

1.2.1 Gaussian Naive Bayes

对连续属性可考虑概率密度函数,GaussianNB 实现了用于分类的高斯朴素贝叶斯算法。假设特征的似然为高斯分布:
P ( x i ∣ y ) = 1 2 π σ y 2 exp ⁡ ( − ( x i − μ y , i ) 2 2 σ y , i 2 ) P\left(x_{i} \mid y\right)=\frac{1}{\sqrt{2 \pi \sigma_{y}^{2}}} \exp \left(-\frac{\left(x_{i}-\mu_{y,i}\right)^{2}}{2 \sigma_{y,i}^{2}}\right) P(xiy)=2πσy2 1exp(2σy,i2(xiμy,i)2)

参数 σ y , i \sigma_{y,i} σy,i and μ y , i \mu_{y,i} μy,i 分别是第 y y y 个属性上取值的均值和方差,被用于估计最大似然。

1.2.2 Multinomial Naive Bayes

MultinomialNB 实现了多项分布数据的朴素贝叶斯算法,是文本分类中使用的两种经典朴素贝叶斯变体之一(在文本分类中,数据通常以单词向量计数表示,尽管 tf-idf 向量在实践中也很好用)。每个类别的分布由向量 θ y = ( θ y 1 , … , θ y n ) \theta_{y}=\left(\theta_{y 1}, \ldots, \theta_{y n}\right) θy=(θy1,,θyn) 对每个类别 y y y 参数化,其中 n n n 是特征的数量(在文本分类中,词汇量的大小), θ y i \theta_{yi} θyi 是特征 i i i 出现在属于类别 y y y 的样本中的概率 P ( x i ∣ y ) P\left(x_{i} \mid y\right) P(xiy)

通过最大似然的平滑版本估计参数 θ y \theta_y θy,即相对频率计数:
θ ^ y i = N y i + α N y + α n \hat{\theta}_{y i}=\frac{N_{y i}+\alpha}{N_{y}+\alpha n} θ^yi=Ny+αnNyi+α

其中 N y i = ∑ x ∈ T x i N_{y i}=\sum_{x \in T} x_{i} Nyi=xTxi 为训练集 T T T 中某类样本 y y y 中出现特征 i i i 的次数, N y = ∑ i = 1 n N y i N_{y}=\sum_{i=1}^{n} N_{y i} Ny=i=1nNyi 为类 y y y 所有特征的总数。

平滑先验 α ≥ 0 \alpha \geq 0 α0 解释了学习样本中不存在的特征,并防止在进一步的计算中出现零概率。设置 α = 0 \alpha = 0 α=0 称为 Laplace 平滑,而 α < 0 \alpha < 0 α<0 称为 Lidstone 平滑。

1.2.3 Complement Naive Bayes

ComplementNB 实现了互补朴素贝叶斯(CNB)算法。CNB 是标准多项朴素贝叶斯(MNB)算法的一种改编,特别适合于不平衡数据集。具体来说,CNB 利用每个类的补充数据来计算模型的权重。实验结果表明,与 MNB 相比,CNB 的参数估计更稳定。此外,在文本分类任务上,CNB 通常优于 MNB(通常有相当大的差距)。权重的计算过程如下:
θ ^ c i = α i + ∑ j : y j ≠ c d i j α + ∑ j : y j ≠ c ∑ k d k j w c i = log ⁡ θ ^ c i w c i = w c i ∑ j ∣ w c j ∣ \begin{array}{r} \hat{\theta}_{c i}=\frac{\alpha_{i}+\sum_{j: y_{j} \neq c} d_{i j}}{\alpha+\sum_{j: y_{j} \neq c} \sum_{k} d_{k j}} \\ w_{c i}=\log \hat{\theta}_{c i} \\ w_{c i}=\frac{w_{c i}}{\sum_{j}\left|w_{c j}\right|} \end{array} θ^ci=α+j:yj=ckdkjαi+j:yj=cdijwci=logθ^ciwci=jwcjwci

其中,求和是对所有不在类 c c c 中的文档 j j j 进行的, d i j d_{ij} dij 是文档中术语的计数或 tf-idf 值,是一个平滑超参数,就像在 MNB 中发现的那样,且 α = ∑ i α i \alpha = \sum_i \alpha_i α=iαi。第二种归一化处理了较长的文件在 MNB 中主要参数估计数的趋势。
c ^ = arg ⁡ min ⁡ c ∑ i t i w c i \hat{c}=\arg \min _{c} \sum_{i} t_{i} w_{c i} c^=argcminitiwci

也就是说,一个文档被赋给了 complement match 最差的类。

2. 训练和测试数据集

要保证训练和测试是在不同数据集上进行的,如果你不这么做,训练数据就可能出现过拟合。也就是说,模型可能会高估了自己对所有情况的了解程度---------这一点非常重要,因为在机器学习中需要泛化分类器,使它能够识别某些方面存在差别的新数据。

算法本身会记住所有训练数据,那么使用训练数据进行测试始终会获得 100% 的正确率,但它不知道如何泛化以分类新的数据。

所以应该始终遵守的规则是:永远保留大约 10% 的数据将其用作测试集。通过这些数据可以真正了解分类器在学习数据模式方面的进展,更客观地展示在利用训练集进行分类器训练时的表现。

3. 总结

优点:

  • 这种算法非常容易执行,它的特征空间非常大;
  • 该算法运行起来非常容易,效率非常高。

缺点:

  • 它有时候会失败,有时候失败得很好笑。比如由多个单词组成且意义明显不同的短语,朴素贝叶斯就不太适用了。

所以要根据想要解决的具体问题以及解决问题所需要用到的数据集,来选择算法。不可以把监督分类算法当作是一个黑盒,而应该把它们上升到一种对于理论的理解。包括算法如何运行,以及它们是否适合于想要解决的问题。

4. 实例

在这里插入图片描述
现使用上述数据集训练一个朴素贝叶斯分类器,然后对下述测试示例进行分类:
在这里插入图片描述
首先估计类先验概率 P ( y ) P(y) P(y) , 显然有:
P ( 好瓜 = 是 ) = 8 17 ≈ 0.471 , P ( 好瓜 = 否 ) = 9 17 ≈ 0.529. \begin{array}{l} P(好瓜=是)=\frac{8}{17}\approx 0.471, \\ P(好瓜=否)=\frac{9}{17}\approx 0.529. \end{array} P(好瓜=)=1780.471,P(好瓜=)=1790.529.

然后,为每个属性估计条件概率 P ( x i ∣ c ) P(x_i \mid c) P(xic)
P 青绿|是  = P (  色泽  =  青绿  ∣  好瓜  =  是  ) = 3 8 = 0.375 ,  P 青绿|否  = P (  色泽  =  青绿  ∣  好瓜  =  否  ) = 3 9 ≈ 0.333 ,  P 蜷缩|是  = P (  根蒂  =  蜷缩  ∣  好瓜  =  是  ) = 5 8 = 0.375 , P 蜷缩|否  = P (  根蒂  =  蜷缩  ∣  好瓜  =  否  ) = 3 9 ≈ 0.333  ,  P 浊响|是  = P (  敲声  =  浊响  ∣  好瓜  =  是  ) = 6 8 = 0.750  ,  P 浊响|否  = P (  敲声  =  浊响  ∣  好瓜  =  否  ) = 4 9 ≈ 0.444 , P 清晰|是  = P (  纹理  =  清晰  ∣  好瓜  =  是  ) = 7 8 = 0.875 , P 清晰|否  = P (  纹理  =  清晰  ∣  好瓜  =  否  ) = 2 9 ≈ 0.222 ,  P 凹陷|是  = P (  脐部  =  凹陷  ∣  好瓜  =  是  ) = 6 8 = 0.750 ,  P 凹陷|否  = P (  脐部  =  凹陷  ∣  好瓜  =  否  ) = 2 9 ≈ 0.222 , P 硬滑|是  = P (  触感  =  硬滑  ∣  好瓜  =  是  ) = 6 8 = 0.750  ,  P 硬滑|否  = P (  触感  =  硬滑  ∣  好瓜  =  否  ) = 6 9 ≈ 0.667 ,  p 密度:  0.697 ∣  是  = p (  密度  = 0.697 ∣  好瓜  =  是  ) = 1 2 π ⋅ 0.129 exp ⁡ ( − ( 0.697 − 0.574 ) 2 2 ⋅ 0.12 9 2 ) ≈ 1.959 , p 密度:  0.697 ∣  否  = p (  密度  = 0.697 ∣  好瓜  =  否  ) = 1 2 π ⋅ 0.195 exp ⁡ ( − ( 0.697 − 0.496 ) 2 2 ⋅ 0.19 5 2 ) ≈ 1.203 ,  p 含糖:  0.460 ∣  是  = p  (含糖率  = 0.460 ∣  好瓜  =  是  ) = 1 2 π ⋅ 0.101 exp ⁡ ( − ( 0.460 − 0.279 ) 2 2 ⋅ 0.10 1 2 ) ≈ 0.788 , p 含糖:  0.460 ∣  否  = p  (含糖率  = 0.460 ∣  好瓜  =  否  ) = 1 2 π ⋅ 0.108 exp ⁡ ( − ( 0.460 − 0.154 ) 2 2 ⋅ 0.10 8 2 ) ≈ 0.066 .  \begin{array}{l} P_{\text {青绿|是 }}=P(\text { 色泽 }=\text { 青绿 } \mid \text { 好瓜 }=\text { 是 })=\frac{3}{8}=0.375 \text {, }\\ P_{\text {青绿|否 }}=P(\text { 色泽 }=\text { 青绿 } \mid \text { 好瓜 }=\text { 否 })=\frac{3}{9} \approx 0.333 \text {, }\\ P_{\text {蜷缩|是 }}=P(\text { 根蒂 }=\text { 蜷缩 } \mid \text { 好瓜 }=\text { 是 })=\frac{5}{8}=0.375 ,\\ P_{\text {蜷缩|否 }}=P(\text { 根蒂 }=\text { 蜷缩 } \mid \text { 好瓜 }=\text { 否 })=\frac{3}{9} \approx 0.333 \text { , }\\ P_{\text {浊响|是 }}=P(\text { 敲声 }=\text { 浊响 } \mid \text { 好瓜 }=\text { 是 })=\frac{6}{8}=0.750 \text { , }\\ P_{\text {浊响|否 }}=P(\text { 敲声 }=\text { 浊响 } \mid \text { 好瓜 }=\text { 否 })=\frac{4}{9} \approx 0.444,\\ P_{\text {清晰|是 }}=P(\text { 纹理 }=\text { 清晰 } \mid \text { 好瓜 }=\text { 是 })=\frac{7}{8}=0.875 ,\\ P_{\text {清晰|否 }}=P(\text { 纹理 }=\text { 清晰 } \mid \text { 好瓜 }=\text { 否 })=\frac{2}{9} \approx 0.222 \text {, }\\ P_{\text {凹陷|是 }}=P(\text { 脐部 }=\text { 凹陷 } \mid \text { 好瓜 }=\text { 是 })=\frac{6}{8}=0.750 \text {, }\\ P_{\text {凹陷|否 }}=P(\text { 脐部 }=\text { 凹陷 } \mid \text { 好瓜 }=\text { 否 })=\frac{2}{9} \approx 0.222 ,\\ P_{\text {硬滑|是 }}=P(\text { 触感 }=\text { 硬滑 } \mid \text { 好瓜 }=\text { 是 })=\frac{6}{8}=0.750 \text { , }\\ P_{\text {硬滑|否 }}=P(\text { 触感 }=\text { 硬滑 } \mid \text { 好瓜 }=\text { 否 })=\frac{6}{9} \approx 0.667 \text {, }\\ p_{\text {密度: } 0.697 \mid \text { 是 }}=p(\text { 密度 }=0.697 \mid \text { 好瓜 }=\text { 是 }) =\frac{1}{\sqrt{2 \pi} \cdot 0.129} \exp \left(-\frac{(0.697-0.574)^{2}}{2 \cdot 0.129^{2}}\right) \approx 1.959,\\ p_{\text {密度: } 0.697 \mid \text { 否 }}=p(\text { 密度 }=0.697 \mid \text { 好瓜 }=\text { 否 }) =\frac{1}{\sqrt{2 \pi} \cdot 0.195} \exp \left(-\frac{(0.697-0.496)^{2}}{2 \cdot 0.195^{2}}\right) \approx 1.203 \text {, }\\ \left.p_{\text {含糖: } 0.460 \mid \text { 是 }}=p \text { (含糖率 }=0.460 \mid \text { 好瓜 }=\text { 是 }\right) =\frac{1}{\sqrt{2 \pi} \cdot 0.101} \exp \left(-\frac{(0.460-0.279)^{2}}{2 \cdot 0.101^{2}}\right) \approx 0.788,\\ \left.p_{\text {含糖: } 0.460 \mid \text { 否 }}=p \text { (含糖率 }=0.460 \mid \text { 好瓜 }=\text { 否 }\right) =\frac{1}{\sqrt{2 \pi} \cdot 0.108} \exp \left(-\frac{(0.460-0.154)^{2}}{2 \cdot 0.108^{2}}\right) \approx 0.066 \text {. } \end{array} P青绿| =P( 色泽 = 青绿  好瓜 =  )=83=0.375P青绿| =P( 色泽 = 青绿  好瓜 =  )=930.333P蜷缩| =P( 根蒂 = 蜷缩  好瓜 =  )=85=0.375P蜷缩| =P( 根蒂 = 蜷缩  好瓜 =  )=930.333  P浊响| =P( 敲声 = 浊响  好瓜 =  )=86=0.750  P浊响| =P( 敲声 = 浊响  好瓜 =  )=940.444,P清晰| =P( 纹理 = 清晰  好瓜 =  )=87=0.875P清晰| =P( 纹理 = 清晰  好瓜 =  )=920.222P凹陷| =P( 脐部 = 凹陷  好瓜 =  )=86=0.750P凹陷| =P( 脐部 = 凹陷  好瓜 =  )=920.222P硬滑| =P( 触感 = 硬滑  好瓜 =  )=86=0.750  P硬滑| =P( 触感 = 硬滑  好瓜 =  )=960.667p密度0.697  =p( 密度 =0.697 好瓜 =  )=2π 0.1291exp(20.1292(0.6970.574)2)1.959,p密度0.697  =p( 密度 =0.697 好瓜 =  )=2π 0.1951exp(20.1952(0.6970.496)2)1.203p含糖0.460  =p (含糖率 =0.460 好瓜 =  )=2π 0.1011exp(20.1012(0.4600.279)2)0.788,p含糖0.460  =p (含糖率 =0.460 好瓜 =  )=2π 0.1081exp(20.1082(0.4600.154)2)0.066

于是,有:
P (  好瓜  =  是  ) × P 青绿|是  × P 蜷缩|是  × P 浊响|是  × P 清晰|是  × P 凹陷|是  × P 硬滑|是  × p 密度:  0.697 ∣  是  × p 含糖:  0.460 ∣  是  ≈ 0.038 , P (  好瓜  =  否  ) × P 青绿|否  × P 蜷缩|否  × P 浊响|否  × P 清晰|否  × P 凹陷|否  × P 硬滑|否  × p 密度:  0.697 ∣  否  × p 含糖:  0.460 ∣  否  ≈ 6.80 × 1 0 − 5 . \begin{array}{l} P(\text { 好瓜 }=\text { 是 }) \times P_{\text {青绿|是 }} \times P_{\text {蜷缩|是 }} \times P_{\text {浊响|是 }} \times P_{\text {清晰|是 }} \times P_{\text {凹陷|是 }} \times P_{\text {硬滑|是 }} \times p_{\text {密度: } 0.697 \mid \text { 是 }} \times p_{\text {含糖: } 0.460 \mid \text { 是 }} \approx 0.038, \\ P(\text { 好瓜 }=\text { 否 }) \times P_{\text {青绿|否 }} \times P_{\text {蜷缩|否 }} \times P_{\text {浊响|否 }} \times P_{\text {清晰|否 }} \times P_{\text {凹陷|否 }} \times P_{\text {硬滑|否 }} \times p_{\text {密度: } 0.697 \mid \text { 否 }} \times p_{\text {含糖: } 0.460 \mid \text { 否 }} \approx 6.80 \times 10^{-5} . \end{array} P( 好瓜 =  )×P青绿| ×P蜷缩| ×P浊响| ×P清晰| ×P凹陷| ×P硬滑| ×p密度0.697  ×p含糖0.460  0.038,P( 好瓜 =  )×P青绿| ×P蜷缩| ×P浊响| ×P清晰| ×P凹陷| ×P硬滑| ×p密度0.697  ×p含糖0.460  6.80×105.

由于 0.038 > 6.80 × 1 0 − 5 0.038>6.80\times10^{-5} 0.038>6.80×105因此,朴素贝叶斯分类器将测试样本判别为“好瓜”

需注意,若某个属性值在训练集中没有与某个类同时出现过,则直接基于
P ( x i ∣ y ) = ∣ D y , x i ∣ ∣ D y ∣ P\left(x_{i} \mid y\right)=\frac{\left|D_{y, x_{i}}\right|}{\left|D_{y}\right|} P(xiy)=DyDy,xi 进行概率估计,再根据式 y ^ = arg ⁡ max ⁡ y P ( y ) ∏ i = 1 n P ( x i ∣ y ) \hat{y}=\arg \max _{y} P(y) \prod_{i=1}^{n} P\left(x_{i} \mid y\right) y^=argmaxyP(y)i=1nP(xiy) 进行判别将出现问题。例如,在使用上述数据集训练朴素贝叶斯分类器时,对一个"敲声=清脆"的测试例,有
P 清脆 ∣ 是 = P ( 敲声 = 清脆 ∣ 好瓜 = 是 ) = 0 8 = 0 P_{清脆|是} =P(敲声=清脆|好瓜=是)=\frac{0}{8}=0 P清脆=P(敲声=清脆好瓜=)=80=0

由于式连乘式计算出的概率值为零,因此,无论该样本的其他属性是什么,哪怕在其他属性上明显像好瓜,分类的结果都将是"好瓜=否",这样显然太合理。

为了避免其他属性携带的信息被训练集中未出现的属性值"抹去“,在估计概率值时通常要进行"平滑" (smoothing) ,常用"拉普拉斯修正" (Laplacian correction)。具体来说,令 N N N 表示训练集 D D D 中可能的类别数, N i N_i Ni 表示第 i i i 个属性可能的取值数,则上式的 P ( y ) = ∣ D y ∣ ∣ D ∣ P\left( y\right)=\frac{\left|D_{y}\right|}{|D|} P(y)=DDy P ( x i ∣ y ) = ∣ D y , x i ∣ ∣ D y ∣ P\left(x_{i} \mid y\right)=\frac{\left|D_{y, x_{i}}\right|}{\left|D_{y}\right|} P(xiy)=DyDy,xi 分别修正为:
P ^ ( y ) = ∣ D y ∣ + 1 ∣ D ∣ + N P ^ ( x i ∣ y ) = ∣ D y , x i ∣ + 1 ∣ D y ∣ + N i . \begin{aligned} \hat{P}(y) &=\frac{\left|D_{y}\right|+1}{|D|+N} \\ \hat{P}\left(x_{i} \mid y\right) &=\frac{\left|D_{y, x_{i}}\right|+1}{\left|D_{y}\right|+N_{i}} . \end{aligned} P^(y)P^(xiy)=D+NDy+1=Dy+NiDy,xi+1.

例如,在本节的例子中,类先验概率可估计为:
P ^ (  好瓜  =  是  ) = 8 + 1 17 + 2 ≈ 0.474 , P ^ (  好瓜  =  否  ) = 9 + 1 17 + 2 ≈ 0.526. \hat{P}(\text { 好瓜 }=\text { 是 })=\frac{8+1}{17+2} \approx 0.474, \quad \hat{P}(\text { 好瓜 }=\text { 否 })=\frac{9+1}{17+2} \approx 0.526. P^( 好瓜 =  )=17+28+10.474,P^( 好瓜 =  )=17+29+10.526.

类似地 , P 青绿 ∣ 是 P_{青绿|是} P青绿 P 青绿 ∣ 否 P_{青绿|否} P青绿 可估计为:
P ^ 青绿|是  = P ^ (  色泽  =  青绿  ∣  好瓜  =  是  ) = 3 + 1 8 + 3 ≈ 0.364 ,  P ^ 青绿|否  = P ^ (  色泽  =  青绿  ∣  好瓜  =  否  ) = 3 + 1 9 + 3 ≈ 0.333 . \begin{aligned} \hat{P}_{\text {青绿|是 }}&=\hat{P}(\text { 色泽 }=\text { 青绿 } \mid \text { 好瓜 }=\text { 是 })=\frac{3+1}{8+3} \approx 0.364 \text {, }\\ \hat{P}_{\text {青绿|否 }}&=\hat{P}(\text { 色泽 }=\text { 青绿 } \mid \text { 好瓜 }=\text { 否 })=\frac{3+1}{9+3} \approx 0.333 \text {.} \end{aligned} P^青绿| P^青绿| =P^( 色泽 = 青绿  好瓜 =  )=8+33+10.364=P^( 色泽 = 青绿  好瓜 =  )=9+33+10.333.

同时,上文提到的概率 P 清脆 ∣ 是 P_{清脆|是} P清脆 可估计为:
P ^ 清脆|是  = P ^ (  敲声  =  清脆  ∣  好瓜  =  是  ) = 0 + 1 8 + 3 ≈ 0.091 .  \hat{P}_{\text {清脆|是 }}=\hat{P}(\text { 敲声 }=\text { 清脆 } \mid \text { 好瓜 }=\text { 是 })=\frac{0+1}{8+3} \approx 0.091 \text {. } P^清脆| =P^( 敲声 = 清脆  好瓜 =  )=8+30+10.091

显然,拉普拉斯修正(拉普拉斯修正实质上假设了属性值与类别均匀分布,这是在朴素贝叶斯学习过程中额外引入的关于
数据的先验)避免了因训练集样本不充分而导致概率估值为零的问题,并且在训练集变大时,修正过程所引入的先验 (prior) 的影响也会逐渐变得可忽略,使得估值渐趋向于实际概率值。

文章跳转:
机器学习二:支持向量机
机器学习三:决策树
传统物体检测

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,那我们来实现一个朴素贝叶斯分类器吧。 首先,我们需要导入需要的库,包括numpy、pandas、sklearn中的train_test_split和MultinomialNB。代码如下: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB ``` 接下来,我们要读取数据集。这里我们使用UCI机器学习库中的Spambase数据集,该数据集包含了4601封电子邮件,其中1813封是垃圾邮件,2788封是正常邮件。数据集中有57个特征,包括每封邮件中出现的单词的频率、字符的频率等。我们可以使用pandas库读取该数据集,代码如下: ```python data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data', header=None) ``` 然后,我们将数据集分成训练集和测试集。训练集用来训练模型,测试集用来评估模型的性能。我们可以使用sklearn中的train_test_split函数来实现数据集的分割,代码如下: ```python X_train, X_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=42) ``` 这里我们将数据集按照7:3的比例分成训练集和测试集。 接下来,我们可以使用MultinomialNB来实现朴素贝叶斯分类器。MultinomialNB适用于多项式分布的数据,这里我们将每个特征的频率作为输入。代码如下: ```python clf = MultinomialNB() clf.fit(X_train, y_train) ``` 在这里,我们使用fit函数对训练集进行拟合,从而得到一个朴素贝叶斯分类器。 最后,我们可以使用测试集来评估模型的性能。代码如下: ```python y_pred = clf.predict(X_test) accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 这里我们使用predict函数对测试集进行预测,然后计算模型的准确率。 完整代码如下: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB # 读取数据集 data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data', header=None) # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=42) # 训练朴素贝叶斯分类器 clf = MultinomialNB() clf.fit(X_train, y_train) # 评估模型性能 y_pred = clf.predict(X_test) accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 运行该代码,可以得到以下输出: ``` Accuracy: 0.8205099279858907 ``` 这意味着我们的朴素贝叶斯分类器在该测试集上的准确率约为82%。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泠山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值