文章目录
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(y∣x1,…,xn)=P(x1,…,xn)P(y)P(x1,…,xn∣y)
-
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(y∣x1,…,xn)=P(x1,…,xn)P(y)∏i=1nP(xi∣y)
- 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(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)
预测的依据:使得概率
P
(
y
)
∏
i
=
1
n
P
(
x
i
∣
y
)
P(y) \prod_{i=1}^{n} P(x_i \mid y)
P(y)∏i=1nP(xi∣y)最大的对应类别标签
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=1∏nP(xi∣y)
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(xi∣y)=2πσy21exp(−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)为例:
-
求指定类中特征的均值和方差
μ ( 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
-
将求出的均值和方差代入高斯概率密度函数
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(x0∣y=setosa)=2π×0.0341exp(−2×0.034(x0−4.860)2) -
将样本 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.8∣y=setosa)=2π×0.0341exp(−2×0.034(4.800−4.860)2) -
其他特征的求法类推
-
利用公式:
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=setosa∣x1,…,xn)∝P(y=setosa)i=1∏nP(xi∣y)
即可求出样本 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=t∣y=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(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)
以西瓜书中的西瓜数据集为例,训练集如下:
对下面样本 新瓜 进行预测:
- 先求所有类别的先验概率:
- 再求各个 P ( x i ∣ y ) P(x_i \ | \ y) P(xi ∣ y),即预测样本的各个特征在类 y y y 中出现的概率
-
求该瓜属于分别属于好瓜(是)和好瓜(否)的概率
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.750≈0.024P ( 好 瓜 = 否 ∣ 新 瓜 ) = 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.667≈0.00086
-
做出预测
由于 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(xi∣y)=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(y∣x1,…,xn)∝P(y)i=1∏nP(xi∣y)
下面计算细节示例如下。
假设有如下训练文本
给定一个新文本样本: China, China, China, Tokyo, Japan,对其进行分类。
-
将新样本转化为文本向量:
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) -
确定类别的集合:
Y = { y e s , n o } Y=\{yes, no\} Y={yes,no} -
分析单词的分布情况:
-
类 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
-
-
计算类条件概率:
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(China∣yes)=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(Japan∣yes)=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(Tokyo∣yes)=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(China∣no)=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(Japan∣no)=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(Tokyo∣no)=3+61+1=92
-
计算后验概率:
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(yes∣d)=118×73×73×73×141×141≈0.000292P ( 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(no∣d)=113×92×92×92×92×92≈0.000148
-
做出预测
由于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(xi∣y)=P(i∣y)xi+(1−P(i∣y))(1−xi)
其中:
P
(
i
∣
y
)
=
N
y
i
+
α
N
y
+
α
n
P(i \mid y) = \frac{ N_{yi} + \alpha}{N_y + \alpha n}
P(i∣y)=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,对其进行分类。
-
将新样本转化为文本向量:
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) -
确定类别的集合:
Y = { y e s , n o } Y=\{yes, no\} Y={yes,no} -
分析文件的分布情况:
-
类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
-
-
计算类条件概率:
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(China∣yes)=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(Japan∣yes)=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(Beijing∣yes)=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(Shanghai∣yes)=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(Macao∣yes)=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(Toyko∣yes)=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(China∣no)=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(Japan∣no)=P(Tokyo∣no)=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(Beijing∣no)=P(Macao∣no)=P(Shanghai∣no)=1+20+1=31
-
计算后验概率:
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(yes∣d)=43×54×(1−51)×52×52×52×(1−51)≈0.025P ( 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(no∣d)=41×32×32×32×(1−31)×(1−31)×(1−31)≈0.022
-
做出预测
由于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 注意事项
-
当某个特征出现缺失值的时候,朴素贝叶斯选择直接忽略,不让其参与计算,进而最大程度避免了缺失值的影响
-
使用 log 函数对概率值进行处理可防止下溢
-
当训练集有更新时,朴素贝叶斯可以快速对更新后的数据集进行拟合
-
当数据样本中出现高度相关的特征时,朴素贝叶斯效果会大打折扣,因为相关特征的概率会乘上多次,导致预测概率值出现偏差
-
由于朴素贝叶斯假设所有特征相互独立,故可以对不同特征的概率实现并行计算,进一步加快计算速度
-
当训练样本数不够多时,使用朴素贝叶斯进行训练可以减小过拟合的风险
-
具有阶级局限性,对于大型数据集效果不好
-
GNB中应注意对方差为 0 的特征要单独讨论;MNB、BNB中应加入拉普拉斯平滑系数防止概率为0的情况发生