【机器学习】贝叶斯分类器(算法原理实现及sklearn实现)

2023-10-29

系列文章目录

第一章 先验概率和后验概率的通俗解释(贝叶斯分类)
第二章 贝叶斯公式证明及Bayesain在机器学习重要地位的理解
第三章 【机器学习】贝叶斯分类器



前沿

  贝叶斯分类器作为“生成式模型”可处理多分类问题,在数据较少的情况下依然有效,本文介绍了算法原理推导及基于算法原理的代码实现与基于sklearn包的代码实现。

一、贝叶斯决策论

  贝叶斯决策论是概率框架下实施决策的基本方法,对于分类任务,在所有相关概率都已知的理想情形下,该方法考虑如何基于这些概率和误判损失来选择最优的类别标记。
  假设有 N 中可能的类别标记,即 y = ( c 1 , c 2 , . . . , c N ) , λ i j y=(c_1,c_2,...,c_N),\lambda_{ij} y=(c1,c2,...,cN),λij是将一个真实标记为 c j c_{j} cj的样本误分类为 c i c_i ci所产生的损失。基于后验概率 P ( c i ∣ x ) P(c_i|x) P(cix)可获得将样本 x x x分类为 c i c_i ci所产生的期望损失,即在样本 x x x上的“条件风险”
