【机器学习算法介绍】朴素贝叶斯

1 概述

  • 一种监督学习算法

  • “朴素”的原因:假设所有特征之间相互独立

  • 既可以用于处理连续数据,又可以用于处理离散数据

    • 处理连续数据的方法:
      • Gaussian Naive Bayes(高斯朴素贝叶斯)
    • 处理离散数据的方法(常用于文本分类任务):
      • Multinomial Naive Bayes(多项式朴素贝叶斯)
      • Bernoulli Naive Bayes(伯努利朴素贝叶斯)
      • Complement Naive Bayes(多项式朴素贝叶斯的加强版)
  • 思路较简单,速度非常快

2 原理

2.1 贝叶斯定理

设当前要预测的样本为 x \boldsymbol x x,它拥有 x 1 , x 2 , . . . , x n x_1,x_2, ...,x_n x1,x2,...,xn n n n 个特征。则 x \boldsymbol x x 属于某一类别 y \boldsymbol y y 的概率为:

P ( y ∣ x 1 , … , x n ) = P ( y ) P ( x 1 , … , x n ∣ y ) P ( x 1 , … , x n ) P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots, x_n \mid y)} {P(x_1, \dots, x_n)} P(yx1,,xn)=P(x1,,xn)P(y)P(x1,,xny)

  • P ( y ) P(y) P(y):类的先验概率,即训练集中第 y 类样本的个数与整个训练集样本个数的比值

  • P ( x 1 , . . . , x n ) P(x_1,...,x_n) P(x1,...,xn): 对于给定的样本 x \boldsymbol x x ,该值为常数

  • P ( x 1 , . . . , x n   ∣   y ) P(x_1,...,x_n \ | \ y) P(x1,...,xn  y): 样本 x \boldsymbol x x 相对于类 y \boldsymbol y y 的条件概率

2.2 属性条件独立假设

对于给定的类别,假设所有特征相互独立,每个特征独立地对分类结果产生影响,则有:
P ( y ∣ x 1 , … , x n ) = P ( y ) ∏ i = 1 n P ( x i ∣ y ) P ( x 1 , … , x n ) P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)} {P(x_1, \dots, x_n)} P(yx1,,xn)=P(x1,,xn)P(y)i=1nP(xiy)

  • P ( x i   ∣   y ) P(x_i \ | \ y) P(xi  y): 样本 x \boldsymbol x x 的第 $ i $ 个特征相对于类 y y y 的条件概率

由于 P ( x 1 , . . . , x n ) P(x_1,...,x_n) P(x1,...,xn)为常数,故:
P ( y ∣ x 1 , … , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) P(yx1,,xn)P(y)i=1nP(xiy)
预测的依据:使得概率 P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y) \prod_{i=1}^{n} P(x_i \mid y) P(y)i=1nP(xiy)最大的对应类别标签 y y y,就是最终的预测结果:

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(x_i \mid y) y^=argymaxP(y)i=1nP(xiy)

P ( x i   ∣   y ) P(x_i \ | \ y) P(xi  y)对于不同朴素贝叶斯方法,计算的方法也不相同。下面会介绍到几种常用的朴素贝叶斯方法。

2.3 高斯朴素贝叶斯

2.3.1 计算方法

用于特征为连续值时的分类任务。对应 P ( x i   ∣   y ) P(x_i \ | \ y) P(xi  y) 的计算方法如下:
P ( x i ∣ y ) = 1 2 π σ y 2 exp ⁡ ( − ( x i − μ y ) 2 2 σ y 2 ) P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}\right) P(xiy)=2πσy2 1exp(2σy2(xiμy)2)

  • μ y \mu_y μy:类别 y y y 的所有样本中第 i 个特征的所有特征值的均值
  • σ y 2 \sigma_y^2 σy2:类别 y y y 的所有样本中第 i 个特征的所有特征值的方差

下面以鸢尾花数据集为例,介绍一下总体的计算细节。

以原始数据集中的 Species=iris-setosa (下面的公式中简写为setosa)的样本为训练集,示例如下:

在这里插入图片描述

接下来要对一个新样本 x = [ 4.8 , 3.8 , 1.6 , 0.3 ] \boldsymbol x = [4.8, 3.8, 1.6, 0.3] x=[4.8,3.8,1.6,0.3] 进行预测。

