一天,小西找到小迪。
小西:小迪,最近我闺蜜的男朋友向她求婚了。
小迪:然后呢,她答应了吗?
小西:还没有呢,他们认识时间还不是很长。而且,我闺蜜觉得那个男生有些方面不符合她的择偶标准,她现在也是非常纠结呢!
小迪:婚姻还是要理性一点,如果她不知道该如何判断,或许朴素贝叶斯算法可以帮助她去理性得看待这个问题。
小西:朴素贝叶斯是什么?它是怎么帮助人类理性分析问题的呢?
小迪:贝叶斯分类算法是统计学的一种概率分类方法,朴素贝叶斯分类是贝叶斯分类中最简单的一种。其分类原理就是利用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概率的类作为该特征所属的类。之所以称之为”朴素”,是因为贝叶斯分类只做最原始、最简单的假设:所有的特征之间是统计独立的。
小西:听上去还是非常多逻辑性呢!那我们该如何使用它呢?
小迪:那我们就以一个女生是否选择要嫁给一个男生为例解释一下这个算法。
![13825820-9e7e7d283d2ad75e.png](https://img-blog.csdnimg.cn/img_convert/38aa5aedac1c31563d370650ad9bd68d.png)
一、概述
想要搞懂朴素贝叶斯算法,一定要先理解条件概率公式跟全概率公式,这两个公式在大学时候我们都学过,下面我们来回顾一下。
假设某样本X有个属性,那么有
。满足这样的公式就说明特征统计独立。
1. 条件概率公式
条件概率(Condittional probability),就是指在事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。
![13825820-04de7b3ba2dc94c0.png](https://img-blog.csdnimg.cn/img_convert/9ee2f6e87a0b7d2a10ea648f66ed6ccd.png)
根据文氏图可知:在事件B发生的情况下,事件A发生的概率就是P(A∩B)除以P(B)。
同理可得:
所以,
接着看全概率公式,如果事件构成一个完备事件且都有正概率,那么对于任意一个事件B则有:
2. 贝叶斯推断
根据条件概率和全概率公式,可以得到贝叶斯公式如下:
P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。
P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。
P(B|A)/P(B)称为"可能性函数"(Likely hood),这是一个调整因子,使得预估概率更接近真实概率。
所以条件概率可以理解为:后验概率 = 先验概率 * 调整因子
如果"可能性函数">1,意味着"先验概率"被增强,事件A的发生的可能性变大;
如果"可能性函数"=1,意味着B事件无助于判断事件A的可能性;
如果"可能性函数"<1,意味着"先验概率"被削弱,事件A的可能性变小。
3. 嫁?还是不嫁?这是一个问题……
下面我们就以“嫁不嫁”这个问题应用一下我们的朴素贝叶斯算法。
![13825820-6c501d1b8c698b2d.jpg](https://img-blog.csdnimg.cn/img_convert/347d5832301e8b6fd61455c398af3168.png)
颜值 | 性格 | 上进否 | 嫁与否 |
---|---|---|---|
帅 | 好 | 上进 | 嫁 |
不帅 | 好 | 一般 | 不嫁 |
不帅 | 不好 | 不上进 | 不嫁 |
帅 | 好 | 一般 | 嫁 |
不帅 | 好 | 上进 | 嫁 |
帅 | 不好 | 一般 | 不嫁 |
帅 | 好 | 不上进 | 嫁 |
不帅 | 不好 | 上进 | 不嫁 |
帅 | 不好 | 上进 | 嫁 |
不帅 | 好 | 不上进 | 不嫁 |
上面这张表是根据女生根据假象男生的性格来决定是否嫁给他的标准信息表,我们利用这张表来针对特定男生的信息计算是否值得嫁的概率。
假设某个男生帅,性格不好,不上进,那么:
根据贝叶斯公式:
转换成分类任务的表达式:
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="34.537ex" height="6.313ex" viewBox="0 -1610.3 14870.2 2718" role="img" focusable="false" style="vertical-align: -2.573ex;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">类</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">别</text></g><g transform="translate(3024,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(3828,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">征</text></g><g transform="translate(7494,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">类</text></g><g transform="translate(8297,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">别</text></g><g transform="translate(9489,0)"><g transform="translate(120,0)"><g transform="translate(60,715)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">征</text></g><g transform="translate(3024,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">类</text></g><g transform="translate(3828,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">别</text></g></g><g transform="translate(1002,-803)"><g transform="translate(1140,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">特</text></g><g transform="translate(1943,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">征</text></g></g></g></g></g></svg>
按照朴素贝叶斯的求解,可以转换为计算和
,最终选择嫁与不嫁的答案。
分母的计算用到的是全概率公式:
所以
由上面得出:
P(嫁)= 5/10 = 1/2
P(不嫁)= 5/10 = 1/2
P(帅|嫁) * P(性格不好|嫁) * P(不上进|嫁)= 4/5 * 1/5 * 1/5
P(帅|不嫁) * P(性格不好|不嫁) * P(不上进|不嫁) = 1/5 * 3/5 * 2/5
对于类别“嫁”的贝叶斯分子为:
P(嫁) * P(帅|嫁) * P(性格不好|嫁) * P(不上进|嫁) = 1/2 * 4/5 * 1/5 * 1/5 = 2/125
对于类别“不嫁”的贝叶斯分子为:
P(不嫁) * P(帅|不嫁) * P(性格不好|不嫁) * P(不上进|不嫁) = 1/2 * 1/5 * 3/5 * 2/5 = 3/125
所以最终结果为:
P(嫁|帅\ 性格不好\ 不上进) = (2/125) / (2/125 + 3/125) = 40%
P(不嫁|帅\ 性格不好\ 不上进) = (3/125) / (2/125 + 3/125) = 60%
60% > 40%,该女生选择不嫁。
![13825820-e861c0109e9b17aa.png](https://img-blog.csdnimg.cn/img_convert/ea6155aca68dca224321c9ee9848451d.png)
二、朴素贝叶斯种类
小西:朴素贝叶斯就是根据先验概率与调整因子来确定概率的,是吧!
小迪:没错,但是朴素贝叶斯的形式确不止如此。在scikit-learn中,一共有3个朴素贝叶斯的分类算法。分别是GaussianNB,MultinomialNB和BernoulliNB。
1. GaussianNB
GaussianNB就是先验为高斯分布(正态分布)的朴素贝叶斯,假设每个标签的数据都服从简单的正态分布。
其中为Y的第k类类别。
为需要从训练集估计的值。
![13825820-5a0199ca5d65e100.png](https://img-blog.csdnimg.cn/img_convert/e66dd479dbad98657658746bbe55b5cb.png)
高斯分布图像
我们可以使用用scikit-learn简单实现一下GaussianNB。
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="python" contenteditable="true" cid="n138" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">#导入包
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
导入数据集
from sklearn import datasets
iris=datasets.load_iris()
切分数据集
Xtrain, Xtest, ytrain, ytest = train_test_split(iris.data,
iris.target,
random_state=12)
建模
clf = GaussianNB()
clf.fit(Xtrain, ytrain)
在测试集上执行预测,proba导出的是每个样本属于某类的概率
clf.predict(Xtest)
clf.predict_proba(Xtest)
测试准确率
accuracy_score(ytest, clf.predict(Xtest))</pre>
2. MultinomialNB
MultinomialNB就是先验为多项式分布的朴素贝叶斯。它假设特征是由一个简单多项式分布生成的。多项分布可以描述各种类型样本出现次数的概率,因此多项式朴素贝叶斯非常适合用于描述出现次数或者出现次数比例的特征。该模型常用于文本分类,特征表示的是次数,例如某个词语的出现次数。
多项式分布公式如下:
其中,是第k个类别的第j维特征的第l个取值条件概率。
是训练集中输出为第k类的样本个数。
为一个大于0的常数,常常取为1,即拉普拉斯平滑。也可以取其他值。
3. BernoulliNB
BernoulliNB就是先验为伯努利分布的朴素贝叶斯。假设特征的先验概率为二元伯努利分布,即如下式:
此时只有两种取值。
只能取值0或者1。
在伯努利模型中,每个特征的取值是布尔型的,即true和false,或者1和0。在文本分类中,就是一个特征有没有在一个文档中出现。
![13825820-6a2acb212e67ee97.png](https://img-blog.csdnimg.cn/img_convert/d5736cd6c6162e1e8fc9cfbf67e8d77f.png)
小西:那我们该在什么情况下分别使用这三种朴素贝叶斯模型呢?
小迪:一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分布大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB。
小西:原来如此。
注:所有图片均来源于网络