7.5 朴素贝叶斯分类算法
朴素贝叶斯算法是一种应用贝叶斯理论的学习算法。它基于这样一个假设:特征之间是相互独立的。举一个例子,我们希望知道一封邮件是否为垃圾邮件,该邮件包含词汇“售价”“电话”“促销”,那么现在的问题就是当邮件包含词汇“售价”“电话”“促销”时,该邮件是垃圾邮件的概率为多少。用数学公式表达,y=0表示邮件为垃圾邮件,y=1表示邮件为普通邮件,x1 表示邮件包含“售价”的事件,x2 表示邮件包含“电话”的事件,x3 表示邮件包含“促销”的事件,p(xi )表示事件xi 发生的概率,我们求的就是条件概率p(y=0|x1 ,x2 ,…xn )。这个任务实际上是求最大后验概率 (MAP),由我们生活的经验可知该邮件很有可能属于垃圾邮件,因为垃圾邮件一般包含这三个词汇,贝叶斯公式推导出的结果正符合这个规律。
给定一个分类标签y和自由特征变量x1 ,…,xn ,xi =1表示样本具有特征i,而xi =0表示样本不具有特征i。如果我们想知道具有特征1到n的向量是否属于分类标签yk ,贝叶斯公式如下:
再由特征相互独立的假设:
且由于P(x1 ,…,xn )已经给定,比较P(y1 |x1 ,…,xn )和P(y2 |x1 ,…,xn ),这与比较P(y1 )P(x1 ,…,xn |y1 )和P(y2 )P(x1 ,…,xn |y2 )等价。假设总共有m种标签,我们只需计算P(yk )P(x1 ,…,xn |yk ),k=1,2,…,m,取最大值作为预测的分类标签,即:
贝叶斯分类在处理文档分类和垃圾邮件过滤有较好的分类效果。训练模型后参数P(xi |yk ),i=1,2,…,n,k=1,2,…,m已知,进行预测只需要先统计测试样例是否具有特征x1 到xn ,再计算上面的最大似然函数即可。不同的贝叶斯分类器主要取决于条件概率P(xi |yk )的定义,如果仅采用数学上的原始定义,由于模型过于简单,在处理较复杂的分类问题时效果一般,所以在朴素贝叶斯的基础上有多种改进模型,下面介绍改进模型中常用的高斯模型和多项式模型。
1.高斯朴素贝叶斯
原始的朴素贝叶斯只能处理离散数据,当x1 ,…,xn 是连续变量时,我们可以使用高斯朴素贝叶斯 (Gaussian Naive Bayes)完成分类任务。当处理连续数据时,一种经典的假设是:与每个类相关的连续变量的分布是基于高斯分布的,故高斯朴素贝叶斯的公式如下:
其中μy , 分别表示全部属于类yk 的样本中变量xi 的均值和方差。
2.多项式朴素贝叶斯
多项式朴素贝叶斯 (Multinomial Naïve Bayes)经常被用于处理多分类问题,比起原始的朴素贝叶斯分类效果有较大的提升。其公式如下:
其中 表示在训练集T中类yk 具有特征i的样本的数量, 表示训练集T中类yk 的特征总数。平滑系数α>0防止零概率的出现,当α=1称为拉普拉斯平滑,而α<1称为Lidstone平滑。
3.Python实现
Scikit-learn模块中有Naive Bayes子模块,包含了本节涉及的所有贝叶斯算法。关键在于将分类器设置为朴素贝叶斯分类器,接着调用分类器训练和进行分类。其具体实现如代码清单7-6所示。
代码清单7-6 朴素贝叶斯实现
from sklearn import datasets iris = datasets.load_iris() # 读取 iris数据集 from sklearn.naive_bayes import GaussianNB # 使用高斯贝叶斯模型 clf = GaussianNB() # 设置分类器 clf.fit(iris.data,iris.target) # 训练分类器 y_pred = clf.predict(iris.data) # 预测 print("Number of mislabeled points out of a total %d points : %d" % (iris.data.shape[0],(iris.target != y_pred).sum()))
*代码详见:示例程序/code/7-5.py
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论