我们一再说机器学习模型脱胎于统计学的知识,朴素贝叶斯分类算法应该是其中统计学味道最浓的一款算法。
贝叶斯公式的基本思想
朴素贝叶斯指的就是在“朴素”假设条件下运用“贝叶斯公式”。
贝叶斯公式预测的核心思想就5个子——“看起来更像”。
在贝叶斯看来,世界不是静止和绝对的,而是动态和相对的,希望利用已知经验来进行判断。用“经验”进行“判断”,经验怎么来?有了经验怎么判断?一句话实际包含了两轮过程:
- 第一轮的分级:是已知类别而统计特征,即某一特征在该类中的出现概率,是把类别分解成特征概率的过程。
- 第二轮的还原:是已知特征而推测类别,这里将第一轮的结果用上,是把知道统计情况的特征还原成某一类的过程。
使用贝叶斯预测的例子
先验和后验是怎么用于预测的呢?这里我想展示一下我在中学时学会的看发型猜女同学的“技术”。假设我的班上一共有10位女同学,其中一位叫安吉利,中学时女生个子都差不多高,又穿着一样的校服,光看背影猜中谁是安吉利的概率是10%,基本靠蒙了,这就是先验概率,先记作#card=math&code=P%28%E5%AE%89%E5%90%89%E5%88%A9%29)。但是有一天我突然发现,安吉利同学特别喜欢扎马尾,不过扎马尾又不是什么独占的发明专利,而且这个年龄阶段的女孩子又都爱扎马尾,所以,不是所有扎马尾的女同学都叫安吉利。
怎么办呢?我又利用上课的时间统计了一下,班上女同学一共有三种发型,扎马尾的概率大概为30%,记作P(马尾)。而安吉利同学真的非常喜欢扎马尾,她扎马尾的概率高达70%,记作P(马尾|安吉利)。这里我们用上了前面介绍的条件概率,P(马尾安吉利)的意思是,在女同学是安吉利的前提条件下发型是马尾的概率,在贝叶斯公式中这又称为似然度( Likelihood)。有了这三个统计数据,我心里就有底了,往后见到扎马尾的女同学,有两成多的概率就是我们的安吉利。
其中的奥秘就是贝叶斯公式。也许你已经察觉,扎马尾的女同学中她是安吉利的概率也是一种条件概率,记作#card=math&code=P%28%E5%AE%89%E5%90%89%E5%88%A9%7C%E9%A9%AC%E5%B0%BE%29),这就是后验概率。根据贝叶斯公式,我们有:
%20%5Ccdot%20P(%E5%AE%89%E5%90%89%E5%88%A9%20%7C%20%E9%A9%AC%E5%B0%BE)%20%3D%20P(%E5%AE%89%E5%90%89%E5%88%A9)%20%5Ccdot%20P(%E9%A9%AC%E5%B0%BE%20%7C%20%E5%AE%89%E5%90%89%E5%88%A9)%0A#card=math&code=P%28%E9%A9%AC%E5%B0%BE%29%20%5Ccdot%20P%28%E5%AE%89%E5%90%89%E5%88%A9%20%7C%20%E9%A9%AC%E5%B0%BE%29%20%3D%20P%28%E5%AE%89%E5%90%89%E5%88%A9%29%20%5Ccdot%20P%28%E9%A9%AC%E5%B0%BE%20%7C%20%E5%AE%89%E5%90%89%E5%88%A9%29%0A)
代入以上数据,则可以算出:
%20%3D%2010%5C%25%20%5Ctimes%2070%5C%25%20%2F%2030%5C%25%20%3D%2023.3%5C%25%0A#card=math&code=P%28%E5%AE%89%E5%90%89%E5%88%A9%20%7C%20%E9%A9%AC%E5%B0%BE%29%20%3D%2010%5C%25%20%5Ctimes%2070%5C%25%20%2F%2030%5C%25%20%3D%2023.3%5C%25%0A)
前面我们说,用先验和后验进行选择判断要分成两个阶段,现在有了似然度就好解释了。先验概率是已经知道的,而我们通过经验或实验要了解的就是这个似然度,知道似然度再加上先验,我们就能知道后验概率了。
朴素贝叶斯分类的算法原理
对于分类问题,每一项样本的数据记录大概是以下这种形式:
我们实际要求解的就是类别 的后验概率:
%0A#card=math&code=P%28%E7%B1%BB%E5%88%AB%20C_1%7C%20%E7%89%B9%E5%BE%81X_1%EF%BC%8C%20%E7%89%B9%E5%BE%81X_2%EF%BC%8C%20%E7%89%B9%E5%BE%81X_3%EF%BC%8C%20…%29%0A)
这个式子的意思是,在特征X1、特征X2、特征X3等共同发生的条件下,类别C1发生的概率。我们已经知道,可以通过似然度来求得后验概率。某个特征的似然度表示如下:
%0A#card=math&code=P%28%E7%89%B9%E5%BE%81X%7C%20%E7%B1%BB%E5%88%AB%20C_1%EF%BC%8C%E7%89%B9%E5%BE%81X_2%EF%BC%8C%20%E7%89%B9%E5%BE%81X_3%EF%BC%8C%20…%29%0A)
数学解析
首先回顾一下贝叶斯公式:
%20%3D%20%5Cfrac%20%7B%20P(x)%20P(x%7Cy)%7D%7BP(x)%7D%0A#card=math&code=P%28%20y%20%7C%20x%20%29%20%3D%20%5Cfrac%20%7B%20P%28x%29%20P%28x%7Cy%29%7D%7BP%28x%29%7D%0A)
式子涉及两种形式,#card=math&code=P%28A%29)这种形式的意思为A出现的概率,而#card=math&code=P%28AB%29)这种形式称作条件概率,为在B出现的条件下A出现的概率。在贝叶斯公式中#card=math&code=P%28y%29)称为先验概率,#card=math&code=P%28x%29)称为后验概率,而#card=math&code=P%28xy%29)则称作似然度似然度也是朴素贝叶斯分类算法所需要“学习”的对象。
朴素贝叶斯做了一个“朴素”的假设,即特征与特征之间是相互独立、互不影响的。如此一来,某个特征的似然妒就可以简化为:
%20%3D%20P(xi%7Cy)%0A#card=math&code=P%28x_i%20%7C%20y%2C%20x_1%2C%20…%2C%20x%7Bi-1%7D%2C%20x_%7Bi%2B1%7D%2C%20…%2C%20x_n%29%20%3D%20P%28x_i%7Cy%29%0A)
可以看出,在“朴素”的假设条件下,要取得某个特征的似然度就简单了很多。当然,求后验概率也变得简单:
%20%5Cpropto%20P(y)%20%5Cprod%7Bi%3D1%7D%5En%20P(x_i%7Cy)%0A#card=math&code=P%28y%7Cx_1%2C%20…%2C%20x_n%29%20%5Cpropto%20P%28y%29%20%5Cprod%7Bi%3D1%7D%5En%20P%28x_i%7Cy%29%0A)
注意这里使用了“正比于”的符号。朴素贝叶斯算法利用后验概率进行预测,核心方法是通过似然度预测后验概率,而学习的过程就是不断提高似然度的过程。既然后验概率已经正比于似然度,那么提高似然度的同时,自然也就达到了提高后验概率的目的。这也是为了更方便实用而进行简化的例子。
朴素贝叶斯的优化方法
朴素贝叶斯的数学背景基本就这么多了你可能会疑惑:怎么没看见“老熟人” 假设函数和损失函数呢?这与朴素贝叶斯算法的学习过程有关。朴素贝叶斯算法与其说是学习什么,不如说是要查找一个统计结果,通过比较不同特征与类之间的似然关系最后把似然度最大的那个类作为预测结果,即:
%20%5Cprod%7Bi%3D1%7D%5En%20P(x_i%20%7C%20y)%7D%0A#card=math&code=%5Chat%7By%7D%20%3D%20arg%5Cspace%20max%7BP%28y%29%20%5Cprod%7Bi%3D1%7D%5En%20P%28x_i%20%7C%20y%29%7D%0A)
我们知道,这里的y代表的是类,每个类与特征的似然度,即#card=math&code=P%28x_ily%29)是不同的在这个表达式中,P(y)也即先验概率是一个固定的值,要使表达式总体结果最大,只能依靠#card=math&code=P%28x_i%7Cy%29)。不妨把统计数据看成是一张大表格,学习算法的工作就是从中找到#card=math&code=P%28x_i%7Cy%29)值最大的那一项。该的y是什么,最终的预测结果就输出什么。
可以看出,朴素贝叶斯算法其实是一次查表的过程,而不是过往的迭代逼近,因此也就不再需要驱动迭代逼近过程的假设函数和损失函数。
朴素贝叶斯分类算法的具体步骤
朴素贝叶斯分类算法是一种有监督的分类算法,输入同样为样本特征值向量,以及对应的类标签,输出则为具有分类功能的模型,能够根据输入的特征值预测分类结果。
根据朴素贝叶斯分类算法,具体需要三步:
- 统计样本数据。需要统计先验概率#card=math&code=P%28y%29)和似然度#card=math&code=P%28x%7Cy%29)
- 根据待预测样本所包含的特征,对不同类分别进行后验概率计算。譬如总的特征有A、B、C三项,但待测样本只包含A、C两项,那后验概率的计算方法就为P(A%7Cy_1)P(B%7Cy_1)#card=math&code=P%28y_1%29P%28A%7Cy_1%29P%28B%7Cy_1%29).
- 比较的后验概率,哪个的概率值最大就将其作为预测值输出。
在 Scikit-Learn-库中,基于贝叶斯这一大类的算法模型的相关类库都在 sklearn.naive_bayes包之中。根据似然度计算方法不同,朴素贝叶斯也分成几个具体的算法分支。
本章所介绍的朴素贝叶斯分类算法可以通过 MultinomialNB类调用使用,用法如下:
from sklearn.datasets import load_iris
# 从 Scikit-Learn-库导入朴素贝叶斯模型中的多项式朴素贝叶斯分类算法
from sklearn.naive_bayes import MultinomialNBultinomialNB
# 载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
# 训练模型
clf= MultinomialNB().fit(X, y)
# 使用模型进行分类预测
clf.predict(X)
输出结果如下: