朴素贝叶斯

在机器学习中,朴素贝叶斯是一个分类模型,输出的预测值是离散值。在讲该模型之前首先有必要先了解贝叶斯定理,以该定理为基础的统计学派在统计学领域占据重要的地位,它是从观察者的角度出发,观察者所掌握的信息量左右了观察者对事件的认知。

概率基础知识

条件概率:是指事件A在另外一个事件B已经发生条件下的发生概率。 条件概率表示为: P(A|B), 读作“在B条件下A的概率”。

若只有两个事件A, B, 那么:
$$
P(AB) = P(A|B)P(B) = P(B|A)P(A)\
P(A|B)=\frac{P(AB)}{P(B)}\
$$
那么:
$$
P(A|B)=\frac{P(B|A)*P(A)}{P(B)}
$$

全概率公式:** 表示若事件A1,A2,…,An构成一个完备事件组且都有正概率,则对任意一个事件B都有公式成立。

mark

贝叶斯公式

贝叶斯公式是将全概率公式带入到条件概率公式当中:
$$
P(A|B)=\frac{P(B|A)P(A)}{P(B)}=\frac{P(B|A)P(A)}{\sum{P(B|A)*P(A)}}
$$
其中,$P(B|A)$是事件 B 在另一个事件 A已经发生条件下的概率,$\sum_A{P(B|A)P(A)}$表示A所有可能情况下的概率,现在要来求事件A在事件B发生情况下的条件概率$P(A|B)$,又称后验概率。

mark

将贝叶斯公式中的变量换成分类任务的表达式可变成:

mark

例1

工厂生产产品,合格产品的概率是0.9,误检的概率是0.2,误检情况中合格产品的概率是0.1,那合格产品被误检的概率是多少?

直接套用贝叶斯公式,可得:
$$
P(误检|合格)=\frac{P(合格|误检)P(误检)}{P(合格)}=\frac{0.1*0.2}{0.9}=\frac{1}{45}
$$

例2

假设有个严重的疾病,发生的概率是万分之一,现在某人神经大条,怀疑得了该病,跑到医院检查,结果确有此病,不过医院的测试报告只有99%准确度(另外,也指正常人检测99%没问题,1%检测错误)。那么,他的死亡风险有多大?

用D表示该病(D=1,得病;D=0,健康),P表示报告准确度(T=1,准确;T=0,错误),可得:
$$
P(D=1|T=1)=\frac{P(T=1|D=1)P(D=1)}{P(T=1|D=1)P(D=1)+P(T=1|D=0)P(D=0)}=\frac{0.990.0001}{0.990.0001+0.01*0.9999}=0.0098
$$

朴素贝叶斯(Naive Bayesian)

那什么是朴素贝叶斯呢,朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。 给定一个类别 y 和一个从 x_1x_n 的相关的特征向量, 贝叶斯定理阐述了以下关系:

mark

使用简单(naive)的假设-每对特征之间都相互独立:

mark

对于所有的 :i 都成立,这个关系式可以简化为

mark

由于在给定的输入中 P(x_1, \dots, x_n) 是一个常量,我们使用下面的分类规则:

mark

我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计 P(y)P(x_i \mid y) ; 前者是训练集中类别 y 的相对频率。

各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 P(x_i \mid y) 分布时的所做的假设不同。

尽管其假设过于简单,在很多实际情况下,朴素贝叶斯工作得很好,特别是文档分类和垃圾邮件过滤。这些工作都要求 一个小的训练集来估计必需参数。

Scikit-learn库

Scikit-learn是一个非常有强大的基于 Python 语言的机器学习工具,简称Sklearn。

中文文档:https://sklearn.apachecn.org/

英文文档:https://scikit-learn.org/stable/modules/naive_bayes.html

mark

sklearn中有3种不同类型的朴素贝叶斯:

高斯分布型:用于classification问题,假定属性/特征服从正态分布的。
多项式型:用于离散值模型里。比如文本分类问题里面我们提到过,我们不光看词语是否在文本中出现,也得看出现次数。如果总词数为n,出现词数为m的话,有点像掷骰子n次出现m次这个词的场景。
伯努利型:最后得到的特征只有0(没出现)和1(出现过)。

