第八十七篇 朴素贝叶斯
心得: 还是需要记录一下,自己的学习历程,平时学到的比较杂,在此能全面总结一下自己学到的,看到的,理解的东西。
一、公式原理
-
条件概率
条件概率是指事件A在事件B发生的条件下发生的概率。条件概率表示为:P(A|B),读作“A在B发生的条件下发生的概率”。若只有两个事件A,B,那么,
-
全概率公式(知因求果)
如图;从家到公司有三条路,选择第一条路的概率为P(L1),选择第一条路且不堵车的概率为P(C|L1)
假设遇到拥堵会迟到,那么从Home到Company不迟到的概率是多少?选择每条路都有可能,且不迟到的概率,所以要将所有可能的结果相加,得到最终不迟到的概率:
P(不迟到) = P(C|L2)+P(C|L2)+P(C|L3)
全概率公式:
设事件是一个完备事件组,则对于任意一个事件C,若有如下公式成立:
-
贝叶斯公式(知果求因)
贝叶斯要解决的问题是:到达公司且不迟到选择第一条路的概率是多少?
根据公式得出结果为:
从此处可以看得出来全概率公式和贝叶斯公式是想通的,全概率公式计算的结果就是把各个路径得到的概率求和;而贝叶斯公式啊计算的结果是:已知最终计算的结果,求某一条路径上的发生的概率是多少
B站中某一博主的截图,诠释的透彻,有兴趣可以去看看:
https://www.bilibili.com/video/BV1a4411B7B4/?spm_id_from=333.788.videocard.0
二、朴素贝叶斯分类器的公式
假设某个体有n项特征(Feature),分别为F1、F2、…、Fn。现有m个类别(Category),分别为C1、C2、…、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值:
P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C) / P(F1F2...Fn)
由于 P(F1F2…Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求
P(F1F2...Fn|C)P(C)
的最大值。
朴素贝叶斯分类器则是更进一步,假设所有特征都彼此独立,因此
P(F1F2...Fn|C)P(C) = P(F1|C)P(F2|C) ... P(Fn|C)P(C)
上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类。
虽然”所有特征彼此独立”这个假设,在现实中不太可能成立,但是它可以大大简化计算,而且有研究表明对分类结果的准确性影响不大
三、垃圾邮件是如何用贝叶斯方法过滤掉的
现在我们收到一封新邮件,我们假定它是正常邮件和垃圾邮件的概率各是50%。即:
P(正常)= P(垃圾)=50%
然后,对这封新邮件的内容进行解析,发现其中含有“发票”这个词,那么这封邮件属于垃圾邮件的概率提高到多少?其实就是计算一个条件概率,在有“发票”词语的条件下,邮件是垃圾邮件的概率:P(垃圾|发票)。直接计算肯定是无法计算了,这时要用到贝叶斯定理:
发票的概率为:
最终概率为:
这种过滤方法还具有自我学习能力,会根据新收到的邮件,不断调整发票这个词是垃圾邮件的概率和发票是正常邮件的概率。收到的垃圾邮件越多,它的准确率就越高。
四、sklearn中的朴素贝叶斯模型及其应用
- 使用朴素贝叶斯模型对iris数据集进行花分类
from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.naive_bayes import BernoulliNB #伯努利型
from sklearn.naive_bayes import GaussianNB #高斯分布型
from sklearn.naive_bayes import MultinomialNB #多项式型
gnb=GaussianNB() #构造
pred=gnb.fit(iris.data,iris.target) #拟合
y_pred=pred.predict(iris.data) #预测
print(iris.data.shape[0],(iris.target !=y_pred).sum()) #iris.target科学家给出的分类,y_pred建模型产生的预测,比较两个有什么不一样,
#然后将不同的值的个数求出来,150个结果中,有6个和科学家的值不同
- 使用sklearn.model_selection.cross_val_score(),对模型进行验证。
from sklearn.naive_bayes import GaussianNB #高斯分布型
from sklearn.model_selection import cross_val_score
gnb=GaussianNB()
scores=cross_val_score(gnb,iris.data,iris.target,cv=10) #将数据集分为10份,其中9份作为训练模型,1份用来做评估
#score是交叉验证的对象
#结果是返回准确率的概念,结果是33.3%
print("Accuracy:%.3f"%scores.mean())
结果:
Accuracy:0.953