SpealLengthCm 特征(简写为 x 0 x_0 x0)为例:

  1. 求指定类中特征的均值和方差
    μ ( x 0 ) ≈ 4.860 \mu(x_0)≈4.860 μ(x0)4.860

    σ 2 ( x 0 ) ≈ 0.034 \sigma^2(x_0)≈0.034 σ2(x0)0.034

  2. 将求出的均值和方差代入高斯概率密度函数
    P ( x 0 ∣ y = s e t o s a ) = 1 2 π × 0.034 exp ⁡ ( − ( x 0 − 4.860 ) 2 2 × 0.034 ) P(x_0 \mid y=setosa) = \frac{1}{\sqrt{2\pi×0.034}} \exp\left(-\frac{(x_0 - 4.860)^2}{2×0.034}\right) P(x0y=setosa)=2π×0.034 1exp(2×0.034(x04.860)2)

  3. 将样本 x 的第一个特征的值代入上述公式:
    P ( x 0 = 4.8 ∣ y = s e t o s a ) = 1 2 π × 0.034 exp ⁡ ( − ( 4.800 − 4.860 ) 2 2 × 0.034 ) P(x_0=4.8 \mid y=setosa) = \frac{1}{\sqrt{2\pi×0.034}} \exp\left(-\frac{(4.800 - 4.860)^2}{2×0.034}\right) P(x0=4.8y=setosa)=2π×0.034 1exp(2×0.034(4.8004.860)2)

  4. 其他特征的求法类推

  5. 利用公式:
    P ( y = s e t o s a ∣ x 1 , … , x n ) ∝ P ( y = s e t o s a ) ∏ i = 1 n P ( x i ∣ y ) P(y=setosa \mid x_1, \dots, x_n) \propto P(y=setosa) \prod_{i=1}^{n} P(x_i \mid y) P(y=setosax1,,xn)P(y=setosa)i=1nP(xiy)
    即可求出样本 x \boldsymbol x x 属于 iris-setosa 类的概率

注意:PetalLengthCm 特征中所有的值均为0.2, 故方差为0,若使用高斯概率密度函数会出现运算错误

2.3.2 API调用
class sklearn.naive_bayes.GaussianNB(*, priors=None, var_smoothing=1e-09)

priors: array-like of shape (n_classes,)

类的先前概率。

var_smoothing: float, default=1e-9

在计算稳定性的方差中添加的所有函数最大方差的一部分。

下面给出调用的示例。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)

2.4 Multinomial Naive Bayes

2.4.1 计算方法

对应 P ( x i   ∣   y ) P(x_i \ | \ y ) P(xi  y) 的计算方法如下:
P ( x i = t ∣ y = c   ;   α ) = N t i c + α N c + α n i , P(x_i = t \mid y = c \: ;\, \alpha) = \frac{ N_{tic} + \alpha}{N_{c} + \alpha n_i}, P(xi=ty=c;α)=Nc+αniNtic+α,

  • N t i c N_{tic} Ntic: 类别为 c c c的样本中第 i 个特征的值为 t 的个数
  • N c N_c Nc : 类别为$ c $的样本的总个数
  • α \alpha α : 拉普拉斯平滑系数,一般设置为1,防止概率为 0 的情况出现
  • n i n_i ni : 第 i i i 个特征中可能出现的值的数量

所有 P ( x i   ∣   y ) P(x_i \ | \ y ) P(xi  y)求出来之后进行连乘,再与类 y 的先验概率相乘,就得到了样本 x 属于类别 y 的概率:
P ( y ∣ x 1 , … , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) P(yx1,,xn)P(y)i=1nP(xiy)
以西瓜书中的西瓜数据集为例,训练集如下:

在这里插入图片描述

对下面样本 新瓜 进行预测:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hiPZlaTc-1633781277989)(pics/3.png)]

  1. 先求所有类别的先验概率:

在这里插入图片描述

  1. 再求各个 P ( x i   ∣   y ) P(x_i \ | \ y) P(xi  y),即预测样本的各个特征在类 y y y 中出现的概率

