朴素贝叶斯(NB)

[学生党学习笔记,如有错误谢谢各位大佬指出]
所用书籍:《统计学习方法》-李航

一、概述

  朴素贝叶斯模型首先基于特征条件独立假设,学习输入的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
  同时这也表明了朴素贝叶斯是一种生成式模型,是基于概率进行学习并分类的。
  关于生成式模型与判别式模型,大家可以点链接看看这篇文章[戳这里]

  相对于其它分类算法,朴素贝叶斯分类依赖于贝叶斯概率定理来预测未知数据集的类别,它的速度是非常快的。
  贝叶斯定理实际上就是计算”条件概率”的公式。
条件概率:
P(A∣B)=P(B∣A)∗P(A)P(B)P(A|B)=\frac{P(B|A)*P(A)}{P(B)}P(A∣B)=P(B)P(B∣A)∗P(A)​
在朴素贝叶斯分类器中,上式分别表示:

  • P(A|B)是给定预测变量(B,属性)的类(A,target)的后验概率。【即在看到新数据后,我们要计算的该假设的概率】
  • P(A)是类的先验概率。【即在得到新数据前某一假设的概率】
  • P(B|A)是预测器给定类的概率的可能性。【该假设下得到这一数据的概率,称为似然度】
  • P(B)是预测器的先验概率。【在任何假设下得到这一数据的概率,称为标准化常量】

  朴素贝叶斯分类器假设类中特定特征和其它特征的存在无关,因为前提条件便是基于特征独立的。这也是这个算法被称为“朴素”的原因。

二、贝叶斯算法数学原理

  这部分我建议大家去看李航老师的《统计学习方法》,我觉得写得很清楚,我这里就不过多赘述(也可能是我懒得打那些复杂的推导公式,我个人习惯在例子中搞明白)。

  这里直接上例题(例子来源于上书):

  例:由下表中的训练数据学习一个NB分类器并确定x=(2,S)Tx=(2,S)^Tx=(2,S)T的类标记y,表中x(1)x^{(1)}x(1),x(2)x^{(2)}x(2)为特征,取值的集合分别为A1A_1A1​={1,2,3},A2A_2A2​={S,M,L},Y为类标记,Y∈\in∈C={1,-1}.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
x(1)x^{(1)}x(1) 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
x(2)x^{(2)}x(2) S M M S S S M M L L L M M L L
YYY -1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1

  首先我们分析目标变量(Target)Y:
P(Y=1)=915,P(Y=−1)=615P(Y=1)=\frac{9}{15},P(Y=-1)=\frac{6}{15}P(Y=1)=159​,P(Y=−1)=156​
  再看各特征的条件概率:
P(x(1)=1∣Y=1)=29,P(x(1)=2∣Y=1)=39,P(x(1)=3∣Y=1)=49P(x^{(1)}=1|Y=1)=\frac{2}{9},P(x^{(1)}=2|Y=1)=\frac{3}{9},P(x^{(1)}=3|Y=1)=\frac{4}{9}P(x(1)=1∣Y=1)=92​,P(x(1)=2∣Y=1)=93​,P(x(1)=3∣Y=1)=94​
P(x(2)=S∣Y=1)=19,P(x(2)=M∣Y=1)=49,P(x(2)=L∣Y=1)=49P(x^{(2)}=S|Y=1)=\frac{1}{9},P(x^{(2)}=M|Y=1)=\frac{4}{9},P(x^{(2)}=L|Y=1)=\frac{4}{9}P(x(2)=S∣Y=1)=91​,P(x(2)=M∣Y=1)=94​,P(x(2)=L∣Y=1)=94​
P(x(1)=1∣Y=−1)=36,P(x(1)=2∣Y=−1)=26,P(x(1)=3∣Y=−1)=16P(x^{(1)}=1|Y=-1)=\frac{3}{6},P(x^{(1)}=2|Y=-1)=\frac{2}{6},P(x^{(1)}=3|Y=-1)=\frac{1}{6}P(x(1)=1∣Y=−1)=63​,P(x(1)=2∣Y=−1)=62​,P(x(1)=3∣Y=−1)=61​
P(x(2)=S∣Y=−1)=36,P(x(2)=M∣Y=−1)=26,P(x(2)=L∣Y=−1)=16P(x^{(2)}=S|Y=-1)=\frac{3}{6},P(x^{(2)}=M|Y=-1)=\frac{2}{6},P(x^{(2)}=L|Y=-1)=\frac{1}{6}P(x(2)=S∣Y=−1)=63​,P(x(2)=M∣Y=−1)=62​,P(x(2)=L∣Y=−1)=61​
  再对于给定的x=(2,S)Tx=(2,S)^Tx=(2,S)T:
