朴素贝叶斯分类器 (naive bayes classifier, NBC) 是一种常见且简单有效的贝叶斯分类算法。对已知类别,朴素贝叶斯分类器在估计类条件概率时假设特征之间条件独立。这样的假设,可以使得在有限的训练样本下,原本难以计算的联合概率 (P(X_1, X_2, cdots, X_n | Y)) 转化为每个类别条件概率的乘积。尤其是在特征很多时,就显得更加简便。
条件独立性
给定 X, Y 条件独立,则有:
有了条件独立假设,就不必计算 X 的每一个组合的类条件概率,只需对给定的 Y,计算每一个 X 的条件概率。
贝叶斯计算过程
假设某个体有 n 项特征,分别为 (X_1, X_2, cdots, X_n)。现有 m 个类别,分别为 (C_1, C_2, cdots, C_m)。
首先,朴素贝叶斯分类器计算每个类别的后验概率:
然后,比较独立特征的条件概率,将概率最大的那个类别,作为该样本的类别:(P(C_k | X_1 X_2cdots X_n))。
拉普拉斯修正 Laplacian correction
如果我们使用的实例数据量太小,缺少某类的样本,那么条件概率会为,从而导致该类别的后验概率直接为,则否定了其他特征对样本分类概率的估计,使得分类结果产生偏差。
为了解决零概率问题,我们使用拉普拉斯修正进行处理。当数据量很大时,每个分量的计数加1造成的估计概率变化可以忽略不计,这样就可以方便有效地保证每一类中每个特征发生的概率是非零的。实际使用中,拉普拉斯修正增加的数值可以设置为任何一个值,通常加 $ lambda(0<lambda<1)$ 来替代简单加1。同时如果对 N 个计数都加上 (lambda),这时分母也要加上 (N*lambda) 来保证所有类的概率加和为1。
数值型特征的处理
朴素贝叶斯算法需要计算概率,离散型变量采用概率来计算,连续型变量需要进行离散化处理才能进行计算。这样做的一个问题是,如果离散区间的数目太多,会因为每一个区间中记录太少而不能对特征条件概率做出可靠的估计。相反如果区间数目太少,有些区间就会含有来自不同类的记录,因此失去了正确的决策边界。
一种处理方法是根据历史数据求得分布的参数,然后利用密度函数求得样本在该特征的条件概率。高斯分布通常被用来表示连续特征的类条件概率分布。
例如,假设审稿变量服从高斯分布,计算公式如下:
而在第 (y_i) 类中的均值和标准差分别为 (eta_{y_i}) 和 (sigma_{y_i}),类条件概率为:
因此,只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。
算法的优缺点
优点:
(1)分类效果稳健,特别适合于大规模数据集。
(2)能够很方便地处理多分类任务。
(3)对缺失数据和噪声数据都不敏感。
缺点:
(1)特征之间相互独立的假设在实际应用中往往是不成立的,在特征个数比较多或者特征之间相关性较大时,分类效果一般。
(2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
(3)对输入数据的表达形式很敏感,应用在含有大量数值特征的数据集时并不理想。
Demo
使用 NBC 对乳腺癌数据集进行分类。
Jupyter Notebook 链接为:NBC-BC
【References】
[1] 裔隽,张怿檬,张目清等.Python机器学习实战[M].北京:科学技术文献出版社,2018