在这里插入图片描述

  1. 求该瓜属于分别属于好瓜(是)和好瓜(否)的概率
    P ( 好 瓜 = 是 ∣ 新 瓜 ) = 0.471 × 0.375 × 0.375 × 0.750 × 0.875 × 0.750 × 0.750 ≈ 0.024 P(好瓜=是| 新瓜)=0.471×0.375×0.375×0.750×0.875×0.750×0.750 ≈0.024 P(=)=0.471×0.375×0.375×0.750×0.875×0.750×0.7500.024

    P ( 好 瓜 = 否 ∣ 新 瓜 ) = 0.529 × 0.333 × 0.333 × 0.444 × 0.222 × 0.222 × 0.667 ≈ 0.00086 P(好瓜=否| 新瓜)=0.529×0.333×0.333×0.444×0.222×0.222×0.667 ≈0.00086 P(=)=0.529×0.333×0.333×0.444×0.222×0.222×0.6670.00086

  2. 做出预测

    由于 0.024 > 0.00086 0.024 > 0.00086 0.024>0.00086,故该新瓜预测为“好瓜”。

2.4.2 文本分类情景下的计算方法

在文本分类情境下,MNB的条件概率计算公式如下:
P ( x i ∣ y ) = N y i + α N y + α n P(x_i \mid y) = \frac{ N_{yi} + \alpha}{N_y + \alpha n} P(xiy)=Ny+αnNyi+α

  • N y i N_{yi} Nyi: 对于一个要预测的新句子 x \boldsymbol x x,其第 i 个单词在类别为 y 的各个文档中出现的总次数
  • N y N_y Ny: 类别为 y \boldsymbol y y 的所有文本中的总词数
  • α \alpha α : 拉普拉斯平滑系数,默认设置为1
  • n n n:文本的词汇量(即无重复单词的个数)

这样就可以用如下公式求出某一段文本 x 属于给定类别 y 的概率:
P ( y ∣ x 1 , … , x n ) ∝ P ( y ) ∏ i = 1 n P ( x i ∣ y ) P(y \mid x_1, \dots, x_n) \propto P(y) \prod_{i=1}^{n} P(x_i \mid y) P(yx1,,xn)P(y)i=1nP(xiy)
下面计算细节示例如下。

假设有如下训练文本
在这里插入图片描述

给定一个新文本样本: China, China, China, Tokyo, Japan,对其进行分类。

  1. 将新样本转化为文本向量:
    d = ( C h i n a , C h i n a , C h i n a , T o k y o , J a p a n ) d=(China, China, China, Tokyo, Japan) d=(China,China,China,Tokyo,Japan)

  2. 确定类别的集合:
    Y = { y e s , n o } Y=\{yes, no\} Y={yes,no}

  3. 分析单词的分布情况:

    • 类 yes:共8个单词,

    • 类 no :共3个单词

    • 训练样本单词总数:11

      故类先验概率为:

    P ( y e s ) = 8 11 , P ( n o ) = 3 11 P(yes)=\frac{8}{11}, P(no)=\frac{3}{11} P(yes)=118,P(no)=113

    • 词汇量(不重复单词的个数):6
  4. 计算类条件概率:

P ( C h i n a ∣ y e s ) = 5 + 1 8 + 6 = 3 7 P(China | yes)= \frac{5+1}{8+6}= \frac{3}{7} P(Chinayes)=8+65+1=73

P ( J a p a n ∣ y e s ) = 0 + 1 8 + 6 = 1 14 P(Japan | yes)= \frac{0+1}{8+6}= \frac{1}{14} P(Japanyes)=8+60+1=141

P ( T o k y o ∣ y e s ) = 0 + 1 8 + 6 = 1 14 P(Tokyo | yes)= \frac{0+1}{8+6}= \frac{1}{14} P(Tokyoyes)=8+60+1=141

P ( C h i n a ∣ n o ) = 1 + 1 3 + 6 = 2 9 P(China | no)= \frac{1+1}{3+6}= \frac{2}{9} P(Chinano)=3+61+1=92

P ( J a p a n ∣ n o ) = 1 + 1 3 + 6 = 2 9 P(Japan | no)= \frac{1+1}{3+6}= \frac{2}{9} P(Japanno)=3+61+1=92