详细的朴素贝叶斯的实操教程可以看udacity的ud120,非常好的教程,非常适合初学者

https://classroom.udacity.com/courses/ud120/lessons/2410328539/concepts/24185385370923

高斯朴素贝叶斯

GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布:

mark

参数 \sigma_y\mu_y 使用最大似然法估计。

1
2
3
4
5
6
7
8
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> from sklearn.naive_bayes import GaussianNB
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
>>> print("Number of mislabeled points out of a total %d points : %d"
... % (iris.data.shape[0],(iris.target != y_pred).sum()))
Number of mislabeled points out of a total 150 points : 6

多项分布朴素贝叶斯

MultinomialNB 实现了服从多项分布数据的朴素贝叶斯算法,也是用于文本分类(这个领域中数据往往以词向量表示,尽管在实践中 tf-idf 向量在预测时表现良好)的两大经典朴素贝叶斯算法之一。 分布参数由每类 y\theta_y = (\theta_{y1},\ldots,\theta_{yn}) 向量决定, 式中 n 是特征的数量(对于文本分类,是词汇量的大小) \theta_{yi} 是样本中属于类 y 中特征 i 概率 P(x_i \mid y)

参数 \theta_y 使用平滑过的最大似然估计法来估计,即相对频率计数:

\hat{\theta}_{yi} = \frac{ N_{yi} + \alpha}{N_y + \alpha n}

式中N_{yi} = \sum_{x \in T} x_i是 训练集T中特征i在类y中出现的次数,N_{y} = \sum_{i=1}^{|T|} N_{yi} 是类 y 中出现所有特征的计数总和。

先验平滑因子 \alpha \ge 0 为在学习样本中没有出现的特征而设计,以防在将来的计算中出现0概率输出。 把 \alpha = 1 被称为拉普拉斯平滑(Lapalce smoothing),而 \alpha < 1 被称为Lidstone平滑方法(Lidstone smoothing)。

补充朴素贝叶斯

ComplementNB实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,特别适用于不平衡数据集。具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常比MNB表现得更好(通常有相当大的优势)。计算权重的步骤如下:

\begin{align}\begin{aligned}\hat{\theta}_{ci} = \frac{\alpha_i + \sum_{j:y_j \neq c} d_{ij}}{\alpha + \sum_{j:y_j \neq c} \sum_{k} d_{kj}}\\w_{ci} = \log \hat{\theta}_{ci}\\w_{ci} = \frac{w_{ci}}{\sum_{j} |w_{cj}|}\end{aligned}\end{align}

其中对不在类c中的所有记录j求和,dij可以是文档j中词语i的计数或tf-idf值,αi是就像MNB中一样的平滑超参数,同时\alpha = \sum_{i} \alpha_i。第二个归一化解决了长记录主导MNB参数估计的问题。分类规则为:

\hat{c} = \arg\min_c \sum_{i} t_i w_{ci}

即将记录分配给补充匹配度最低的类。

伯努利朴素贝叶斯

BernoulliNB 实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。 因此,这类算法要求样本以二元值特征向量表示;如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。

伯努利朴素贝叶斯的决策规则基于:

P(x_i \mid y) = P(i \mid y) x_i + (1 - P(i \mid y)) (1 - x_i)

与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 y 中没有出现作为预测因子的特征 i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。

在文本分类的示例中,统计词语是否出现的向量(word occurrence vectors)(而非统计词语出现次数的向量(word count vectors))可以用于训练和使用这个分类器。 BernoulliNB 可能在一些数据集上表现得更好,特别是那些更短的文档。 如果时间允许,建议对两个模型都进行评估。

优缺点

优点

  1. 对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已。
  2. 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  3. 支持增量式运算。即可以实时的对新增的样本进行训练。
  4. 朴素贝叶斯对结果解释容易理解。

缺点

  1. 由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。
  2. 理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
  3. 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。