vlambda博客
学习文章列表

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


朴素贝叶斯也是经典的监督学习算法之一,不过和之前的KNN与决策树这两个模型相比,该算法只能做分类。该模型的数学理论也是比较浅显的,只需要用到大学概率论的一点点知识即可。




  1. 朴素贝叶斯的探索

                                                                                     


此分类器的思想很简单,即通过已知类别的训练数据集, 先计算样本的先验概率,然后利用贝叶斯概率公式测算位置类别样本属于某个类别的后验概率 ,多个类别就计算多个后验概率,选择 最大的后验概率 所对应的类别作为样本的预测结果。


该算法也是有几个优点和缺点的。

优点:

(1) 算法简单高效
(2) 对异常值或缺失数据不太敏感


缺点:

(1) 这个算法十分依赖先验概率,所以分类结果存在一定的错误率
(2) 对输入的自变量x很有要求,要么全部为离散,连续,二元
(3) 模型的理想条件实际在现实中很难实现的


所以对于这个算法虽然有几个缺点,但是应用也是十分广泛的,不论是欺诈识别,垃圾邮箱识别,还有文本挖掘都有朴素贝叶斯算法的影子。


   1.1 朴素贝叶斯的数学理论推导   


1.1.1 条件概率


在讲解朴素贝叶斯的推导之前,我们不得不从最开始的条件概率公式开始讲解。所谓的 条件概率就是已知事件A的情况下事件B发生的概率 ,表达式如下:


其中,P(AB)代表的是在所有的情况当中,事件A和事件B同时发生的概率。整个公式看起来挺简单,我们来看一道题,在网易和小红书的笔试里出现过,甚至在日本的SPI(日本找工业,对于有些大企业也需要考试,这个考试就是SPI)里也出现过类似的题:


一对夫妇,有两个孩子,我们已知其中一个孩子是男孩,那么另一个是女孩的概率是          


很多人看到这道题,很自信的就写了一个1/2,认为第二个孩子是男是女,与这第一个孩子是男孩的概率无关对吧。但是其实这道题是我们在已知其中一个为儿子的前提下进行计算的,也就是,这是一道条件概率的题目。所以这道题的正确答案应该是2/3。

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


1.1.2 全概率公式


全概率公式可以理解为在各个条件下发生事件A的概率之和 ,具体的数学表达式可以用以下来表示:

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


根据上述的表达式也可以理解关于全概率公式的理论, 于任意的一个事件A来说,都可以表示成n个完备事件组与其乘积的和。


1.1.3 朴素贝叶斯模型的推导


在我们知道了上述两个知识点后,我们就可以开始学习朴素贝叶斯。 贝叶斯分类器的核心就是在已知条件X的情况下,计算样本属于某个类别的概率,即所谓的后验概率 ,公式如下:

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


在这个公式中,Ci表示因变量的某个类别,接着根据我们刚刚讨论的,将每个类别的可能性都算出来,然后 选取最大 ,即

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


求最大,我们来观测下这个表达式的每个部分,首先分母是一个常量,因为是在整个数据集中满足X条件的概率,与Ci是没有关系的。接着我们在着眼于分子,分子由两个部分组成,分别是P(Ci)和P(X|Ci)组成的, 其中P(Ci)一般来说是已知的,它以数据集中类别Ci的频率作为先验概率 ,可以表示为

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


这很好计算,所以最关键的一个点就是P(X|Ci)的计算,如果X包含p个自变量,则可以表示成P(x1,x2,x3...,xp|Ci),而这个条件联合概率还是很难算的,所以这里我们就有了一个关键步骤,也就是我们之前所提到,在现实中是很难完全理想化的,就是我们 假设自变量间是完全独立的,就是他们之间完全不存在相关性 ,所以上述的这个式子就可以这样改写

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


所以换句话说, 自变量之间的独立性越强,贝叶斯分类器的效果就越好 ,所以上述求最值的表达式,就可以这样改写,直接求这一部分最大的所对应的类别:

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


   1.2 多种贝叶斯模型   


在最开始的时候,我们提到了贝叶斯模型对于自变量是相当苛刻的,要么全部都是连续型的数值,要么全是离散值,要么全是二元数值。而对于每一种情况下的自变量,都有不同的贝叶斯分类器来进行分类。


1.2.1 连续型数据 ——高斯贝叶斯模型


对于自变量是连续型数值时,我们在计算P(X|Ci)时,会 假设自变量X服从高斯正态分布 ,所以自变量X的条件概率和最大值求解如下

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