P ( T o k y o ∣ n o ) = 1 + 1 3 + 6 = 2 9 P(Tokyo | no)= \frac{1+1}{3+6}= \frac{2}{9} P(Tokyono)=3+61+1=92

  1. 计算后验概率:
    P ( y e s ∣ d ) = 8 11 × 3 7 × 3 7 × 3 7 × 1 14 × 1 14 ≈ 0.000292 P(yes | d)=\frac{8}{11}×\frac{3}{7}×\frac{3}{7}×\frac{3}{7}×\frac{1}{14}×\frac{1}{14}≈0.000292 P(yesd)=118×73×73×73×141×1410.000292

    P ( n o ∣ d ) = 3 11 × 2 9 × 2 9 × 2 9 × 2 9 × 2 9 ≈ 0.000148 P(no | d)=\frac{3}{11}×\frac{2}{9}×\frac{2}{9}×\frac{2}{9}×\frac{2}{9}×\frac{2}{9}≈0.000148 P(nod)=113×92×92×92×92×920.000148

  2. 做出预测

    由于0.000292 > 0.000148,故该文本归类为yes,即China。

2.4.3 API调用
class sklearn.naive_bayes.MultinomialNB(*, alpha=1.0,fit_prior=True,class_prior=None)

alpha: float, default=1.0

Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing).

fit_prior: bool, default=True

Whether to learn class prior probabilities or not. If false, a uniform prior will be used.

class_prior: array-like of shape (n_classes,), default=None

Prior probabilities of the classes. If specified the priors are not adjusted according to the data.

2.5 Bernoulli Naive Bayes

每个特征均用布尔值表示。在文本分类情景下,1表示当前词有在文档中出现过,0表示没有出现过。

当出现非0和1的其他值时,根据设定的阈值将样本特征二值化。

2.5.1 计算方法

P ( x i ∣ y ) = P ( i ∣ y ) x i + ( 1 − P ( i ∣ y ) ) ( 1 − x i ) P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i) P(xiy)=P(iy)xi+(1P(iy))(1xi)

其中:
P ( i ∣ y ) = N y i + α N y + α n P(i \mid y) = \frac{ N_{yi} + \alpha}{N_y + \alpha n} P(iy)=Ny+αnNyi+α

  • x i x_i xi:特征值,非1即0,表示所对应单词是否在文本中出现过

  • N y i N_{yi} Nyi: 类 y y y下包含第 i 个单词的文件数

  • N y N_y Ny类别为 y y y 的文本的总数

  • α \alpha α : 拉普拉斯平滑系数,默认设置为1

  • n n n:总的文本类别数

训练文本:

在这里插入图片描述

给定一段新文本:China, Japan, Tokyo, Beijing, Shanghai, Macao,对其进行分类。

  1. 将新样本转化为文本向量:
    d = ( C h i n a , J a p a n , B e i j i n g , S h a n g h a i , M a c a o , T o k y o ) d=(China, Japan, Beijing, Shanghai, Macao,Tokyo) d=(China,Japan,Beijing,Shanghai,Macao,Tokyo)

  2. 确定类别的集合:
    Y = { y e s , n o } Y=\{yes, no\} Y={yes,no}

  3. 分析文件的分布情况:

    • 类yes:共3个文件

    • 类no :共1个文件

    • 总文件数:4

      故类先验概率为:

    P ( y e s ) = 3 4 , P ( n o ) = 1 4 P(yes)=\frac{3}{4}, P(no)=\frac{1}{4} P(yes)=43,P(no)=41

    • 总的文本类别数(只有yes和no):2
  4. 计算类条件概率:

P ( C h i n a ∣ y e s ) = 3 + 1 3 + 2 = 4 5 P(China | yes)= \frac{3+1}{3+2}= \frac{4}{5} P(Chinayes)=3+23+1=54

P ( J a p a n ∣ y e s ) = 0 + 1 3 + 2 = 1 5 P(Japan | yes)= \frac{0+1}{3+2}= \frac{1}{5} P(Japanyes)=3+20+1=51

P ( B e i j i n g ∣ y e s ) = 1 + 1 3 + 2 = 2 5 P(Beijing | yes)= \frac{1+1}{3+2}= \frac{2}{5} P(Beijingyes)=3+21+1=52