R ( c i ∣ x ) = ∑ j = 1 N λ i j P ( c j ∣ x ) R(c_i|x)=\sum^{N}_{j=1}\lambda_{ij}P(c_j|x) R(cix)=j=1NλijP(cjx)  在一次分类过程中我们希望分类结果尽可能接近真实值,即要求总体的期望损失最小,这就产生了贝叶斯判别准则:为最小化总体风险,只需在每个样本上选择那个能使条件风险 R ( c ∣ x ) R(c|x) R(cx)最小的类别标记,即
h ∗ ( x ) = a r g c ∈ y m i n R ( c ∣ x ) h^*(x)=arg_{c\in y}minR(c|x) h(x)=argcyminR(cx)  此时, h ∗ h^* h称为贝叶斯最优分类器,与之对应的总体风险 R ( h ∗ ) R(h^*) R(h)称为贝叶斯风险。 1 − R ( h ∗ ) 1-R(h^*) 1R(h)反映了分类器所能达到的最好性能,即通过机器学习所能产生的模型精度的理论上限。其中,贝叶斯风险 R ( h ) R(h) R(h)
R ( h ∗ ) = E x [ R ( h ∗ ( x ) ∣ x ) ] R(h^*)=E_x[R(h^*(x)|x)] R(h)=Ex[R(h(x)x)]若目标是最小化分类错误率,则误判损失 λ i j \lambda_{ij} λij可写为
λ i j = { 0 , i = j ; 1 , o t h e r w i s e \lambda_{ij} = \{ \begin{array}{rcl} 0, & i=j;\\ 1, &otherwise\end{array} λij={0,1,i=j;otherwise此时的条件风险 R ( c ∣ x ) = ∑ j = 1 N λ i j P ( c j ∣ x ) = ∑ j ≠ i N λ i j P ( c j ∣ x ) + 0 = 1 − P ( c ∣ x ) R(c|x)=\sum^N_{j=1}\lambda_{ij}P(c_j|x)\\ =\sum^N_{j\neq i}\lambda_{ij}P(c_j|x)+0=1-P(c|x) R(cx)=j=1NλijP(cjx)=j=iNλijP(cjx)+0=1P(cx)于是,最小化分类错误率的贝叶斯最优分类器为 h ∗ ( x ) = a r g c ∈ y m a x P ( c ∣ x ) h^*(x)=arg_{c\in y}maxP(c|x) h(x)=argcymaxP(cx)  对于分类器的构建关键在于对当前样本后验概率的确定。即对每个样本 x x x,选择能使后验概率 P ( c ∣ x ) P(c|x) P(cx)最大的类别标记。对生成式模型来说,必然考虑联合概率分布 P ( x , c ) P(x,c) P(x,c)
P ( c ∣ x ) = P ( x , c ) P ( x ) P(c|x)=\frac{P(x,c)}{P(x)} P(cx)=P(x)P(x,c)  基于贝叶斯定理 P ( c ∣ x ) P(c|x) P(cx)可写为
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) P(c|x)=\frac{P(c)P(x|c)}{P(x)} P(cx)=P(x)P(c)P(xc)  对给定的样本 x x x,证据因子 P ( x ) P(x) P(x)与类标记无关,因此估计 P ( c ∣ x ) P(c|x) P(cx)的问题就转化为如何基于训练数据 D D D来估计先验 P ( c ) P(c) P(c)和类条件(似然) P ( x ∣ c ) P(x|c) P(xc)
  类先验概率 P ( c ) P(c) P(c)代表了样本空间中各类样本所占的比例,根据大数定律,当训练集包含充足的独立同分布样本时, P ( c ) P(c) P(c)可通过各类样本出现的频率来进行估计。
  对于类条件概率 P ( x ∣ c ) P(x|c) P(xc)来说,由于它涉及关于 x x x所有属性的联合概率,直接根据样本出现的概率来估计将会遇到严重的困难。即 P ( x ∣ c ) = x , c 同时发生次数 c 发生次数 = x 1 , x 2 , . . . , x d , c 同时发生的次数 c 发生的次数 P(x|c)=\frac{x,c同时发生次数}{c发生次数}=\frac{x_1,x_2,...,x_d,c同时发生的次数}{c发生的次数} P(xc)=c发生次数x,c同时发生次数=c发生的次数x1,x2,...,xd,c同时发生的次数分子很多情况下在训练集中根本没有出现,直接使用频率来估计 P ( x ∣ c ) P(x|c) P(xc)显然不可行,因为“未被观测到”与“出现概率为零”通常不同。

二、极大似然估计

  估计类条件概率的一种常用策略是先假定其具有某种确定的概率分布形式,再基于训练样本对概率分布的参数估计。具体地,记关于类别 c c c的类条件概率为 P ( x ∣ c ) P(x|c) P(xc),假设 P ( x ∣ c ) P(x|c) P(xc)具有确定的形式并且被参数向量 θ c \theta_c θc唯一确定,则我们的任务就是利用训练集 D D D估计参数 θ c \theta_c θc.为明确起见,将 P ( x ∣ c ) P(x|c) P(xc)记为 P ( x ∣ θ c ) P(x|\theta_c) P(xθc).
  令 D c D_c Dc表示训练集 D D D中第 c c c样本组成的集合,假设这些样本是独立同分布的,则参数 θ c \theta_c θc对于数据集 D c D_c Dc的似然是
P ( D c ∣ θ c ) = ∏ x ∈ D c P ( x ∣ θ c ) P(D_c|\theta_c) = \prod_{x\in D_c}P(x|\theta_c) P(Dcθc)=xDcP(xθc)  对 θ c \theta_c θc进行极大似然估计,就是去寻找能最大化似然 P ( D c ∣ θ c ) P(D_c|\theta_c) P(Dcθc)的参数值 θ ^ c . \widehat\theta_c. θ c.直观上看,极大似然估计是试图在 θ c \theta_c θc所有可能的取值中,找到一个能使数据出现的“可能性”最大的值。

三、朴素贝叶斯

  基于贝叶斯公式来估计后验概率 P ( c ∣ x ) P(c|x) P(cx)的主要困难在于:类条件概率 P ( x ∣ c ) P(x|c) P(xc)是所有属性上的联合概率,难以从有限的训练样本直接估计而得。为避开这个障碍,朴素贝叶斯分类器采用了“属性条件独立性假设”:对已知类别,假设所有属性相互独立。换言之,假设每个属性独立地对分类结果产生影响。
  基于属性条件独立性假设,后验概率 P ( c ∣ x ) P(c|x) P(cx)可重写为:
P ( c ∣ x ) = P ( c ) P ( x ∣ c ) P ( x ) = P ( c ) P ( x ) ∏ i = 1 d P ( x i ∣ c ) P(c|x)=\frac{P(c)P(x|c)}{P(x)}=\frac{P(c)}{P(x)}\prod^d_{i=1}P(x_i|c) P(cx)=P(x)P(c)P(xc)=P(x)P(c)i=1dP(xic)其中 d d d为属性数目, x i x_i xi x x x在第 i i i个属性上的取值。
  由于对所有类别来说 P ( x ) P(x) P(x)相同,因此基于贝叶斯判定准则有
h n b ( x ) = a r g c ∈ y m a x P ( c ) ∏ i = 1 d P ( x i ∣ c ) h_{nb}(x)=arg_{c\in y}maxP(c)\prod_{i=1}^dP(x_i|c) hnb(x)=argcymaxP(c)i=1dP(xic)这就是朴素贝叶斯分类器的表达式。
  显然,朴素贝叶斯分类器的训练过程就是基于训练集 D D D来估计类先验概率 P ( c ) P(c) P(c),并为每个属性来估计条件概率 P ( x i ∣ c ) P(x_i|c) P(xic).
  令 D c D_c Dc表示训练集 D D D中第 c c c类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率
P ( c ) = D c D P(c)=\frac{D_c}{D} P(c)=DDc对离散属性而言,令 D c , x i D_{c,x_i} Dc,xi表示 D c D_c Dc中在第 i i i各属性上取值为 x i x_i xi的样本组成的集合,则条件概率 P ( x i ∣ c ) P(x_i|c) P(xic)可估计为
P ( x i ∣ c ) = ∣ D c , x i ∣ D c P(x_i|c)=\frac{|D_{c,x_i}|}{D_c} P(xic)=DcDc,xi对连续属性可考虑概率密度函数,假定 p ( x i ∣ c ) ∼ N ( μ c , i , σ c , i 2 ) p(x_i|c) \sim N(\mu_{c,i},\sigma^2_{c,i}) p(xic)N(μc,i,σc,i2),其中 μ c , i \mu_{c,i} μc,i σ c , i 2 \sigma^2_{c,i} σc,i2分别是第 c c c类样本在第 i i i各属性上取值的均值和方差,则有
P ( x i ∣ c ) = 1 2 π σ c , i exp ⁡ ( − ( x i − μ c , i ) 2 2 σ c , i 2 ) P(x_i|c) = \frac{1}{\sqrt{2\pi}\sigma_{c,i}}\exp(-\frac{(x_i-\mu_{c,i})^2}{2\sigma^2_{c,i}}) P(xic)=2π σc,i1exp(2σc,i2(xiμc,i)2)

四、拉普拉斯修正

  在计算条件概率 ∏ i = 1 d P ( x i ∣ c ) \prod_{i=1}^dP(x_i|c) i=1dP(xic)时,会出现样本的属性值在训练集中未出现,导致条件概率相乘时最终值为0,为避免其他属性携带的信息被训练集中出现的属性值“抹去”,在估计概率值时通常要进行“平滑”,常用“拉普拉斯修正”,即令 N N N表示训练集 D D D中可能的类别数, N i N_i Ni表示第 i i i个属性可能的取值数,则其修正为:
P ^ ( c ) = ∣ D c ∣ + 1 ∣ D ∣ + N , P ^ ( x i ∣ c ) = ∣ D c , x i ∣ + 1 ∣ D c ∣ + N i . \widehat P(c)=\frac{|D_c|+1}{|D|+N},\\ \\ \widehat P(x_i|c)=\frac{|D_{c,x_i}|+1}{|D_c|+N_i}. P (c)=D+NDc+1,P (xic)=Dc+NiDc,xi+1.

五、朴素贝叶斯分类实践

数据集描述:
文件名称:data_bayesian.xlsx
sheet名称及描述:X_test (718,64);X_train (1079,64);y_test(718,1),10种类别;y_train(1079,1),10种类别。

问题描述:结合上述数据,构建贝叶斯分类器,评估模型性能,给出训练精度和测试精度。

基于理论算法的模型搭建

import scipy.stats as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

X_test = pd.read_excel("...\data_bayesian.xlsx",sheet_name="X_test",header=None)
X_train = pd.read_excel("...\data_bayesian.xlsx",sheet_name="X_train",header=None)
y_test = pd.read_excel("...\data_bayesian.xlsx",sheet_name="y_test",header=None)
y_train = pd.read_excel("...\data_bayesian.xlsx",sheet_name="y_train",header=None)

# 创建10*64未初始化的矩阵,存储每列不同类型的均值
x_mean = np.empty([10, 64], dtype=float)
# 取出不同类别下的数据 求出求出均值
for i in range(10):
    x_mean[i][:] = X_train.loc[(y_train == i).values].mean()

# 创建10*64未初始化的矩阵,存储每列不同类型的方差
x_std = np.empty([10, 64], dtype=float)
# 取出不同类别下的数据 求出求出方差
for j in range(10):
    x_std[j][:] = X_train.loc[(y_train == j).values].std()

# 创建10*64*718未初始化矩阵,存储 X_train 单个样本各维度在不同类别下的概率;
## np.empty()
x_pro = np.empty([718, 10, 64], dtype=float)

# 循环所有样本
for m in range(718):
    # 循环所有维度
    for n in range(64):
        # 循环所有类别
        for q in range(10):
            # 计算当前概率        
            x_pro[m][q][n] = float(np.exp(-(float(X_test.loc[m,n])-x_mean[q][n])**2/(2*(x_std[q][n]**2)+0.001)/(np.sqrt(2*np.pi)*x_std[q][n]+0.001)))
            
def get_predict(x_pro):
    y_pre = np.empty([x_pro.shape[0],1], dtype= float)
    for i in range(x_pro.shape[0]):
        y_pre[i] = np.argmax(np.prod(x_pro[i], axis= 1))
    return y_pre
    
def predict_score(y_test, y_pre):
    predict_score = (get_predict(x_pro) == y_test.values).sum()/y_test.size
    return predict_score

y_pre = get_predict(x_pro)
print(f"朴素贝叶斯模型预测得分:{predict_score(y_test, y_pre)}")

朴素贝叶斯模型预测得分:0.8927576601671309

基于Sklearn包的模型搭建

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
# 构建朴素贝叶斯分类器(默认高斯分布)
clf = GaussianNB()
clf.fit(X_train, np.hstack(y_train.values))

#计算模型得分
clf.score(X_train, np.hstack(y_train.values))
0.8841519925857275

#计算预测得分
y_pre = clf.predict(X_test)
accuracy_score(y_test, y_pre)
0.8523676880222841

总结

  贝叶斯分类器作为“生成式模型”可处理多分类问题,在数据较少的情况下依然有效,但其有几个特别需要注意的点,后续学习研究可往这方面探索。

  1. 朴素贝叶斯的前提条件是各属性独立同分布,但在现实中很多数据存在关联性;
  2. 属性不一定符合正态分布,需要对数据的分布进行探索 ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【机器学习】贝叶斯分类器(算法原理实现及sklearn实现) 的相关文章

随机推荐

  • 算法小白的自我总结

    2018年10月26号 觉得该把这段时间做一下总结了 大概包括心理变化方面 找工作方面吧 csdn为什么没有表情可以用 并且终于在上线新版之后变得没有那么多bug了 快捷键也能用了 界面看起来还可以 为什么把标志性的红色不见了 红色变成了蓝
  • 使用jquery对输入框内容设置自动校验,只允许数字的输入

    目的 对input输入框的内容进行校验 js的方法 keyup 对键盘的进行监控的事件 正则表达式 d g 原理 就是在输入框添加一个 触发事件 对输入框的内容进行判断 过程遇到问题 js和jquery获取值的方法 value是js获取值的
  • 2021-04-28 Mac上插入公式的三种方法

    文章目录 在线方案 自带的Pages更好用 KLatexformular 在线方案 很多网站可以在线编辑 然后下载图片 给一个我用的链接 https latex codecogs com legacy eqneditor editor ph
  • 整型数据在内存中的存储方式大解密

    提示 先赞后看 养成习惯 文章目录 前言 一 原码 反码 补码 二 体验 存 数据的过程 小小的总结一下 三 体验 取 数据的过程 什么是大小端 如何验证一个机器是大端还是小端的存储模式呢 为什么会有大小端之分呢 取 数据 整型数据范围 前
  • 时序预测

    时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 目录 时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍
  • 获取application.yml文件中配置参数的两个方法

    application yml文件内容 第一种 适用于获取少量配置参数 Value man name private String name 第二种 适用于获取大批量配置参数 第一步 整合pom xml文件
  • 操作系统的调度基础

    操作系统的cpu调度 把内核线程当成内核中的一个进程去理解 任务系统的三个核心特征是 权限分级 数据隔离和任务切换 以X86 64架构为例 权限分级通过CPU的多模式机制和分段机制实现 数据隔离通过分页机制实现 任务切换通过中断机制和任务机
  • Java类与接口、类与类之间的六种关系及UML表示

    转自点击打开链接 一 继承关系 继承指的是一个类 称为子类 子接口 继承另外的一个类 父类 父接口 的功能 并可以增加它自己的新功能的能力 在java中继承关系通过关键字extends明确标识 在设计时一般没有争议性 在UML类图设计中 继
  • 10款炫酷的HTML5动画特效,附源码

    HTML5确实非常强大 很多时候我们可以利用HTML5中的新技术实现非常炫酷效果时 这些效果也非常消耗电脑的CPU 但是这些HTML5效果确实能给用户带来不一样的用户体验 今天我要跟大家分享一些HTML5实现的惊艳特效 希望你可以喜欢 1
  • Docker运行容器端口映射

    大致描述 我发现docker启动容器时 以redis为例 在已经启动了一个 p 6379 6379的redis1容器后 当我们开启第二个redis2容器时 右边的端口映射既可以写别的我们想要映射的端口 p 6380 6380 redis2
  • 如何初始化使用中断

    概念 中断向量 中断服务程序的入口地址 首地址 中断向量表 系统中RAM或ROM的一个区域 用于存储各种中断向量的首地址 其大小取决于CPU支持的中断类型和数量 中断优先级 多个中断源同时向CPU申请中断 为了能够有序地处理多个中断申请所以
  • 感悟2022年:玫琳凯公布今年上半年以来的奖项、里程碑和成就

    玫琳凯公司获得30个奖项 其中包括10个雇主奖 凭借卓越的商业表现 社会影响 倡导参与和可持续发展努力而获得认可 玫琳凯公司 Mary Kay Inc 正在感悟2022年的成就 今年上半年 这家标志性的全球创业公司进一步推进皮肤科学创新 继
  • RxODE 包的使用 (CPT tutorial paper part 1)

    本文基于tutorial paper Wang W Hallow KM James DA A Tutorial on RxODE Simulating Differential Equation Pharmacometric Models
  • MIPI-DSI 三种 Video Mode 理解

    D PHY的物理层支持HS High Speed 和LP Low Power 两种工作模式 HS模式 低压查分信号 功耗大 高速率 80M 1Gbps 信号幅值 100mv 300mv LP模式 单端信号 功耗小 速率低 lt 10Mbps
  • QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法)

    目录 一 创建行表头 二 往表格里插入单元项 带图片和不带图片 三 禁止表格可编辑 四 按行或列或单个选择单元项 五 设置列宽 包括列表头的和行表头的 1 这个普通的行和列都可以设置固定宽高 2 还可以将行和列的大小设为与内容相匹配 3 不
  • 《信号与系统》解读 第1章 信号与系统概述-2:时域信号的分类--确定性信号、离散信号、周期信号、线性信号、基本信号与复合信号

    目录 1 确定性信号与随机信号 2 连续信号与离散信号 3 周期信号与非周期信号 4 线性信号与非线性信号 5 基本信号与复合信号 5 1 单位阶跃信号 基本的数字信号 5 2 单位斜变信号 基本的数字积分 5 3 自然指数信号 信号的自然
  • Python 数据分析实战案例:基于电商销售数据的 RFM 模型构建

    目录 1 背景 2 分析目标 3 数据准备 4 数据清洗 4 1 查看是否含有缺失值 4 2 查看是否有异常值 4 3 数据整理 5 具体目标分析 5 1 分析每年销售额的增长率 5 2 各个地区分店的销售额 5 3 销售淡旺季分析 5 4
  • redis过期策略

    我们使用redis的时候一般会设置过期时间 redis设置过期时间 expire 只针对顶级key有效 即哈希结构不支持过期 value为hash结构的时候 不能对hash中的某一部分进行过期设置 expire key time 以秒为单位
  • PCL 环境下安装配置CGAL 5.5

    目录 一 CGAL简介 二 Using CGAL on Windows with Visual C 1 CGAL下载 2 GMP和MPRF安装 3 boost安装与环境变量设置 三 PCL环境下配置CGAL 四 测试代码 五 结果展示 一
  • 【机器学习】贝叶斯分类器(算法原理实现及sklearn实现)

    系列文章目录 第一章 先验概率和后验概率的通俗解释 贝叶斯分类 第二章 贝叶斯公式证明及Bayesain在机器学习重要地位的理解 第三章 机器学习 贝叶斯分类器 文章目录 系列文章目录 前沿 一 贝叶斯决策论 二 极大似然估计 三 朴素贝叶