在表达式中,Ci表示因变量中的某个类别,σji表示训练数据集中自变量xj属于Ci这个类别的标准差,xjk表示xj这个自变量的取值,μji表示训练数据集中自变量xj属于Ci这个类别的均值。我们可以用下列的表格进行一个简单的计算,现在有个用户26岁,薪水是13000元,存款余额有7000元,我们来预测其是否会购买这款产品:

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(1) 先计算因变量各类别频率(先验概率)


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(2) 算均值


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(3) 算标准差


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(4) 单变量条件概率


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(5) 计算后验概率


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


从中我们可以发现,当Buy=1的时候,后验概率较大,所以对于这个未知样本,我们可以推断出该用户会购买 (在计算后验概率时候忘记乘先验概率了,算了,不改了)


1.2.2 离散型数据 ——多项式贝叶斯分类器


当数据集中的自变量全为离散性数据时,就可以使用多项式贝叶斯分布,我们在计算P(X|Ci)时,会 假设自变量X的条件概率满足多项式分布 ,所以自变量X的条件概率和最大值求解如下

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


在上述的式子中,P(Ci)仍然代表着训练集样本中类别Ci所占的比例,可以用NCi/N来计算,N(xjk)代表的是当类别为Ci时,自变量Xj取值为xjk的个数,α代表平滑系数,是为了防止概率为0的情况,一旦为0,整个条件概率就为0了,这一类的后验概率就为0了,就变得毫无意义,其中当α为1的时候,就是拉普拉斯平滑。N(Ci)代表Ci这一个类在数据集中的样本个数,n代表因变量的类别个数。我么还是以下面这个表格为例,来预测在某次相亲中,女生是否愿意见某个男生,该男生是这样的条件{文凭:本科,收入:中等,身高:中等,外貌:中等}

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(1) 计算因变量各类别的频率(先验概率)


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(2) 单变量条件概率


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(3) 贝叶斯后验概率


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


从计算的结果可知,对于这些条件,其相见的后验概率要大于不相见,因此该女生会选择会该男生相见。


1.2.3 二元数据集 ——伯努利贝叶斯分类器


所谓的二元数据集就是指自变量X只有两种情况,要么为1要么为0,而这类数据集通常会出现在文本挖掘中,比如某个词出现了就为1,没出现就为0。而对于这种问题,我们通常会采用伯努利贝叶斯分类器,利用该分类器来计算条件概率的时候,会 假设自变量X的条件概率满足伯努利分布 ,故自变量X的条件概率和最大值求解如下:

Day11-朴素贝叶斯算法就用朴素一点的标题来命名


其中,xjk代表在类别Ci下,xj这一个自变量的取值为xjk,p表示类别为Ci的时候,自变量取1的概率,由于二元数据集也算是一种特殊的多项式数据集,所以p的计算我们仍然可以用上一步的公式来替代,剩下的n,α都与上面的情况一样,属于类别的个数,以及平滑系数。我们还是随机造一个简单的数据集来进行实践,同时根据某个用户的书评中出现了关键的三个词,"垃圾",“还行”,“牛逼”,(0, 1, 0, 1, 1),来预测该用户对此书是好评还是坏评。


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(1) 因变量各类别的频率


Day11-朴素贝叶斯算法就用朴素一点的标题来命名


(2) 单变量条件概率



(3) 贝叶斯后验概率



发现对于类别1所算出来的后验概率为0.01,小于类别0所算出来的后验概率,因此该用户应该对此书是一个差评。


   1.3 贝叶斯算法应用   


幸运的是,贝叶斯算法在python中的sklearn库里也是封装好了的,直接调用即可,所以我们就来看一看各种贝叶斯算法的参数。


1.3.1 高斯贝叶斯分类器

GaussianNB(priors=None)

priors:用于指定因变量的各类别先验概率,默认以数据集中的类别频率作为先验概率。


1.3.2 多项式贝叶斯分类器

MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

alpha:用于指定平滑系数,默认为1

fit_prior:bool类型,是否以数据集中各类别的比例作为P(Ci)的先验概率,默认为True

class_prior:用于人工制定各类别的先验概率P(Ci),如果指定该参数,则参数fit_prior不再有效


1.3.3 伯努利贝叶斯

BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)

alpha:用于指定平滑系数,默认为1

binarize:如果该参数为浮点型数值,则以该值为界限,当自变量的值大于该值,则为1,否则则为0;该参数默认为None,则默认训练数据集的自变量为0-1值

fit_prior:bool类型,是否以数据集中各类别的比例作为P(Ci)的先验概率,默认为True

class_prior:用于人工制定各类别的先验概率P(Ci),如果指定该参数,则参数fit_prior不再有效