P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=915∗39∗19=145P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{9}{15}*\frac{3}{9}*\frac{1}{9}=\frac{1}{45}P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=159​∗93​∗91​=451​
P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=615∗26∗36=115P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{6}{15}*\frac{2}{6}*\frac{3}{6}=\frac{1}{15}P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=156​∗62​∗63​=151​
  从这里便可以得出结果,下式概率大于上式,所以预测y=-1。

贝叶斯估计(使用拉普拉斯平滑)

  如果我们要估计的概率值有为0的情况,这时会影响到后验概率的计算,使模型产生偏差,这时我们便需要进行贝叶斯估计,条件概率的贝叶斯估计式如下:
Pλ=Σi=1NI(yi=ck)+λN+KλP_{\lambda}=\frac{\Sigma_{i=1}^N{I(y_i=c_k)}+\lambda}{N+K\lambda}Pλ​=N+KλΣi=1N​I(yi​=ck​)+λ​
Pλ(X(j)=aji∣Y=ck)=Σi=1NI(xi(j)=aij,yi=ck)+λΣi=1NI(yi=ck)+SiλP_{\lambda}(X^{(j)}=a_{ji}|Y=c_k)=\frac{\Sigma_{i=1}^N{I(x_i^{(j)}=a_{ij},y_i=c_k)}+\lambda}{\Sigma_{i=1}^N{I(y_i=c_k)}+S_i\lambda}Pλ​(X(j)=aji​∣Y=ck​)=Σi=1N​I(yi​=ck​)+Si​λΣi=1N​I(xi(j)​=aij​,yi​=ck​)+λ​
  则同样以例题形式,数据同上表,按照拉普拉斯平滑估计概率,即取λ=1\lambda=1λ=1。
  公式推导我就不多说了,贝叶斯参数估计的公式其实就是在条件概率公式的分子加一个λ\lambdaλ,分母加一个KλK\lambdaKλ或SiλS_{i}\lambdaSi​λ,其中K为y的种类,SiS_iSi​为某特征的种类,本题中y=1或-1,所以K=2,x(1)x^{(1)}x(1)有1,2,3这三种,即S1S_1S1​=3。
  接下来我们来进行计算,同样先计算目标函数y:

P(Y=1)=9+115+2∗1=1017,P(Y=−1)=6+115+2∗1=717P(Y=1)=\frac{9+1}{15+2*1}=\frac{10}{17},P(Y=-1)=\frac{6+1}{15+2*1}=\frac{7}{17}P(Y=1)=15+2∗19+1​=1710​,P(Y=−1)=15+2∗16+1​=177​
  再看各特征的条件概率:
P(x(1)=1∣Y=1)=2+19+3=312P(x^{(1)}=1|Y=1)=\frac{2+1}{9+3}=\frac{3}{12}P(x(1)=1∣Y=1)=9+32+1​=123​
  这里分母为什么加3呢,因为这是特征x(1)x^{(1)}x(1)有1,2,3这三种,即S1S_1S1​=3,同理x(2)x^{(2)}x(2)也有S,M,L三种,因此下面的S2S_2S2​=3.
  计算结果如下:
P(x(1)=2∣Y=1)=412,P(x(1)=3∣Y=1)=512P(x^{(1)}=2|Y=1)=\frac{4}{12},P(x^{(1)}=3|Y=1)=\frac{5}{12}P(x(1)=2∣Y=1)=124​,P(x(1)=3∣Y=1)=125​
P(x(2)=S∣Y=1)=212,P(x(2)=M∣Y=1)=512,P(x(2)=L∣Y=1)=512P(x^{(2)}=S|Y=1)=\frac{2}{12},P(x^{(2)}=M|Y=1)=\frac{5}{12},P(x^{(2)}=L|Y=1)=\frac{5}{12}P(x(2)=S∣Y=1)=122​,P(x(2)=M∣Y=1)=125​,P(x(2)=L∣Y=1)=125​
P(x(1)=1∣Y=−1)=49,P(x(1)=2∣Y=−1)=39,P(x(1)=3∣Y=−1)=29P(x^{(1)}=1|Y=-1)=\frac{4}{9},P(x^{(1)}=2|Y=-1)=\frac{3}{9},P(x^{(1)}=3|Y=-1)=\frac{2}{9}P(x(1)=1∣Y=−1)=94​,P(x(1)=2∣Y=−1)=93​,P(x(1)=3∣Y=−1)=92​
P(x(2)=S∣Y=−1)=49,P(x(2)=M∣Y=−1)=39,P(x(2)=L∣Y=−1)=29P(x^{(2)}=S|Y=-1)=\frac{4}{9},P(x^{(2)}=M|Y=-1)=\frac{3}{9},P(x^{(2)}=L|Y=-1)=\frac{2}{9}P(x(2)=S∣Y=−1)=94​,P(x(2)=M∣Y=−1)=93​,P(x(2)=L∣Y=−1)=92​
  再对于给定的x=(2,S)Tx=(2,S)^Tx=(2,S)T:
