8.机器学习-十大算法之一朴素贝叶斯(Naive Bayes)算法原理讲解
一·摘要
机器学习中的十大算法之一的朴素贝叶斯(Naive Bayes)算法,是一种基于贝叶斯定理和特征条件独立假设的分类方法。其核心原理在于利用贝叶斯定理计算给定数据样本下各类别的后验概率,并选择具有最高后验概率的类别作为该样本的预测类别。朴素贝叶斯算法假设特征之间是相互独立的,这一假设虽然简化了计算,但也可能影响分类的准确性。由于其简单易懂、学习效率高,朴素贝叶斯算法在实际应用中仍然被广泛使用,特别是在文本分类、垃圾邮件过滤等领域取得了显著的效果。
二·个人简介
🏘️🏘️个人主页:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,CSDN内容合伙人,阿里云社区专家博主,新星计划导师,在职数据分析师。
💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。
类型 | 专栏 |
---|---|
Python基础 | Python基础入门—详解版 |
Python进阶 | Python基础入门—模块版 |
Python高级 | Python网络爬虫从入门到精通🔥🔥🔥 |
Web全栈开发 | Django基础入门 |
Web全栈开发 | HTML与CSS基础入门 |
Web全栈开发 | JavaScript基础入门 |
Python数据分析 | Python数据分析项目🔥🔥 |
机器学习 | 机器学习算法🔥🔥 |
人工智能 | 人工智能 |
三·朴素贝叶斯算法简介
朴素贝叶斯算法概念
贝叶斯方法
贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主观偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。
朴素贝叶斯算法
朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。
朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。
贝叶斯公式
贝叶斯公式: P(A|B) = P(A) * P(B|A) / P(B)
案例一:
现分别有 A、B 两个容器,在容器 A 里分别有 7 个红球和 3 个白球,
在容器 B 里有 1 个红球和 9 个白球,现已知从这两个容器里任意抽出了一个球,且是红球,
问这个红球是来自容器 A 的概率是多少?
事件A:
# X事件为选中了红球
p(X) = 8/20
# Y事件代表选中A容器
p(Y) = 1/2
# A容器中红球的概率
p(X|Y) = 7/10
# 选中一个红球,该球来自A容器的概率为
p(Y|X) = p(X|Y) * p(Y)/p(X)
p(Y|X) = 7/10 * 1/2 * 20/8 = 7/8
案例二:
一座别墅在过去的 20 年里一共发生过 2 次被盗事件。
别墅的主人有一条狗,
狗平均每周晚上叫 3 次,
叫在盗贼入侵时狗的概率被估计为 0.9,
问题是:在狗叫的时候发生入侵的概率是多少?
我们假设
A 事件为狗在晚上叫,
B 为盗贼入侵
p(A) = 3/7
p(B) = 2/(20*365)
p(A|B) = 0.9
# 求解的问题:
p(B|A) = p(A|B) * p(B)/p(A)
p = 0.9 * (2/(20*365))/(3/7) = 0.00058
四·贝叶斯算法的核心思想:利用贝叶斯定理进行分类
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯(Naive Bayes)分类是贝叶斯分类中最简单,也是常见的一种分类方法。
朴素贝叶斯算法的核心思想是通过考虑特征概率来预测分类,即对于给出的待分类样本,求解在此样本出现的条件下各个类别出现的概率,哪个最大,就认为此待分类样本属于哪个类别。
举个例子帮助理解,在挑选葡萄酒时,我们通常也会通过一些感官特征来判断其品质,如颜色、气味、口感等。为了简化问题,我们同只关注其中一个特征——声音,具体来说,就是摇动酒瓶时发出的声音。
根据经验,摇动酒瓶时发出的声音“清脆”可能表明葡萄酒比较年轻,口感可能较为酸涩;而声音“沉闷”则可能意味着葡萄酒已经陈年,口感更加圆润和复杂。当然,这只是一个粗略的判断方法,因为葡萄酒的品质受到多种因素的影响。
类似地,我们可以使用朴素贝叶斯分类器来构建一个基于声音特征的葡萄酒品质预测模型。在这个模型中,我们会收集大量的葡萄酒样本,记录它们摇动时发出的声音(清脆或沉闷),并标记它们的品质(好或坏)。通过训练这个模型,我们可以得到每个声音特征对应的品质概率。
当面对一瓶未知的葡萄酒时,我们可以通过摇动酒瓶来判断其声音特征,并将这个特征输入到我们的模型中。模型会根据之前学习的概率分布来预测这瓶葡萄酒的品质,输出一个表示好酒或坏酒的概率值。如果“坏酒模型”输出的概率值更大,那么这瓶葡萄酒可能品质不佳;反之,如果“好酒模型”输出的概率值更大,那么这瓶葡萄酒可能品质上乘。
这个模型只是一个简化版的示例,实际上在挑选葡萄酒时,我们会综合考虑更多的特征,如颜色、气味、口感等。此外,朴素贝叶斯分类器也有其局限性,它假设特征之间是相互独立的,这在实际情况中往往不成立。
五·优缺点
优点
模型简单
:基于简单的概率模型,易于理解和实现。
分类速度快
:主要进行概率计算,适用于大规模数据处理。
对小规模数据友好
:不需要大量数据来训练。
适用于多分类
:可以轻松处理多类别分类任务。
对缺失数据不敏感
:可以较好地处理含有缺失值的数据集。
缺点
特征独立性假设
:假设特征之间相互独立,这在现实中可能不成立,影响算法效果。
对输入数据敏感
:对数据的表达形式敏感,如连续型数据需要离散化,可能损失信息。
对不平衡数据敏感
:可能偏向于多数类,导致对少数类的预测准确率较低。
先验概率计算
:样本数量少时,先验概率计算可能不准确。
不适合复杂关系数据
:可能无法准确捕捉数据中的复杂关系。
六·朴素贝叶斯原理
朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下:
这个公式虽然看上去简单,但它却能总结历史,预知未来:
公式的右边是总结历史
公式的左边是预知未来
如果把Y看成类别,X看成特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来。
举个例子,大学的时候,某男生经常去图书室晚自习,发现他喜欢的那个女生也常去那个自习室,心中窃喜,于是每天买点好吃的在那个自习室蹲点等她来,可是人家女生不一定每天都来,眼看天气渐渐炎热,图书馆又不开空调,如果那个女生没有去自修室,该男生也就不去,每次男生鼓足勇气说:“嘿,你明天还来不?”,“啊,不知道,看情况”。
然后该男生每天就把她去自习室与否以及一些其他情况做一下记录,用Y表示该女生是否去自习室,即Y={去,不去},X是跟去自修室有关联的一系列条件,比如当天上了哪门主课,蹲点统计了一段时间后,该男生打算今天不再蹲点,而是先预测一下她会不会去,现在已经知道了今天上了常微分方程(Y=去|常微分方程)与P(Y=不去|常微分方程),看哪个概率大,如果P(Y=去|常微分方程) >P(Y=不去|常微分方程),那这个男生不管多热都屁颠屁颠去自习室了,否则不就去自习室受罪了。P(Y=去|常微分方程)的计算可以转为计算以前她去的情况下,那天主课是常微分的概率P(常微分方程|Y=去),注意公式右边的分母对每个类别(去/不去)都是一样的,所以计算的时候忽略掉分母,这样虽然得到的概率值已经不再是0~1之间,但是通过比较大小还是能选择类别。
后来他发现还有一些其他条件可以挖,比如当天星期几、当天的天气,以及上一次与她在自修室的气氛,统计了一段时间后,该男子一计算,发现不好算了,因为总结历史的公式:
这里n=3,x(1)表示主课,x(2)表示天气,x(3)表示星期几,x(4)表示气氛,Y仍然是{去,不去},现在主课有8门,天气有晴、雨、阴三种、气氛有A+,A,B+,B,C五种,那么总共需要估计的参数有8×3×7×5×2=1680个,每天只能收集到一条数据,那么等凑齐1680条数据,大学都毕业了,男生大呼不妙,于是做了一个独立性假设,假设这些影响她去自习室的原因是独立互不相关的,于是:
有了这个独立假设后,需要估计的参数就变为,(8+3+7+5)×2 = 46个了,而且每天收集的一条数据,可以提供4个参数,这样该男生就预测越来越准了。
七·朴素贝叶斯分类器
讲了上面的小故事,我们来朴素贝叶斯分类器的表示形式:
当特征为为x时,计算所有类别的条件概率,选取条件概率最大的类别作为待分类的类别。由于上公式的分母对每个类别都是一样的,因此计算时可以不考虑分母,即
朴素贝叶斯的朴素体现在其对各个条件的独立性假设上,加上独立假设后,大大减少了参数假设空间。
八·在文本分类上的应用
文本分类的应用很多,比如垃圾邮件和垃圾短信的过滤就是一个2分类问题,新闻分类、文本情感分析等都可以看成是文本分类问题,分类问题由两步组成:训练和预测,要建立一个分类模型,至少需要有一个训练数据集。贝叶斯模型可以很自然地应用到文本分类上:现在有一篇文档d(Document),判断它属于哪个类别ck,只需要计算文档d属于哪一个类别的概率最大:
在分类问题中,我们并不是把所有的特征都用上,对一篇文档d,我们只用其中的部分特征词项t1,t2,…,tnd(nd表示d中的总词条数目),因为很多词项对分类是没有价值的,比如一些停用词“的,是,在”在每个类别中都会出现,这个词项还会模糊分类的决策面,关于特征词的选取,我的这篇文章有介绍。用特征词项表示文档后,计算文档d的类别转化为:
注意P(Ck|d)只是正比于后面那部分公式,完整的计算还有一个分母,但我们前面讨论了,对每个类别而已分母都是一样的,于是在我们只需要计算分子就能够进行分类了。实际的计算过程中,多个概率值P(tj|ck)的连乘很容易下溢出为0,因此转化为对数计算,连乘就变成了累加:
我们只需要从训练数据集中,计算 每一个类别的出现概率P(ck) 和 每一个类别中各个特征词项的概率P(tj|ck), 而这些概率值的计算都采用最大似然估计, 说到底就是统计每个词在各个类别中出现的次数和各个类别的文档的数目: