朴素贝叶斯属于生成方法
。朴素体现在样本独立同分布及特征属性条件独立。朴素贝叶斯很直观,计算量不大,在很多领域有广泛的应用
- 生成方法:直接找出特征输出
和特征
的联合分布
,然后根据条件概率公式
得出结果,eg:NB、GMM、马尔可夫随机场。
- 判别方法:直接学习出特征输出
和特征
之间的关系,要么是决策函数
,要么是条件分布
。eg:线性回归、NN、决策树、LR,CRF、SVM等;
事实上,概率模型的训练过程就是参数估计的过程,对于参数估计:
- 频率学派:认为参数虽然未知,但却是客观存在的固定值,因此可通过优化似然函数等准则来确定参数值,eg:Maximum Likelhood Estimation(MLE);
- 贝叶斯学派:认为参数是未观察到的随机变量,其本身也可有分布,因此,可假定参数服从一个先验分布,然后基于观测到的数据来计算参数的后验分布。
贝叶斯学派的思想可以概括为先验概率+数据=后验概率。
条件独立公式,如果X和Y相互独立:
条件概率公式:
和
,则
全概率公式:
从上面的公式很容易得出贝叶斯公式:
1. 朴素贝叶斯模型
假如我们的分类模型样本是:
即我们有个样本,每个样本有
个特征,特征输出有
个类别,定义为
。
从样本我们可以学习得到朴素贝叶斯的先验分布,接着学习到条件概率分布
,然后就可以用贝叶斯公式得到
和
的联合分布
了。联合分布
定义为:
从上面的式子可以看出
比较容易通过最大似然法求出,得到的
就是类别
在训练集里面出现的频率。但是
很难求出,这是一个超级复杂的有n个维度的条件分布。朴素贝叶斯模型在这里做了一个大胆的假设,即X的n个维度之间相互独立,这样就可以得出:
从上式可以看出,这个很难的条件分布大大的简化了,但是这也可能带来预测的不准确性。你会说如果我的特征之间非常不独立怎么办?如果真是非常不独立的话,那就尽量不要使用朴素贝叶斯模型了,考虑使用其他的分类方法比较好。但是一般情况下,样本的特征之间独立这个条件的确是弱成立的,尤其是数据量非常大的时候。虽然我们牺牲了准确性,但是得到的好处是模型的条件分布的计算大大简化了,这就是贝叶斯模型的选择。
对于测试样本,既然是贝叶斯模型,当然是后验概率最大化来判断分类了。我们只要计算出所有的K个条件概率𝑃(𝑌=𝐶𝑘|𝑋=𝑋(𝑡𝑒𝑠𝑡)),然后找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。
2. 朴素贝叶斯的推断过程
我们预测的类别是使
最大化的类别,数学表达式为:
由于对于所有的类别,上式的分母是一样的,因此,预测公式可以简化为:
接着我们利用朴素贝叶斯的独立性假设,就可以得到通常意义上的朴素贝叶斯推断公式:
3. 朴素贝叶斯的参数估计
在上一节中,我们知道只要求出和
,我们通过比较就可以得到朴素贝叶斯的推断结果。这一节我们就讨论怎么通过训练集计算这两个概率。
对于,比较简单,通过极大似然估计我们很容易得到
为样本类别
出现的频率,即样本类别
出现的次数𝑚𝑘除以样本总数m。
对于,这个取决于我们的先验条件:
- 如果
是离散的值,那么我们可以假设
符合多项式分布,这样得到
是在样本类别
中,特征
出现的频率。即:
,其中
为样本类别
总的特征计数,而
为类别为
的样本中,第
维特征
出现的计数。
某些时候,可能某些类别在样本中没有出现,这样可能导致为0,这样会影响后验的估计,为了解决这种情况,我们引入了拉普拉斯平滑,即此时有:
,其中
为一个大于0的常数,常常取为1。
为第
个特征的取值个数。
- 如果
是非常稀疏的离散值,即各个特征出现概率很低,这时我们可以假设
符合伯努利分布,即特征
出现记为1,不出现记为0。即只要
出现即可,我们不关注
的次数。这样得到
是在样本类别
中,
出现的频率。此时有:
,其中,
取值为0和1。
- 如果我们我们的
是连续值,我们通常取
的先验概率为正态分布,即在样本类别
中,
的值符合正态分布。这样
的概率分布是:
,
其中和
是正态分布的期望和方差,可以通过极大似然估计求得。
为在样本类别𝐶𝑘中,所有
的平均值。
为在样本类别
中,所有
的方差。对于一个连续的样本值,带入正态分布的公式,就可以求出概率分布了。
从上面的计算可以看出,NB没有复杂的求导和矩阵运算,因此效率很高。
总结:
朴素贝叶斯的主要优点有:
- 算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化即可!)
- 分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)
- 对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
朴素贝叶斯的主要缺点有:
- 假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
- 对输入数据的表达形式很敏感。
4. 朴素贝叶斯实战
sklearn
中有3种不同类型的朴素贝叶斯,对应上节提到的三种条件概率求法:
- 高斯分布型:用于classification问题,假定属性/特征服从正态分布的。
- 多项式型:用于离散值模型里。比如文本分类问题里面我们提到过,我们不光看词语是否在文本中出现,也得看出现次数。如果总词数为n,出现词数为m的话,有点像掷骰子n次出现m次这个词的场景。
- 伯努利型:最后得到的特征只有0(没出现)和1(出现过)。
我们使用 iris
数据集进行分类
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score
from sklearn import datasets
iris = datasets.load_iris()
gnb = GaussianNB()
scores = cross_val_score(gnb, iris.data, iris.target, cv=10)
print("Accuracy:%.3f"%scores.mean())
"""
Accuracy:0.953
"""