朴素贝叶斯算法是一种生成算法,主要用于分类,可以处理非线性的数据。它会计算样本属于每一个类的后验概率,然后判定样本属于后验概率最大的那一个类。朴素贝叶斯有两个假设条件:
- 条件独立假设:用于分类的特征在类确定的条件下都是条件独立的;
- 连续型特征服从正太分布假设:如果特征是连续型的变量,就假设该特征服从正太分布。
这些假设使朴素贝叶斯算法变得简单(这个我们可以在后面看到),但有时也会牺牲一定的分类准确率。
朴素贝叶斯算法是基于贝叶斯公式的,所以我们先简单讲一下贝叶斯公式。
贝叶斯公式(贝叶斯定理)
通常情况下,事件A在事件B的条件下发生的概率P(A|B)和事件B在事件A的条件下发生的概率P(B|A)是不一样的。但是两者之间存在一定的关系,而这个关系就是贝叶斯公式。个人认为也可以理解为下面的联合概率,让P(A|B)和P(B|A)之间存在一个关系:
根据上面的公式,只要知道其中三个参数的值,就可以求解剩下一个参数的值。
下面我们将贝叶斯公式运用到朴素贝叶斯算法里面。
我们先对后面要用到的表示做一下描述:用x的上标 i 表示第几个样本,x的下标 j (j=1,2,3,...,m)表示 样本的第几个特征,v 表示的是样本在某个特征下的具体取值;y 表示样本的标签, (i=1,2,3,...,k)表示样本具体是哪一类。
因为我们想要知道的是在已知样本特征向量x的情况下样本的类别c, 而这个就是后验概率P(c|x),根据上面的公式我们可以的到后验概率的计算公式。
所以对于每一个类别的后验概率为:
,i=1,2,3,...,k
因为朴素贝叶斯的第一个假设,条件概率就为样本的所有特征在某个类型下的连乘形式,这个就简化了求解条件概率的过程。
然后我们选取后验概率最大的类别作为预测样本的类别:
,i = 1,2,...,k
因为对于每一个类别P(x)都是一样的,可以省略掉。同时我们并不需要知道特别准确的概率值,因为我们比较的是大小。所以我们要求的是
,i=1,2,...,k
个人认为朴素贝叶斯算法没有训练过程,而是从训练数据中得到预测样本条件概率和先验概率,来计算后验概率。
对于不同类型的变量,有不同的方法计算条件概率
- 离散型变量
计算类的概率(先验概率):
计算样本单个特征在具体取值条件下的条件概率:
用上面的方法计算条件概率是有可能出现条件概率值为0的情况,因为样本在某一个特征下的取值在训练集中没有,此时,条件概率就等于0。这个显然是不合理的。因为训练集是采样的结果,并不是总体样本。这时可以采用拉普拉斯平滑,k为类别的种类。
- 连续型变量
连续型变量和离散型变量计算类的概率是一样的,不同的是条件概率分布。根据前面的假设,此时的连续型变量的条件概率服从一维的正态分布。
当预测一个样本的类别时,我们知道样本在各个特征上的具体取值,此时我们根据取值在训练集中计算出条件概率,再结合先验概率,我们就能算出每个类别后验概率,然后概率最大的就是样本的类别。
朴素贝叶斯算法整个的工作流程就是:
根据训练集,计算每个类别的先验概率,然后计算每个特征在每个具体取值下针对不同类别的条件概率。对于给定的一个实例x = {},也就是需要我们预测类别的样本。计算该实例在每一个类别下的后验概率,然后将实例x分为概率最大的那一类。
下面借鉴一下李航书上的一个例子,可以帮助大家理解
朴素贝叶斯算法的优点:
- 计算效率高。从推导过程我们就可以看见,没有复杂的求导和矩阵运算。
- 朴素贝叶斯能够给出每个类别具体的概率值,也方便我们直观的理解。
- 可以处理多分类问题
- 对异常值不敏感
朴素贝叶斯算法的缺点:
- 分类性能不一定很高;
- 条件假设独立会使朴素贝叶斯变得简单,但有时会牺牲一定的分类准确率
朴素贝叶斯算法适用的场景:不同维度之间相关性较小,需要模型容易解释的场景。
应用:文本分类,垃圾邮件分类
后面会举出一个关于朴素贝叶斯算法的具体应用。