P ( S h a n g h a i ∣ y e s ) = 1 + 1 3 + 2 = 2 5 P(Shanghai | yes)= \frac{1+1}{3+2}= \frac{2}{5} P(Shanghaiyes)=3+21+1=52

P ( M a c a o ∣ y e s ) = 1 + 1 3 + 2 = 2 5 P(Macao | yes)= \frac{1+1}{3+2}= \frac{2}{5} P(Macaoyes)=3+21+1=52

P ( T o y k o ∣ y e s ) = 0 + 1 3 + 2 = 1 5 P(Toyko | yes)= \frac{0+1}{3+2}= \frac{1}{5} P(Toykoyes)=3+20+1=51

P ( C h i n a ∣ n o ) = 1 + 1 1 + 2 = 2 3 P(China | no)= \frac{1+1}{1+2}= \frac{2}{3} P(Chinano)=1+21+1=32

P ( J a p a n ∣ n o ) = P ( T o k y o ∣ n o ) = 1 + 1 1 + 2 = 2 3 P(Japan | no)=P(Tokyo | no)= \frac{1+1}{1+2}= \frac{2}{3} P(Japanno)=P(Tokyono)=1+21+1=32

P ( B e i j i n g ∣ n o ) = P ( M a c a o ∣ n o ) = P ( S h a n g h a i ∣ n o ) = 0 + 1 1 + 2 = 1 3 P(Beijing| no)= P(Macao| no)= P(Shanghai | no)= \frac{0+1}{1+2}= \frac{1}{3} P(Beijingno)=P(Macaono)=P(Shanghaino)=1+20+1=31

  1. 计算后验概率:
    P ( y e s ∣ d ) = 3 4 × 4 5 × ( 1 − 1 5 ) × 2 5 × 2 5 × 2 5 × ( 1 − 1 5 ) ≈ 0.025 P(yes | d)=\frac{3}{4}×\frac{4}{5}×(1-\frac{1}{5}) ×\frac{2}{5}×\frac{2}{5}×\frac{2}{5}×(1-\frac{1}{5})≈0.025 P(yesd)=43×54×(151)×52×52×52×(151)0.025

    P ( n o ∣ d ) = 1 4 × 2 3 × 2 3 × 2 3 × ( 1 − 1 3 ) × ( 1 − 1 3 ) × ( 1 − 1 3 ) ≈ 0.022 P(no | d)=\frac{1}{4}×\frac{2}{3}×\frac{2}{3}×\frac{2}{3}×(1-\frac{1}{3}) ×(1-\frac{1}{3})×(1-\frac{1}{3})≈0.022 P(nod)=41×32×32×32×(131)×(131)×(131)0.022

  2. 做出预测

    由于0.025> 0.022,故该文本归类为yes,即是China。

2.5.2 API调用
class sklearn.naive_bayes.BernoulliNB(*, alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)

alpha: float, default=1.0

拉普拉斯平滑参数(0表示无平滑)

binarize: float 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.

fit_prior: bool, default=True

Whether to learn class prior probabilities or not. If false, a uniform prior will be used.

class_prior: array-like of shape (n_classes,), default=None

Prior probabilities of the classes. If specified the priors are not adjusted according to the data.

3 注意事项

  1. 当某个特征出现缺失值的时候,朴素贝叶斯选择直接忽略,不让其参与计算,进而最大程度避免了缺失值的影响

  2. 使用 log 函数对概率值进行处理可防止下溢

  3. 当训练集有更新时,朴素贝叶斯可以快速对更新后的数据集进行拟合

  4. 当数据样本中出现高度相关的特征时,朴素贝叶斯效果会大打折扣,因为相关特征的概率会乘上多次,导致预测概率值出现偏差

  5. 由于朴素贝叶斯假设所有特征相互独立,故可以对不同特征的概率实现并行计算,进一步加快计算速度

  6. 当训练样本数不够多时,使用朴素贝叶斯进行训练可以减小过拟合的风险

  7. 具有阶级局限性,对于大型数据集效果不好

  8. GNB中应注意对方差为 0 的特征要单独讨论;MNB、BNB中应加入拉普拉斯平滑系数防止概率为0的情况发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Juicy B

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

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

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

打赏作者

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

抵扣说明:

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

余额充值