P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1017∗412∗212=5153=0.0327P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{10}{17}*\frac{4}{12}*\frac{2}{12}=\frac{5}{153}=0.0327P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1710​∗124​∗122​=1535​=0.0327
P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=717∗39∗49=28459=0.0610P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{7}{17}*\frac{3}{9}*\frac{4}{9}=\frac{28}{459}=0.0610P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=177​∗93​∗94​=45928​=0.0610
因此,预测y=-1。

三、朴素贝叶斯分类器的优缺点

优点:

  • 预测测试数据集的类别是容易且快速的,它在多分类预测中也表现良好。
  • 当独立性假设成立时,朴素贝叶斯分类器与逻辑回归等其他模型相比表现更好,而且需要更少的训练数据。
  • 与数值变量相比,该模型在分类输入变量的情况下表现更好。
  • 对缺失数据不敏感,所以常用于文本分类。

缺点:

  • 如果出现“零概率”时,模型不能进行预测。因此我们需要使用平滑技术。最简单的平滑技术之一是拉普拉斯评估。
  • 另一方面,朴素贝叶斯(Bayes)也被称为不好的估计器,所以来自predict_proba的概率输出不应该被过于重视。
  • 对训练数据的依赖性很强,如果训练数据误差较大,那么预测出来的效果就会不佳。
  • 朴素贝叶斯的另一个局限是独立预测因子的假设。在现实生活中,我们得到一组完全独立的预测变量几乎是不可能的。
    注:我们知道朴素贝叶斯模型中的输入变量都是条件独立的,这是该模型的基本前提,但如果输入变量之间存在概率依存关系,那这时模型就变成了贝叶斯网络。

四、朴素贝叶斯算法的应用

  实时预测:该模型速度很快。 因此,它可以用于实时预测。

  多分类器:由贝叶斯公式可知,这种算法也是一个多分类器。因此我们可以预测多个目标变量类别的概率。

  文本分类/垃圾邮件过滤/情感分析:该模型被广泛用于垃圾邮件过滤识别和情感分析。可以用于文本分类,成功率很高。

  推荐系统:朴素贝叶斯分类器和协作过滤一起构建推荐系统,该系统使用机器学习和数据挖掘技术来过滤看不见的信息并预测用户是否喜欢给定的资源。

五、朴素贝叶斯的分类

sklearn库中有三种类型的朴素贝叶斯模型:

  高斯(Gaussian):它用于分类,它假设特征遵循正态分布,意思就是对连续型数据进行处理。

  多项式(Multinomial):用于离散计数。计算数据的条件概率(使用拉普拉斯估计器进行平滑的一个模型)。

  伯努利(Bernoulli):取值特征是布尔型,即ture或false,在进行文档分类时,就是一个单词有没有在一个文档中出现过。

六、朴素贝叶斯的调优

以下是提高Naive Bayes模型功能的一些建议:

  • 如果连续性特征不具有正态分布,则应采用变换或不同的方法将其转换为正态分布。
  • 如果测试数据集具有零频率问题,则应用平滑技术“拉普拉斯修正”来预测测试数据集的类别。
  • 删除相关特征,因为高度相关的特征在模型中被投票两次,并且可能导致过度膨胀的重要性。
  • 朴素贝叶斯是根据训练集进行分类,分类出来的结果基本上就是确定了的。所以是没有超参数可以调整的,只能通过alpha = 1来平滑,alpha值并不算超参数;或者使用fit_prior = [True | False]来学习- 类别先验概率。个人觉得用朴素贝叶斯模型的话要把重点放在数据的预处理和特征选择上。
  • 最后,一些常用的分类器组合技术是没有效果的,如集合,装袋和提高。因为它们的目的是减少变化。而朴素贝叶斯没有任何变化可以最小化。

七、python实现代码

