python数据分析之朴素贝叶斯实践
文章目录
- 1、概率基础
- 1.1 随机事件
- 1.2 样本空间
- 1.3 概率
- 1.4 联合概率
- 1.5 条件概率
- 1.6 独立性
- 1.7 先验概率与后验概率
- 2、 全概率公式
- 3、贝叶斯公式
- 4、 朴素贝叶斯算法
- 4.1 算法原理
- 4.2 平滑改进
- 4.3 算法优点
- 5、 常用朴素贝叶斯
- 5.1 高斯朴素贝叶斯(连续变量&高斯分布)
- 5.2 伯努利朴素贝叶斯(离散变量&伯努利分布)
- 5.3 多项式朴素贝叶斯(离散变量&多项式分布)
1、概率基础
1.1 随机事件
- 随机事件,指可能发生,也可能不发生的事件。
- 例如,当我们抛硬币时,设出现正面为事件A,则事件A可能发生,也可能不发生。
1.2 样本空间
- 样本空间,即我们进行随机试验时,所有可能结果构成的集合,习惯使用S表示。
1.3 概率
- 概率,用来反映一个随机事件出现的可能性大小,习惯使用 P(A)来表示事件A的概率。
1.4 联合概率
- 联合概率,指多个事件同时发生的概率,例如, P(AB) 表示事件A与事件B的联合概率。
1.5 条件概率
条件概率,指在事件A发生的前提下,事件B发生的概率,使用 P(B|A)表示。
关于条件概率,有以下一个重要的定义:
需要注意的是,P(B|A) 与 P(B) 是不同的,二者很可能也不相等。因为在事件A发生的前提下,会导致样本空间的收缩,从而会改变概率。
1.6 独立性
- 如果两事件A、B, 满足 P(AB) = P(A)P(B) 则称A与B相互独立。
- 因为 P(AB) = P(A)P(B|A),所以当两事件A,B独立时:P(B|A) = P(B)。
- 当两个事件独立时,一个事件发生与否,对另外一个事件完全没有任何影响。
1.7 先验概率与后验概率
- 由以往的数据分析而得到的概率,称为先验概率。
- 当得到某些信息后,在先验概率的基础上进行修正,从而得到的概率,称为后验概率。
2、 全概率公式
- 设实验的样本空间为S, A为E的事件,B1 ,B2 ,…,Bn 为S的一个划分(任意两个事件交集为空,所以事件并集为整个样本空间S),且P(Bi) > 0(i=1,2,…,n ),则以下式子称为全概率公式:
- 有的时候, P(A) 可能不易求出,但是,我们可以在S上寻找一个划分(i=1,2,……),并且 Bi与P(A|Bi) 的概率容易获取,这样,我们就可以使用全概率公式来求解P(A)。
例子:假设张三逃课的概率是0.4,当张三逃课时李四逃课的概率是0.5,当张三上课时李四逃课的概率是0.3,那么李四逃课的概率是多少呢?
这种情况直接求李四逃课的概率不好求,就可以利用全概率公式进行求解:P(李四逃课)= 0.4 x 0.5 + 0.6 x 0.3
3、贝叶斯公式
设实验的样本空间为S, A为E的事件,B1 ,B2 ,…,Bn 为S的一个划分(任意两个事件交集为空,所以事件并集为整个样本空间S),且P(A) > 0 ,P(Bi) >0 (i=1,2,…,n ),则以下式子称为贝叶斯公式:
贝叶斯公式的核心思维就是将求解 P(B|A) 的概率转换成求解 P(A|B) 的概率。有时候,求解P(B|A)难度较大,但是求解P(A|B)比较容易,在这样的情况下,我们就可以考虑应用贝叶斯公式进行转换,从而解决问题。
例子: 对以往数据分析结果表明,当机器调整得良好时,产品的合格率是为98%,而当机器发生某种故障时,其合格率为55%。每天早上机器开动时,机器调整良好的概率为95%。试求已知某日早上第一件产品是合格品时,机器调整良好的概率是多少?
设A为事件“产品合格”,B 为事件“机器调整良好”, ~B 为事件“机器发生故障” ,则P(B|A)即为在第一件产品合格下机器调整良好的概率,根据贝叶斯公式可将其转化为以B条件下A发生的概率进行求解,结合全概率公式即可得出答案:
这个例子中, 95%是由以往的数据分析而得到的概率 ,即为先验概率;而97%是在得知第一件产品是合格品时得到的概率,即为后验概率。
4、 朴素贝叶斯算法
- 朴素贝叶斯算法是基于概率的分类算法,之所以称为“朴素”,是因为其假设特征之间是独立的, 且对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
- 朴素贝叶斯算法设计比较简单,实际上使用的就是全概率公式与贝叶斯公式。
4.1 算法原理
(1)假设 x = {x1,x2,…,xn}为一个待分类项,x含有n个特征属性。
(2)假设类别集合 y={y1,y2,…,yn}
(3)想要预测待分类项x所属的类别y,则只需要计算x属于每个类别 y 的概率是多少,预测结果就是概率最大的那个类别,即我们要计算:
然而,有时候以上的概率我们并不容易求解,不过,根据贝叶斯公式,我们可以进行如下的转换:
(4) 因为朴素贝叶斯算法的前提假设为各个特征之间都是独立的,则 P(x1…xn) = P(x1)…P(xn),因此有:
(5)将(2)代入(1)式,可得:
(6)因为分母部分不变,所以比较概率的大小,只需要比较分子部分就可以了,则算法最终预测的类别,就是能够使得分子部分最大的那个类别,即 :
(7)若要预测样本的类别,只需要求解P(y)与P(xi| y)即可,而这两个概率,都可以从训练集中获取。
4.2 平滑改进
- 由于在计算p(xi|y)时,是各个概率的乘积,因此,一旦有一个概率为0,即使其他的概率值较大,也一律会得到0值。这会严重影响预测的准确性,为了避免这种情况的发生,我们在计算概率时,采用平滑改进:
其中,k 为特征xi可能的取值数, α(α>0 )称为平滑系数,当α=1时,称为拉普拉斯平滑(Laplace smoothing),当α<1时,称为Lidstone smoothing平滑。
4.3 算法优点
- 即使训练集数据较少,也能够实现预测,并且效果不错。
- 算法的训练速度非常快,因为算法假设特征之间是独立的,这意味着每个特征可以单独当成一维分布而进行评估,无需考虑与其他特征之间的关联性。
举个栗子:假设某学生上课和逃课情况如下,请根据以下数据算出第11和12条记录属于上课还是逃课?
序号 | 天气(X1) | 上课距离(X2) | 学生成绩(X3) | 课程类别(X4) | 上课情况(Y) |
---|---|---|---|---|---|
1 | 晴 | 远 | 差 | 选修 | 逃课 |
2 | 晴 | 近 | 差 | 必修 | 上课 |
3 | 晴 | 近 | 好 | 必修 | 上课 |
4 | 阴 | 远 | 差 | 选修 | 逃课 |
5 | 阴 | 近 | 好 | 选修 | 上课 |
6 | 阴 | 近 | 好 | 必修 | 上课 |
7 | 雨 | 远 | 差 | 选修 | 逃课 |
8 | 雨 | 近 | 好 | 必修 | 上课 |
9 | 雨 | 近 | 差 | 必修 | 逃课 |
10 | 雨 | 远 | 好 | 选修 | 逃课 |
11 | 阴 | 近 | 差 | 选修 | ? |
12 | 晴 | 远 | 好 | 选修 | ? |
根据朴素贝叶斯算法,想要预测这两条记录所属的类别,则只需要计算出X属于每个类别Y的概率是多少,预测结果就是概率最大的那个类别。
(1)对于第11条记录,我们就可以分别计算在上课与逃课的情况下,各自的概率值是多少:
从以上结果可以看出,学生逃课的概率大于上课的概率,则预测结果为逃课。(注意此处计算出来的上课和逃课的概率之和不为1是因为省略了分母,只计算了分子)
(2)对于第12条记录,因为 P(xi = 远 | y = 上课)的值为0,所以需要对数据 采用平滑改进处理,其余计算方式和第11条记录相同。
5、 常用朴素贝叶斯
- 在sklearn中,提供了若干种朴素贝叶斯的实现算法,不同的朴素贝叶斯算法,主要是对 P(xi | y) 的分布假设不同,进而采用不同的参数估计方式。
- 常用的三种朴素贝叶斯为:高斯朴素贝叶斯,伯努利朴素贝叶斯,多项式朴素贝叶斯。
5.1 高斯朴素贝叶斯(连续变量&高斯分布)
- 高斯朴素贝叶斯,适用于连续变量。其假定各个特征xi在各个类别y下是服从高斯分布(正态分布),算法内部使用正态分布的概率密度函数来计算概率P(xi | y),如下:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNBX, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
model = GaussianNB()
model.fit(X_train, y_train)
print("高斯朴素贝叶斯:",model.score(X_test, y_test))
--------------------------------------------------
高斯朴素贝叶斯: 1.0
5.2 伯努利朴素贝叶斯(离散变量&伯努利分布)
设实验E只有两个可能的结果: A与非A,则称E为伯努利实验。
伯努利朴素贝叶斯,适用于离散变量,其假设各个特征xi 在各个类别y下是服从n 重伯努利分布(二项分布)的,因为伯努利试验仅有两个结果,因此,算法会首先对特征值进行二值化处理(假设二值化的结果为1与0)。
P(xi | y)计算方式如下:
在训练集中,会进行如下的估计:
因为在数据集中,只有两种取值(1与0),因此,对于给定的类别与特征,只需要计算P(xi =1 | y)就可以了,而P(xi = 0 | y)的概率,用1减去P(xi =1 | y)即可得出。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNBX, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
model = BernoulliNB()
model.fit(X_train, y_train)
print("伯努利朴素贝叶斯:",model.score(X_test, y_test))
-------------------------------------------------------
伯努利朴素贝叶斯: 0.23684210526315788
5.3 多项式朴素贝叶斯(离散变量&多项式分布)
- 多项式朴素贝叶斯,适用于离散变量,其假设各个特征xi在各个类别y下是服从多项式分布的,故每个特征值不能是负数。
P(xi | y)计算如下:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNBX, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
model = MultinomialNB()
model.fit(X_train, y_train)
print("多项式朴素贝叶斯:",model.score(X_test, y_test))
---------------------------------------------------
多项式朴素贝叶斯: 0.5789473684210527
python数据分析之朴素贝叶斯实践相关推荐
- Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说朴 ...
- Python+sklearn使用朴素贝叶斯算法识别中文垃圾邮件
总体思路与步骤: 1.从电子邮箱中收集垃圾和非垃圾邮件训练集. 2.读取全部训练集,删除其中的干扰字符,例如[]*..,等等,然后分词,删除长度为1的单个字. 3.统计全部训练集中词语的出现次数,截取 ...
- 【数据科学系统学习】机器学习算法 # 西瓜书学习记录 [6] 朴素贝叶斯实践
本篇内容为<机器学习实战>第 4 章 基于概率论的分类方法:朴素贝叶斯程序清单.所用代码为 python3. 朴素贝叶斯 优点:在数据较少的情况下仍然有效,可以处理多类别问题. 缺点:对于 ...
- python推荐系统算法朴素贝叶斯_机器学习经典算法之朴素贝叶斯分类
很多人都听说过贝叶斯原理,在哪听说过?基本上是在学概率统计的时候知道的.有些人可能会说,我记不住这些概率论的公式,没关系,我尽量用通俗易懂的语言进行讲解. 贝叶斯原理是英国数学家托马斯·贝叶斯提出的. ...
- Python机器学习06——朴素贝叶斯
本系列所有的代码和数据都可以从陈强老师的个人主页上下载:Python数据程序 参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021. 本系列基本不讲数学原理,只从代码角度去让 ...
- Python自然语言处理—朴素贝叶斯
一贝叶斯公式 公式很好理解,当我们相求已知状态X下打上ý标签的概率的时候,可以将问题分以下三个问题 1,求标签ÿ下X状态的概率 2,求标签ÿ的概率 3,求X状态的概率 以上三个问题可以简单的统计已知样 ...
- python:基于朴素贝叶斯算法的垃圾邮件过滤分类
目录 一.朴素贝叶斯算法 1.概述 2.推导过程 二.实现垃圾邮件过滤分类 1.垃圾邮件问题背景 2.朴素贝叶斯算法实现垃圾邮件分类的步骤 3.python实现 参考学习网址:https://blog ...
- 朴素贝叶斯python代码_朴素贝叶斯模型及python实现
1 朴素贝叶斯模型 朴素贝叶斯法是基于贝叶斯定理.特征条件独立假设的分类方法.在预测时,对输入x,找出对应后验概率最大的 y 作为预测. NB模型: 输入: 先验概率分布:P(Y=ck),k=1,2, ...
- python 机器学习 sklearn 朴素贝叶斯
首先介绍一个非常好的博主和博客,大家可以去这学习,我收获很大优秀的博客 朴素贝叶斯下面包括三个方法 分别是高斯朴素贝叶斯.多项式朴素贝叶斯.伯努利朴素贝叶斯 这三种方式都有不同的应用场所,比如你要预测 ...
- python推荐系统算法朴素贝叶斯_朴素贝叶斯算法在人才盘点中的应用(之一)
一.识别人才首先是处理不确定性问题 做招聘面试的HR应该会认同这样的经历. 打开应聘者简历,赫然写着TOP10名学毕业.抬头一瞧,小伙长得一表人才,精神抖擞,朝气蓬勃.HR兴趣大增. 再一看,研究方向 ...
最新文章
- Linux 性能分析的前 60 秒
- mysql日期加减问题
- nvidia nvlink互联与nvswitch介绍
- Fiori Launchpad etag retrieve logic - UI5 Repository
- wordpress安装及使用
- web业务系统权限控制
- 中文巨量模型“源1.0”的学习优化方法
- 实验二Step1-有序顺序表
- 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程
- mysql 5.7 安装_MySQL 5.7 的安装历程
- HALCON: HALCON 20.11.0.0 Progress主要新特性
- idea 生成sdk_如何安装独立的Android SDK,然后将其添加到Windows上的IntelliJ IDEA?
- 2015(4)软件工程,软件运行与维护,新旧系统转换策略,遗留系统的演化策略,数据转换与数据迁移...
- 加载中_Spring Boot 2.2 中的延迟加载
- 查看linux系统日志某一天,linux系统日志查看
- JavaScript 对象的创建与继承——创建篇
- Redis主从复制架构初步探索 http://www.sxt.cn/info-1750-u-324.html#SXT_h2_11
- 苹果关闭 iOS 14.4.2 系统验证通道
- 深耕硬科技,香港科大百万创赛与八大投资机构签署合作意向
- APP上架各大应用市场教程:所需材料与注意事项