Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)
Posted wangongxi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)相关的知识,希望对你有一定的参考价值。
朴素贝叶斯是机器学习中比较常用的一种模型,尤其在文本分类的问题上是比较常用的baseline。朴素贝叶斯本身训练速度快,具有可并行化程度高,可解释性好的优点,但由于其对特征之间的独立性假设不是很符合某些需求场景,因此在实际的使用过程中往往需要做一些特征组合的预处理工作来提升模型的效果。目前,很多的机器学习开源项目都支持了朴素贝叶斯,比如Python的Scikit-Learn和NLTK。Java项目中Weka、Smile、Apache Ignite中Machine Learning库还有就是这里介绍的Spark ML/MLlib库。下面先介绍下Naive Bayes模型及其变种的基本原理,然后结合例子来简单分下下源码实现。
0. 朴素贝叶斯基本原理
朴素贝叶斯是基于贝叶斯定理的一种生成式模型。贝叶斯公式如下:
f o r m u l a 1 : P ( Y ∣ X ) = P ( Y ) ∗ P ( X ∣ Y ) P ( X ) = P ( Y ) ∗ P ( X ∣ Y ) ∑ j = 1 M P ( Y j ) ∗ P ( X ∣ Y j ) formula1:P(Y|X)=\\frac{P(Y)*P(X|Y)}{P(X)}=\\frac{P(Y)*P(X|Y)}{\\sum_{j=1}^MP(Y_{j})*P(X|Y_{j})} formula1:P(Y∣X)=P(X)P(Y)∗P(X∣Y)=∑j=1MP(Yj)∗P(X∣Yj)P(Y)∗P(X∣Y)
X = ( x 1 , x 2 , . . . , x N ) X=(x_{1},x_{2},...,x_{N}) X=(x1,x2,...,xN)代表的是 N N N维的特征向量, Y = ( y 1 , y 2 , . . . , y M ) Y=(y_{1},y_{2},...,y_{M}) Y=(y1,y2,...,yM)代表的是 M M M维的标记空间,假设特征之间相互独立,那么就有如下关系:
f o r m u l a 2 : P ( X ∣ Y ) = P ( x 1 ∣ Y ) ∗ P ( x 2 ∣ Y ) ∗ . . . ∗ P ( x N ∣ Y ) = ∏ i = 1 N P ( x i ∣ Y ) formula2:P(X|Y)=P(x_{1}|Y)*P(x_{2}|Y)*...*P(x_{N}|Y)=\\prod_{i=1}^{N}P(x_{i}|Y) formula2:P(X∣Y)=P(x1∣Y)∗P(x2∣Y)∗...∗P(xN∣Y)=i=1∏NP(xi∣Y)
这个独立性假设也是该模型中朴素二字的由来。很多时候,这种假设是过于苛刻甚至是不符合实际情况的,但在实际应用的效果还是相当不错的,是一种能够快速落地的基准模型。
从
f
o
r
m
u
l
a
1
formula1
formula1中可以知道,在预测某个具体的实例时,我们关心的其实只是分子部分的结果,分母部分是一致的,无需比较。因此,对于朴素贝叶斯模型的时候,模型需要估计的参数其实只有
P
(
Y
)
P(Y)
P(Y)和
P
(
X
∣
Y
)
P(X|Y)
P(X∣Y)两个,通常我们可以用
π
\\pi
π和
θ
\\theta
θ来表示。参数
π
\\pi
π是一个向量,如:
π
i
=
P
(
Y
=
y
i
)
\\pi_{i}=P(Y=y_{i})
πi=P(Y=yi)表示每个类别的先验概率,参数
θ
\\theta
θ是一个矩阵,如:
θ
i
,
j
l
=
P
(
X
=
x
j
l
∣
Y
=
y
i
)
\\theta_{i,j_{l}}=P(X=x_{j_{l}}|Y=y_{i})
θi,jl=P(X=xjl∣Y=yi)。这里的
x
j
l
x_{j_{l}}
xjl代表的是某一个特征维度的具体取值,如西瓜书中,"色泽"特征的枚举值为{青绿,乌黑,浅白},所以
x
j
l
x_{j_{l}}
xjl就可以代表“色泽=青绿,色泽=乌黑,色泽=浅白”三种取值方法中的任意一种。在实际的工程实现中,往往将每个枚举值作为一个独立的特征对待,就像“色泽=青绿,色泽=乌黑,色泽=浅白”是作为三个独立的特征来处理的,因此
θ
i
,
j
l
\\theta_{i,jl}
θi,jl可以转化为为
θ
i
,
j
\\theta_{i,j}
θi,j。
基于极大似然的参数估计,可以知道
π
\\pi
π和
θ
\\theta
θ两个参数的计算方法为:
f
o
r
m
u
l
a
3
:
π
i
=
C
o
u
n
t
(
Y
=
y
i
)
D
,
s
.
t
.
∑
i
=
1
M
y
i
=
D
formula3: \\pi_{i}=\\frac{Count(Y=y_{i})}{D},s.t.\\sum_{i=1}^My_{i}=D
formula3:πi=DCount(Y=yi),s.t.i=1∑Myi=D
其中
D
D
D表示训练集的大小。
f
o
r
m
u
l
a
4
:
θ
i
,
j
=
C
o
u
n
t
(
Y
=
y
i
,
X
=
x
j
)
C
o
u
n
t
(
Y
=
y
i
)
formula4: \\theta_{i,j}=\\frac{Count(Y=y_{i},X=x_{j})}{Count(Y=y_{i})}
formula4:θi,j=Count(Y=yi)Count(Y=yi,X=xj)
朴素贝叶斯模型的训练过程也就是基于上述公式计算
π
\\pi
π和
θ
\\theta
θ的过程。在此基础上,我们可以计算待预测的实例相对于所有类别的后验概率,并选择最大后验概率的类别作为预测结果。假设待预测实例的特征向量为以上是关于Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)的主要内容,如果未能解决你的问题,请参考以下文章
Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)
Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)