直接在下一篇博客中,写之前kaggle竞赛的项目,项目中会用到NB,实现的话用sklearn是很简单的。稍微写一下核心(没有前后文,单独运行肯定是不行的)

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
model = GaussianNB()
# 用训练数据拟合
model.fit(X_train,y_train)
# 预测
predict_train = model.predict(X_train)
trainaccuracy = accuracy_score(y_train,predict_train)
print('accuracy_score on train dataset : ', trainaccuracy)

用sklearn库基本上这些机器学习代码就这么多,我只能说开发sklearn的是神。

学习笔记-贝叶斯分类器及其python实现相关推荐

  1. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  2. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  3. 学习笔记1:更改python下载源

    学习笔记1:更改python下载源,让安装速度更快! 1.常用的国内镜像源 清华镜像源 https://pypi.tuna.tsinghua.edu.cn/simple 中科大镜像源 https:// ...

  4. ROS学习笔记(二)——python、C++编译器以及ROS的安装

    ROS学习笔记(二)--python.C++编译器以及ROS的安装 文章目录 ROS学习笔记(二)--python.C++编译器以及ROS的安装 一.编译器的安装 二.ROS的安装 三.验证: 本文主 ...

  5. Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件

    Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件 用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很 ...

  6. python学习笔记(一)Python 简单介绍

    Python学习笔记(一)Python 简单介绍 Python介绍 Python简介 Python应用领域 Python是解释型的语⾔ 编译和解释的区别是什么? 编译型vs解释型 编译型 解释型 Py ...

  7. Python学习笔记(二)——Python基本图形绘制

    Python学习笔记(二)--Python基本图形绘制 文章目录 Python学习笔记(二)--Python基本图形绘制 不同编程语言的初心和适用对象 Python蟒蛇绘制 五星红旗绘制 这次笔记主要 ...

  8. 贝叶斯公式/朴素贝叶斯分类器及python自实现

    本文从贝叶斯与频率概率的对比入手理解贝叶斯决策的思维方式.通过两个实例理解贝叶斯的思想与流程,然后梳理了朴素贝叶斯分类器的算法流程,最后从零开始实现了朴素分类器的算法. 文章目录 1.起源.提出与贝叶 ...

  9. 机器学习(十一)-Naïve Bayes Classifier朴素贝叶斯分类器及Python实现

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 本次代码的环境: 运行平台: Windows Python版本: ...

最新文章

  1. 2022-2028年中国聚乳酸降解塑料行业市场运营格局及投资前景趋势报告
  2. 小程序登录、用户信息相关接口调整说明
  3. 计算器html js php代码,JavaScript计算器网页版实现代码分享
  4. 博途v15做上位画面_realme真我V15评测:当科技遇上国潮 越级还能这么玩
  5. LeetCode-滑动窗口-3. 无重复字符的最长子串
  6. Nginx面试中最常见的18道题及答案
  7. 实战 es6_Node.JS实战65:ES6新特性:箭头函数
  8. 翻译:SQL Server中的索引内部结构:到SQL Server索引级别10的阶梯。
  9. iPad开发(相对于iPhone开发时专有的API)
  10. SQL Server 镜像
  11. mujoco安装教程
  12. C++关于头文件中定义变量出现LNK2005
  13. win7重装系统后计算机打不开,win7系统重装后进不了系统怎么办
  14. 华信云SMS短信平台介绍
  15. PX4平台(V3)+T8S遥控器校准
  16. 上海出差之行--领略外滩美景、RT-Thread总部之旅、嵌友面基、返程记录
  17. 睡觉少对孩子影响很大肚子变胖记忆受损
  18. PPP原理 PAP认证 CHAP认证
  19. 测试职业发展、高级测试需要知道哪些、P6测试需要知道什么、测试的知识点、测试自我提升、测试圣经
  20. 贵的键盘就一定好吗?程序员该怎样选择一款适合自己的键盘呢,来这里参考下吧

热门文章

  1. linux c员工管理,Linux cgroup
  2. centos7上rocket.chat环境搭建
  3. linux照片色彩空间,『ptapp』AdobeRGB还是sRGB?照片色彩空间浅析
  4. win10家庭版升级到win10专业版或者其他版本详细步骤(快捷,秘钥升级)
  5. 谷粒学院16万字笔记+1600张配图(十一)——课程管理
  6. Android5.0使用全透明状态栏
  7. js 锚点定位的2种简单方法
  8. (原创)介绍一个优秀的图片压缩库Compressor
  9. C++基础:指针空值(nullptr)
  10. Mac中毒怎么办?5招教你百”毒“不侵