《机器学习》-- 第七章 朴素贝叶斯
正文共:3478 字 18 图 预计阅读时间:11 分钟
前文推送
- 《机器学习》--第一章
- 《机器学习》--第二章
- 《机器学习》--第三章(上)
- 《机器学习》-- 第三章 (下)
- 《机器学习》--第四章
- 《机器学习》-- 第五章
- 《机器学习》-- 第六章
本文目录:
- 7.1 贝叶斯决策论
- 7.2 极大似然估计
- 7.3 朴素贝叶斯分类器
七、贝叶斯分类器
贝叶斯分类器是一种概率框架下的统计学习分类器,对分类任务而言,假设在相关概率都已知的情况下,贝叶斯分类器考虑如何基于这些概率为样本判定最优的类标。
贝叶斯公式(定理):设 为样本空间的一个划分, 为 S 中的任意事件, 且 则恒有
该公式的含义是在观察到事件B已发生的条件下,寻找导致B发生的每个原因()的概率。
7.1 贝叶斯决策论
贝叶斯决策论(Bayesian decision theory)是概率框架下实施决策的基本方法。对分类任务来说, 在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。
假设有 种可能的类别标记, 即 是将一个真实标记为 的样本误分类为 所产生的损失。基于后验概率 可获得将样本 分类为 所产生的期望损失(expected loss),即在样本 上的“条件风险”(conditional risk)
我们的任务是寻找一个判定准则 以最小化总体风险
即寻找一个判定准则最小化所有样本的条件风险总和,因此就有了「贝叶斯判定准则」(Bayes decision rule):为最小化总体风险,只需在每个样本上选择那个使得条件风险最小的类标。
此时, 称为贝叶斯最优分类器(Bayes optimal classifier),与之对应的总体风险 称为贝叶斯风险(Bayes risk). 反映了分奖器所能达到的最好性能,即通过机器学习所能产生的「模型精度的理论上限」。
具体来说,如若损失函数 取0-1损失,则有:
此时条件风险
于是,最小化分类错误率的贝叶斯最优分类器为
即对于每个样本 ,选择其 后验概率 最大所对应的类标,能使得总体风险函数最小,从而将原问题转化为估计后验概率。然而, 在现实任务中这通常难以直接获得。从这个(概率)角度来看, 机器学习(有些机器学习技术无需估计后验概率就能准确分类)所要实现的是基于有限的训练样本集尽可能准确地估计出后验概率 。大体来说,主要有两种策略来对后验概率进行估计:
- 给定 可通过直接建模 来 预测 , 这样得到的是“判别式模型”(discriminative models); (决策树、BP 神经网络、支持向量机等, 都可归入判别式模型的范畴)
- 可先对联合概率分布 建模, 然后再由此获得 这样得到的是“生成式模型”(generative models). (贝叶斯分类器)
对于生成模型来说,必然考虑贝叶斯定理:
其中,
- 是类“先验”(prior)概率,表达了样本空间中各类样本所占的比例, 根据大数定律, 当训练集包含充足的独立同分布样本时, 可通过各类样本出现的频率来进行估计;
- 是样本 相对于类标记 的类条件概率(class-conditional probability), 或称为“似然” (likelihood);
- 是 用于归一化的“证据”(evidence)因子。对给定样本 证据因子 与类标记无关(对所有类标记相同)。因此估计 的问题就转化为如何基于训练数据 来估计先验 和似然 。
实际上先验概率就是在没有任何结果出来的情况下估计的概率,而后验概率则是在有一定依据后的重新估计,直观意义上后验概率就是条件概率。
对类条件概率 来说,由于涉及关于 所有属性的联合概率,直接根据样本出现的频率来估计是非常困难的。例如, 假设样本的 d 个属性都是二值的, 则样本空间将有 种可能的取值, 在现实应用中, 这个值往往远大于训练样本数 m, 也就是说, 很多样本取值在训练集中根本没有出现, 直接使用频率来估计 c) 显然不可行, 因为“未被观测到”与“出现概率为 ”零” 通常是不同的。一种常用的策略是先假定类条件概率具有某种确定的概率分布形式,再基于训练样本对概率分布的参数进行估计。
7.2 极大似然法
源自频率学派的极大似然估计(Maximum Likelihood Estimation,简称MLE),是一种根据数据采样来估计概率分布的经典方法。(频率主义学派(Frequentist)认为参数虽然未知, 但却是客观存在的固定值, 因此, 可通过优化似然函数等准则来确定参数值)
具体地, 记关于类别 c 的类条件概率为 假设 具有确定的形式并且被参数向量 唯一确定, 则我们的任务就是利用训练集 估计参数 为明确起见, 我们将 记为 。
极大似然法的核心思想就是:在参数的所有可能取值当中,找到能使已知样本出现的概率(可能性)最大的值,即使得训练数据的似然最大的参数值。
令 表示训练集 中第 类样本组成的集合, 假设这些样本是独立同分布的, 则参数 对于数据集 的似然是
对 进行极大似然估计, 就是去寻找能最大化似然 的参数值 式(7.9)中的连乘操作易造成下溢, 通常使用对数似然(log-likelihood)
此时参数 的极大似然估计 为
例如, 在连续属性情形下, 假设概率密度函数 则参数 和 的极大似然估计为
也就是说, 通过极大似然法得到的正态分布均值就是样本均值, 方差就是 的均值, 这显然是一个符合直觉的结果。在离散属性情形下 , 也可通过类似的方式估计类条件概率。
所以,贝叶斯分类器的训练过程就是参数估计。总结最大似然法估计参数的过程,一般分为以下四个步骤:
* 1.写出似然函数;
* 2.对似然函数取对数,并整理;
* 3.求导数,令偏导数为0,得到似然方程组;
* 4.解似然方程组,得到所有参数即为所求。
需注意的是, 这种参数化的方法能使类条件概率估计变得相对简单, 但估计结果的准确性严重依赖于所假设的概率分布形式是否符合潜在的真实数据分布。在现实应用中, 欲做出能较好地接近潜在真实分布的假设, 往往需在一定程度上利用关于「应用任务本身的经验知识」, 否则若仅凭“猜测”来假设概率分布形式, 很可能产生误导性的结果.
7.3 朴素贝叶斯分类器
不难看出:原始的贝叶斯分类器(上述公式7.7)估计后验概率的困难点在于类条件概率是所有属性的联合概率,首先需要根据经验来假设联合概率分布;其次当属性很多时,训练样本往往覆盖不够,参数的估计会出现很大的偏差。为了避免这个问题,朴素贝叶斯分类器(naive Bayes classifier)采用了“属性条件独立性假设”(attribute conditional independence assumption),即「样本数据的所有属性之间相互独立」。这样类条件概率 可以改写为:
其中 d 为属性数目, 为 在第 个属性上的取值(实际上是属性-值 形式的键值对)
由于对所有类别来说 相同, 因此基于式(7.6)的贝叶斯判定准则有
这就是朴素贝叶斯分类器的表达式。
显然, 朴素贝叶斯分类器的训练过程就是基于训练集 来估计类先验概率 并为每个属性估计条件概率 令 表示训练集 中第 类样本组成的集合, 若有充足的独立同分布样本, 则可容易地估计出类先验概率
这样,为每个样本估计类条件概率变成为每个样本的每个属性估计类条件概率。 表示 中在第 个属性上取值为 的样本组成的集合。
相比原始贝叶斯分类器,朴素贝叶斯分类器基于单个的属性计算类条件概率更加容易操作,需要注意的是:若某个属性值在训练集中和某个类别没有一起出现过,这样会抹掉其它的属性信息,因为该样本的类条件概率被计算为0。
例如,在使用西瓜数据集 3.0 训练朴素贝叶斯分类器时, 对一个“敲声=清脆”的测试例,有
清脆是敲声清脆好瓜是
由于式( 的连乘式计算出的概率值为零, 因此, 无论该样本的其他属性是什么, 哪怕在其他属性上明显像好瓜, 分类的结果都将是“好瓜=否”, 这显然不太合理。
因此在估计概率值时,常常进行平滑(smoothing)处理,拉普拉斯修正(Laplacian correction)就是其中的一种经典方法,具体来说,令表示训练集中可能的类别数, 表示第个属性可能的取值数:
当训练集越大时,拉普拉斯修正引入的影响越来越小。拉普拉斯修正实质上假设了属性值与类别均匀分布, 这是在朴素贝叶斯学习过程中额外引入的关于数据的先验.
在现实任务中朴素贝叶斯分类器有多种使用方式。例如, 若任务对预测速度要求较高, 则对给定训练集, 可将朴素贝叶斯分类器涉及的所有概率估值事先计算好存储起来, 这样在进行预测时只需“查表”即可进行判别; 若任务数据更替频繁, 则可采用“懒惰学习” (lazy learning) 方式, 先不进行任何训练,待收到预测请求时再根据当前数据集进行概率估值; 若数据不断增加, 则可在现有估值基础上, 仅对新增样本的属性值所涉及的概率估值进行计数修正即可实现增量学习。
针对朴素贝叶斯,人们觉得它too sample,sometimes too naive!因此又提出了半朴素的贝叶斯分类器,具体有SPODE、TAN、贝叶斯网络等来刻画属性之间的依赖关系。
一个例子:
用西瓜数据集 3.0 训练一个朴素贝叶斯分奖器,
可得类先验概率为
好瓜是好瓜否
然后是每个属性的条件概率
于是
本文项目地址:
https://github.com/firewang/lingweilingyu/blob/master/contents/Machine_Learning_Zhi-Hua_Zhou.md
(喜欢的话,Star一下)
参考网址:
- 周志华 著. 机器学习, 北京: 清华大学出版社, 2016年1月.
- https://github.com/Vay-keen/Machine-learning-learning-notes
- Spring Cloud第一篇 Eureka简介及原理
- 华为面试题——约瑟夫问题的C++简单实现(循环链表)
- (49) 剖析LinkedHashMap / 计算机程序的思维逻辑
- Python多进程并行编程实践-mpi4py的使用
- 华为面试题——一道关于指针方面的编程题(C/C++)
- Spring Cloud第二篇 创建一个Eureka Server
- 数据挖掘实战(一):Kaggle竞赛经典案例剖析
- 华为面试题——单向链表倒转(一次遍历)
- Flask一步步搭建web应用
- (44) 剖析TreeSet / 计算机程序的思维逻辑
- (46) 剖析PriorityQueue / 计算机程序的思维逻辑
- (48) 剖析ArrayDeque / 计算机程序的思维逻辑
- 那些年在win下填过的Django坑
- Python爬虫一步步抓取房产信息
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一行代码如何隐藏 Linux 进程?
- SSH 只能用于远程 Linux 主机?那说明你见识太小了!
- 干货 | Trip.com 机票React Native整洁架构2.0实践
- 干货 | 日均TB级数据,携程支付统一日志框架
- 为什么 HTTPS 是安全的?
- Hello World背后的故事:如何在Linux上编译C语言程序
- 浅谈Linux的动态链接库
- 初识ABP vNext(9):ABP模块化开发-文件管理
- NIFI里你用过PutDatabaseRecord嘛?
- NIFI里的数据库连接池
- 数据抽取的常见理论方法
- 万字讲解API网关的来龙去脉
- python+GDAL+numpy,点图层提取栅格像元数据
- 继续上一次的遥感影像镶嵌,这次使用gdal_merge.py
- R海拾遗-apply家族学习