查看原文
其他

关于朴素贝叶斯的一些理解及python的简单实现

博观厚积 Python爱好者社区 2019-04-07

作者:博观厚积

简书专栏:https://www.jianshu.com/u/2f376f777ef1


1.朴素贝叶斯为什么是“朴素”的?


朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法,朴素贝叶斯之所以有朴素两个字,就是因为它把问题简化了,假设所有特征参数均相互独立。比如,如果水果呈红色,圆形,直径约3英寸,则可认为它是苹果。 即使这些特征依赖于彼此或者依赖于其他特征的存在,所有这些特征独立地贡献了这种水果是苹果的可能性,这就是为什么它被称为“朴素”的原因。朴素贝叶斯算法很容易构建且对大型数据库非常有用,多用于多元类别下的文本分类问题。


它也是基于贝叶斯定律的,如下图,一般的贝叶斯估计就是基于条件概率。


事件c发生的概率为P(c),即先验概率;事件x发生的概率为P(x);在事件c发生的条件下事件x发生的概率为P(x|c);在事件x发生的条件下事件c发生的概率为P(c|x),其中P(x|c)P(c)= P(cx),即事件c、x同时发生的概率。


那么根据贝叶斯定律:在事件x发生的条件下事件c发生的概率为P(c|x),即后验概率,等于在事件x发生的条件下事件c、x同时发生的概率。


而朴素贝叶斯算法则针对多元分类问题,假设在事件x1、x2…xn均发生条件下事件c的概率,这里假设x1、x2…xn相互独立,那么P(x|c)的概率就可以计算为:P(x|c)= P(x1|c) P(x2|c)* …P(x3|c)。


2.朴素贝叶斯的优缺点及应用场景


优点:(1)对数据的预测是简单、快捷和搞笑的,特别在多元分类任务;(2)当特征相互独立的假设成立,其预测能力好于逻辑回归等其他算法,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。(3)相比于输入变量为数值变量时,它在分类变量的情况下表现良好,若是数值变量,则需要假设其为正态分布。


缺点:(1)朴素贝叶斯算法的假设条件在实际中往往很难成立,在属性个数比较多或者属性之间相关性较大时,分类效果不好。(2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。(3)对输入数据的表达形式很敏感。


应用场景:


(1)实时预测:朴素贝叶斯算法简单便捷。 因此,它可以用于实时进行预测。
(2)多分类预测:适用于目标变量为多类别的任务,这里我们可以预测多类目标变量的概率。


(3)文本分类/垃圾邮件过滤/情感分析:主要用于文本分类的朴素贝叶斯分类器(由于多类问题和独立规则更好的结果)与其他算法相比具有更高的成功率。 因此,它被广泛用于垃圾邮件过滤(识别垃圾邮件)和情感分析(在社交媒体分析中,识别积极和消极的客户情绪)


(3)推荐系统:朴素贝叶斯分类器和协作过滤一起构建推荐系统,该系统使用机器学习和数据挖掘技术来过滤看不见的信息并预测用户是否会喜欢给定的资源,简单的例子就是淘宝上的商品推荐。


3.朴素贝叶斯的python简单实现


在python的scikit learn库中有朴素贝叶斯的程序包,它包括三种类型:


(1)高斯Gaussian:用于分类,它假定特征遵循正态分布。


(2)多项Multinomial:用于离散计数。例如,假设我们有文本分类问题。在这里,我们可以考虑更进一步的伯努利试验,而不是“在文档中出现的词”,而是“计算文档中出现词的频率”,您可以将其视为“在n次试验中观察结果数x_i出现的次数”。


(3)伯努利Bernoulli:如果你的特征向量是0-1分类,二项模型很有用。比如在文本分类,其中“1、0”分别是“词语出现在文档中”和“词语文档不出现在文档中”。


下面以高斯模型为例,其Python代码为:

#Import Library of Gaussian Naive Bayes modelfrom sklearn.naive_bayes import GaussianNBimport numpy as np#假设存在这样的二元特征变量x,对应属性Yx= np.array([[-3,7],[1,5], [1,2], [-2,0], [2,3], [-4,0], [-1,1], [1,1], [-2,2], [2,7], [-4,1], [-2,7]]) Y = np.array([3, 3, 4, 4, 4, 3, 3, 4, 3, 3, 3, 4]) id3 = np.where(Y==3) id4 = np.where(Y==4) fig, ax = plt.subplots(figsize=(8,5)) ax.scatter(x[id3,0], x[id3,1],s=50, c='b', marker='o', label='Y=3') ax.scatter(x[id4,0], x[id4,1], s=50, c='r', marker='x', label='Y=4') ax.legend() ax.set_xlabel('X[:,0]') ax.set_ylabel('X[:,1]') plt.show()


上图可以看到,我们构造的x二元特征变量,在不同Y类别下的散点图分布情况,基本可以看到Y=3与Y=4两类x有一定的线性可分性。


接下来就用高斯分布的朴素贝叶斯去训练该数据集,并对[1,2],[3,7]两个测试数据进行类别预测,结果与Logistic回归的预测结果进行比较。

#Create a Gaussian Classifiermodel = GaussianNB()# Train the model using the training sets model.fit(x, Y)#Predict Output predicted= model.predict([[1,2],[3,7]]) predicted# LogisticRegression Predict from sklearn.linear_model.logistic import LogisticRegression classifier=LogisticRegression() classifier.fit(x, Y) predictions=classifier.predict([[1,2],[3,7]]) predictions


输出结果,朴素贝叶斯结果为array([4, 3]),也就是特征变量[1,2],[3,7]对应Y取值分别为4,3;而Logistic回归的预测结果array([4, 4]),即两个特征变量的Y取值均为4.


由于数据来自我们构造的无法去判断测试集预测结果的准确性,但是我们可以将特征变量[1,2],[3,7]放到前边x的分类散点图坐标体系中,初步可以看到朴素贝叶斯的预测相对比较准确。

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门免费视频课程!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存