朴素贝叶斯是一组功能强大的且易于训练的分类器,它使用贝叶斯定理来确定给定一组条件的结果的概率。形容词“朴素”用在这不是因为算法有限或者效率较低,而是因为我们要讨论的因果关系的一个基本假设。
贝叶斯定理
考虑两个概率事件A和B,使用乘积法则则可以将边缘概率P(A)和P(B)与条件概率P(A | B)和P(B | A)相关联:
{
P
(
A
B
)
=
P
(
A
∣
B
)
P
(
B
)
P
(
B
A
)
=
P
(
B
∣
A
)
P
(
A
)
\left\{ \begin{array}{ll} P(AB)=P(A\mid B)P(B)\\ P(BA)=P(B\mid A)P(A) \end{array} \right.
{P(AB)=P(A∣B)P(B)P(BA)=P(B∣A)P(A)
考虑到交集可交换,等式的左边是相等的,因而可以得到贝叶斯定理:
P
(
A
∣
B
)
=
P
(
A
B
)
P
(
B
)
=
P
(
B
A
)
P
(
B
)
=
P
(
B
∣
A
)
P
(
A
)
P
(
B
)
P(A\mid B)=\frac{P(AB)}{P(B)}=\frac{P(BA)}{P(B)}=\frac{P(B\mid A)P(A)}{P(B)}
P(A∣B)=P(B)P(AB)=P(B)P(BA)=P(B)P(B∣A)P(A)
朴素贝叶斯分类
朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别,这就是朴素贝叶斯的思想基础。
朴素贝叶斯分类的正式定义如下:
- 设 x = { a 1 , a 2 , . . . , a m } \ x=\left \{a_{1} ,a_{2},..., a_{m}\right \} x={a1,a2,...,am}为一个待分类项,而每个a为x的一个特征属性。
- 有类别集合 C = { y 1 , y 2 , . . . , y n } \ C=\left \{y_{1} ,y_{2},..., y_{n}\right \} C={y1,y2,...,yn}。
- 计算 P ( y 1 ∣ x ) , P ( y 2 ∣ x ) , . . . , P ( y n ∣ x ) \ P(y_{1}\mid x),P(y_{2}\mid x),...,P(y_{n}\mid x) P(y1∣x),P(y2∣x),...,P(yn∣x)。
- 如果 P ( y k ∣ x ) = m a x { P ( y 1 ∣ x ) , P ( y 2 ∣ x ) , . . . , P ( y n ∣ x ) } \ P(y_{k}\mid x)=max \left \{P(y_{1}\mid x),P(y_{2}\mid x),...,P(y_{n}\mid x)\right \} P(yk∣x)=max{P(y1∣x),P(y2∣x),...,P(yn∣x)},则 x ∈ y k \ x\in\mathbb y_{k} x∈yk。
那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:
- 找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
- 统计得到在各类别下各个特征属性的条件概率估计。即 P ( a 1 ∣ y 1 ) , P ( a 2 ∣ y 1 ) , . . . , P ( a m ∣ y 1 ) ; P ( a 1 ∣ y 2 ) , P ( a 2 ∣ y 2 ) , . . . , P ( a m ∣ y 2 ) ; . . . ; P ( a 1 ∣ y n ) , P ( a 2 ∣ y n ) , . . . , P ( a m ∣ y n ) \ P(a_{1}\mid y_{1}),P(a_{2}\mid y_{1}),...,P(a_{m}\mid y_{1});P(a_{1}\mid y_{2}),P(a_{2}\mid y_{2}),...,P(a_{m}\mid y_{2});...;P(a_{1}\mid y_{n}),P(a_{2}\mid y_{n}),...,P(a_{m}\mid y_{n}) P(a1∣y1),P(a2∣y1),...,P(am∣y1);P(a1∣y2),P(a2∣y2),...,P(am∣y2);...;P(a1∣yn),P(a2∣yn),...,P(am∣yn)。
- 如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导: P ( y i ∣ x ) = P ( x ∣ y i ) P ( y i ) P ( x ) P(y_{i}\mid x)=\frac{P(x\mid y_{i})P(y_{i})}{P(x)} P(yi∣x)=P(x)P(x∣yi)P(yi)因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有: P ( x ∣ y i ) = P ( a 1 ∣ y i ) P ( a 2 ∣ y i ) . . . P ( a m ∣ y i ) = P ( y i ) ∏ j = 1 m P ( a j ∣ y i ) P(x\mid y_{i})=P(a_{1}\mid y_{i})P(a_{2}\mid y_{i})...P(a_{m}\mid y_{i})=P(y_{i})\prod_{j=1}^{m}P(a_{j}\mid y_{i}) P(x∣yi)=P(a1∣yi)P(a2∣yi)...P(am∣yi)=P(yi)j=1∏mP(aj∣yi)
可以看到,整个朴素贝叶斯分类分为三个阶段:
- 准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
- 分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
- 应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
scikit-learn中的朴素贝叶斯
sckit-learn提供三个朴素贝叶斯的实现方法:伯努利朴素贝叶斯、多项式朴素贝叶斯和高斯朴素贝叶斯。它们之间的唯一区别在于所采用的概率分布。伯努利贝叶斯面向分布是二项的情况,当特征为存在或不存在时特别有用。多项式朴素贝叶斯假定变量具有特征向量,其中每个元素代表了它出现的次数(或通常是其频率),这种技术在自然语言处理中非常有效,或者用于样本从公共字典取出进行组合的情况。而高斯朴素贝叶斯考虑变量是连续分布的情况,使用与更通用的分类任务。
伯努利朴素贝叶斯
如果X是随机变量并服从伯努利分布,则只能假设两个值(为简单起见,我们称之为0和1),它们的概率是:
P
(
X
)
=
{
p
,
当
X
=
1
时
q
,
当
X
=
0
时
P(X)=\left\{ \begin{array}{ll} p,当X=1时\\ q,当X=0时 \end{array} \right.
P(X)={p,当X=1时q,当X=0时其中
q
=
1
−
p
且
0
<
p
<
1
\ q=1-p且0<p<1
q=1−p且0<p<1
sklearn.navie_bayes.BernouliNB(alpha=1.0,binarize=0.0,fit_prior=Ture,class_prior=None)
alpha:一个浮点数,指定alpha的值
binarize:一个浮点数或者None ,如果为浮点数则以该数值为界,特征值大于它的取1,小于的为0,如果为None,假定原始数据已经二值化
fit_prior:布尔值,如果为Ture,则不用去学习P(y=ck),以均匀分布替代,否则则去学P(y=ck)
class_prior:一个数组。它指定了每个分类的先验概率P(y=c1),P(y=c2)……,若指定了该参数,则每个分类的先验概率无需学习
多项式朴素贝叶斯
多项式分布用于表示特征向量的值,比如代表项或其相对频率出现的次数。
class sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None)
alpha:一个浮点数,指定alpha的值
fit_prior:布尔值,如果为Ture,则不用去学习P(y=ck),以均匀分布替代,否则则去学习P(y=ck)
class_prior:一个数组。它指定了每个分类的先验概率P(y=c1),P(y=c2)……,若指定了该参数,则每个分类的先验概率无需学习
高斯朴素贝叶斯
高斯朴素贝叶斯用于符合高斯分布的连续值:
P
(
x
)
=
1
2
π
σ
2
e
−
(
x
−
μ
)
2
2
σ
2
P(x)=\frac{1}{\sqrt{2\pi \sigma^{2}}}e^{-\frac{(x-\mu )^{2}}{2\sigma^{2}}}
P(x)=2πσ21e−2σ2(x−μ)2
sklearn.naive_bayes.GaussianNB
高斯贝叶斯分类器没有参数
朴素贝叶斯算法小结
朴素贝叶斯的主要优点有:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
朴素贝叶斯的主要缺点有:
- 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
- 需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
- 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
- 对输入数据的表达形式很敏感。