贝叶斯分类算法是统计学是一种概率分类方法,朴素贝叶斯分类时贝叶斯分类中最简单的一种。利用贝叶斯公式根据某特征的先验概率计算出其后延概率,然后选择具有最大后延概率的类作为该特征所属的类。朴素贝叶斯,称之为“朴素”,是因为整个形式化过程只做了最原始、最简单的假设,具体假设如下:
特征之间相互独立每个特征同等重要
1. 概率相关
先验概率: 比如向女生表白成功的概率是20%,记为P(A)=20%
条件概率:在事件B发生的情况下,事件A发生的概率,用P(A|B)表示,具体计算公式如下。如帅的前提下,向女生表白成功的概率为50%,记为P(A|B)=50%。
同理可得:在事件A发生的情况下,事件B发生的概率,用P(B|A)表示,具体计算公式如下:
联合概率:事件A和B同时发生的概率 。比如,长得帅且向女生表白成功的概率为1%,记为P(A∩B)=1%
条件概率和联合概率之间的关系,可用下式表示:
所以就会有:
全概率: 如果事件A不是一个条件,而是一堆条件,这些条件互斥且能穷尽所有可能 。则对任意一个事件B则有
2. 贝叶斯准则
如果已知P(B|A_i),要求P(A_i|B),应用贝叶斯准则得到:
要求解
,只需要知道 和 。因为对于同一个数据集,P(B)是一个常量,可以不参与计算。
先验概率
的计算公式如下:
其中,
表示数据集D中 类样本组成的样本数,|D|表示数据集D的样本数。
如果B是多维属性,那么可以假设
对应的事件是彼此独立的,这些值连乘在一起得到,具体计算公式如下:
3. 使用条件概率来分类
如果给定某个由
属性表示的数据点,那么该数据点来自类别 的概率是多少?数据点来自类别 的概率有事多少?可以应用贝叶斯准则得到:
使用这些定义,可以定义贝叶斯分类准则:
如果 , 则属于类别 如果 , 则属于类别
使用贝叶斯准测,可以通过已知的三个概率值来计算未知的概率值。
4. 嫁还是不嫁?
通过嫁还是不嫁这个二分类问题,来更加了解朴素贝叶斯。假设由颜值,性格,是否上进这三个属性来决定最终嫁还是不嫁。如果现在有一个男生是:帅 & 性格不好 & 不上进,预测女生嫁还是不嫁该男生呢?
数据集如下:
由于朴素贝叶斯公式如下:
换种更清楚的表达如下:
在这个例子中,就是要求
和 这两个概率,选取概率大的来做决策。
通过朴素贝叶斯公式:
在这两个公式里,因为 P(帅,性格不好,不上进)都是一样的,所以,想要获取 P(嫁|帅,性格不好,不上进) 和 P(不嫁|帅,性格不好,不上进) 这两个概率中的最大值,就等价于求P(帅,性格不好,不上进|嫁)P(嫁)和P(帅,性格不好,不上进|不嫁)P(不嫁)中的最大值。只需计算出P(帅,性格不好,不上进|嫁)、P(帅,性格不好,不上进|不嫁)、P(嫁)、P(不嫁)这四个概率,即可求出P(嫁|帅,性格不好,不上进)和P(不嫁|帅,性格不好,不上进)这个两个概率中最大概率对应的类别。
由于
则有
由于
所以,根据朴素贝叶斯算法可以给这个女生答案,是不嫁
5. 朴素贝叶斯种类
在sklearn中,朴素贝叶斯种类有三种,分别是GaussianNB、MultinomialNB和BernoulliNB。
5.1 高斯朴素贝叶斯(GaussianNB)
GaussianNB是先验为高斯分布(正态分布)的朴素贝叶斯,假设每个标签的数据都服从高斯分布(正态分布)。正态分布的概率密度函数计算公式如下:
其中,
为Y的第k类类别。 和 为第k类样本在第i个属性上的取值的均值和方差。
sklearn中的GaussianNB实现
下面采用sklearn中的鸾尾花数据集,由于数据集都是连续属性,所以采用GaussianNB来进行实现,看下预测情况。
# 导入包
运行结果如下
测试集准确率为: 0.9736842105263158
可以看到,测试集准确率97%,准确率挺高。
5.2 多项式朴素贝叶斯(MultinomialNB)
多项式朴素贝叶斯是先验为多项式分布的朴素贝叶斯。 它假设特征是由一个简单多项式分布生成的。多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数的特征。该模型常用于文本分类,特征表示的是次数,例如某个词语的出现次数。
多项式分布
多项式分布来源于统计学中的多项式实验,这种实验可以解释为:实验包括n次重复试验,每次试验都有不同的可能结果。在任何给定的试验中,特定结果发生的概率是不变的。
多项式分布公式:
其中,
表示c类别下第i个属性上取值为 的条件概率。 是c类别下第i个属性上取值为 的样本数, 是c类的样本数。 表示第i个属性可能的取值数。λ被称为平滑系数,令λ>0来防止训练数据中出现过的一些词汇没有出现在测试集中导致的0概率。如果λ=1,则这个平滑叫做拉普拉斯平滑,λ<1,叫做利德斯通平滑。
sklearn中的MultinomialNB实现
多项式所涉及的特征往往是次数,频率,计数这样的概念,这些概念都是离散的正整数,因此,sklearn中的MultinomialNB不接受负值的输入。
MultinomialNB包含如下的参数和属性:
class
其中
alpha : 浮点数, 可不填 【默认为1.0】
平滑系数λ,如果为0,则表示完全没有平滑选项。需注意,平滑相当于人为给概率加上一些噪音,因此λ设置得越大,精确性会越低(虽然影响不是非常大)
fit_prior : 布尔值, 可不填【默认为True】
是否学习先验概率P(Y=c)。如果为False,则所有的样本类别输出都有相同的类别先验概率。即认为每个标签类出现的概率是1/总类别数
class_prior:形似数组的结构,结构为(n_classes,),可不填【默认为None】 表示类的先验概率P(Y=c)。如果没有给出具体的先验概率则自动根据数据来进行计算。
总结如下:
其中,k为总类别数,m为训练集样本总数量,
为输出为第k个类别的训练集样本数。
实例
建一个简单多项式朴素贝叶斯(让所有的参数保持默认)的例子。
# 导⼊入需要的模块和库
运行结果如下:
5.3 伯努利朴素贝叶斯(BernoulliNB)
BernoulliNB就是先验为伯努利分布的朴素贝叶斯。假设特征的先验概率为二元伯努利分布,在文本分类中 ,就是一个特征有没有在一个文档中出现。
伯努利分布公式如下:
此时,
只能取0和1。
由于
,所以上式可变为是c类别下第i个属性上取值为1的样本数, 是c类的样本数。2表示第i个属性可能的取值数,这里只有0和1两种取值,所以是2。
sklearn中的BernoulliNB实现
类BernoulliNB包含如下的参数和属性:
class
其中
binarize:将数据特征二值化的阈值,大于binarize的值处理为1 ,小于等于binarize的值处理为0;
其他参数说明见5.2中多项式的参数说明;
实例
先来建一个简单伯努利朴素贝叶斯的例子。
import
打印相关属性语句如下:
# class_log_prior_:类先验概率对数值
运行结果如下
小结
如果样本特征的分布大部分是连续值(如人的身高,体重等),建议使用GaussianNB会比较好; 如果样本特征的分布大部分是多元离散值(如在文档分类中特征是单词出现次数),建议使用MultinomialNB比较好; 如果样本特征是二元离散值(如在文档分类中特征是单词是否出现) ,建议使用BernoulliNB比较好。
朴素贝叶斯算法优缺点
优点: 在属性相关性较小时效果较好,可以处理多类别问题;算法逻辑简单,易于实现 ;
缺点: 在属性个数比较多或者属性之间相关性较大时,分类效果不好;