机器学习(18)---朴素贝叶斯

news2025/1/10 22:59:11

朴素贝叶斯

  • 一、概述
    • 1.1 概率分类器
    • 1.2 贝叶斯工作原理
    • 1.3 贝叶斯的性质
  • 二、sklearn中的朴素贝叶斯
    • 2.1 贝叶斯分类器
    • 2.2 高斯朴素贝叶斯GaussianNB
    • 2.3 探索贝叶斯:高斯朴素贝叶斯擅长的数据集
    • 2.4 探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度


一、概述

1.1 概率分类器

 1. 在许多分类算法应用中,特征和标签之间的关系并非是决定性的。比如说,我们想预测一个人究竟是否会在泰坦尼克号海难中生存下来,那我们可以建一棵决策树来学习我们的训练集。在训练中,其中一个人的特征为:30岁,男,普通舱,他最后在泰坦尼克号海难中去世了。当我们测试的时候,我们发现有另一个人的特征也为:30岁,男,普通舱。基于在训练集中的学习,我们的决策树必然会给这个人打上标签:去世。然而这个人的真实情况一定是去世了吗?并非如此。

 2. 算法得出的结论,永远不是100%确定的,更多的是判断出了一种“样本的标签更可能是某类的可能性”,而非一种“确定”。我们通过某些规定,比如说,在决策树的叶子节点上占比较多的标签,就是叶子节点上所有样本的标签,来强行让算法为我们返回一个固定结果。但许多时候,我们也希望能够理解算法判断出的可能性本身。

 3. 所以:我们都希望使用真正的概率来衡量可能性,因此就有了真正的概率算法:朴素贝叶斯。朴素贝叶斯是一种直接衡量标签和特征之间的概率关系的有监督学习算法,是一种专注分类的算法。朴素贝叶斯的算法根源就是基于概率论和数理统计的贝叶斯理论。

1.2 贝叶斯工作原理

 1. 经过概率论与数理统计的学习,我们知道贝叶斯公式为:

在这里插入图片描述
 2.(1)这个式子,就是我们一切贝叶斯算法的根源理论。我们可以把我们的特征X当成是我们的条件事件,而我们要求解的标签Y当成是我们满足条件后会被影响的结果,而两者之间的概率关系就是P(Y|X)。 (2)这个概率在机器学习中,被我们称之为是标签的后验概率(posterior probability),即是说我们先知道了条件,再去求解结果。而标签Y在没有任何条件限制下取值为某个值的概率,被我们写作P(Y),与后验概率相反,这是完全没有任何条件限制的,称为标签的先验概率(prior probability)。

 3. 我们来看看我们贝叶斯理论等式的分母P(X),我们可以使用全概率公式来求解P(X):

在这里插入图片描述

 其中m代表标签的种类,也就是说,对于二分类而言我们有:

在这里插入图片描述

1.3 贝叶斯的性质

 1. 我们之前学习的分类算法总是有一个特点:这些算法先从训练集中学习,获取某种信息来建立模型,然后用模型去对测试集进行预测。比如逻辑回归,我们要先从训练集中获取让损失函数最小的参数,然后用参数建立模型,再对测试集进行预测。在比如支持向量机,我们要先从训练集中获取让边际最大的决策边界,然后用决策边界对测试集进行预测。相同的流程在决策树,随机森林中也出现,我们在fit的时候必然已经构造好了能够让对测试集进行判断的模型。而朴素贝叶斯,似乎没有这个过程,这说明,朴素贝叶斯是一个不建模的算法。

 2. 假设,我们让X是“气温”,这就是我们的特征,Y是“七星瓢虫冬眠”,就是我们的标签。而我提出的要求“零下的时候,年龄为20天的瓢虫”就是没有标签的测试集。然后提出说,我要预测零下的时候,年龄为20天的瓢虫,会冬眠的概率,之后我们就顺理成章地算了出来。没有利用训练集求解某个模型的过程,也没有训练完毕后我们来做测试的过程,而是直接对有标签的数据提出要求,就可以得到预测结果了。

二、sklearn中的朴素贝叶斯

2.1 贝叶斯分类器

 1. sklearn为我们提供了四个朴素贝叶斯的分类器:

含义
naive_bayes.BernoulliNB伯努利分布下的朴素贝叶斯
naive_bayes.GaussianNB高斯分布下的朴素贝叶斯
naive_bayes.ComplementNB补集朴素贝叶斯
linear_model.BayesianRidge贝叶斯岭回归,在参数估计过程中使用贝叶斯回归技术来包括正则化参数

 2. 虽然朴素贝叶斯使用了过于简化的假设,但是这个分类器在许多实际情况中都运行良好,著名的是文档分类和垃圾邮件过滤。而且由于贝叶斯是从概率角度进行估计,它所需要的样本量比较少,极端情况下甚至我们可以使用1%的数据作为训练集,依然可以得到很好的拟合效果。当然,如果样本量少于特征数目,贝叶斯的效果就会被削弱。

 3. 与SVM和随机森林相比,朴素贝叶斯运行速度更快,因为求解P(Xi | Y)本质是在每个特征上单独对概率进行计算,然后再求乘积,所以每个特征上的计算可以是独立并且并行的,因此贝叶斯的计算速度比较快。不过相对的,由于假设太多,因此贝叶斯的运行效果不是那么好,所以贝叶斯的接口调用的predict_proba其实也不是总指向真正的分类结果,这一点需要注意。

2.2 高斯朴素贝叶斯GaussianNB

 1. 模块:class sklearn.naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09)

参数含义
prior可输入任何类数组结构,形状为(n_classes,),表示类的先验概率。如果指定,则不根据数据调整先验,如果不指定,则自行根据数据计算先验概率P(Y)
var_smoothing浮点数,可不填(默认值= 1e-9),在估计方差时,为了追求估计的稳定性,将所有特征的方差中最大的方差以某个比例添加到估计的方差中。这个比例,由var_smoothing参数控制

 2. 高斯朴素贝叶斯,通过假设P(Xi | Y)是服从高斯分布(也就是正态分布),来估计每个特征下每个类别上的条件概率。对于每个特征下的取值,高斯朴素贝叶斯有如下公式:
在这里插入图片描述

 3. 进行一次预测:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
digits = load_digits()
X, y = digits.data, digits.target
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=420)

gnb = GaussianNB().fit(Xtrain,Ytrain)

#查看分数
acc_score = gnb.score(Xtest,Ytest)
print(acc_score  ) #0.8592592592592593

2.3 探索贝叶斯:高斯朴素贝叶斯擅长的数据集

 从图上来看,高斯贝叶斯属于比较特殊的一类分类器,其分类效果在二分数据和月亮型数据上表现优秀,但是环形数据不太擅长。我们之前学过的模型中,许多线性模型比如逻辑回归,线性SVM等等,在线性数据集上会绘制直线决策边界,因此难以对月亮型和环形数据进行区分,但高斯朴素贝叶斯的决策边界是曲线,可以是环形也可以是弧线,所以尽管贝叶斯本身更加擅长线性可分的二分数据,但朴素贝叶斯在环形数据和月亮型数据上也可以有远远胜过其他线性模型的表现。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB, ComplementNB

h = .02
names = ["Multinomial","Gaussian","Bernoulli","Complement"]
classifiers = [MultinomialNB(),GaussianNB(),BernoulliNB(),ComplementNB()]
X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,
                           random_state=1, n_clusters_per_class=1)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)
datasets = [make_moons(noise=0.3, random_state=0),
            make_circles(noise=0.2, factor=0.5, random_state=1),
            linearly_separable
           ]
figure = plt.figure(figsize=(6, 9))
i = 1
for ds_index, ds in enumerate(datasets):
    X, y = ds
    X = StandardScaler().fit_transform(X)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4,
random_state=42)
    x1_min, x1_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    x2_min, x2_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    array1, array2 = np.meshgrid(np.arange(x1_min, x1_max, 0.2),
                                           np.arange(x2_min, x2_max, 0.2))
    cm = plt.cm.RdBu
    cm_bright = ListedColormap(['#FF0000', '#0000FF'])
    ax = plt.subplot(len(datasets), 2, i)
    if ds_index == 0:
        ax.set_title("Input data")
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train,
               cmap=cm_bright, edgecolors='k')
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test,
               cmap=cm_bright, alpha=0.6, edgecolors='k')
    ax.set_xlim(array1.min(), array1.max())
    ax.set_ylim(array2.min(), array2.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1
    ax = plt.subplot(len(datasets), 2, i)
    clf = GaussianNB().fit(X_train, y_train)
    score = clf.score(X_test, y_test)

    Z = clf.predict_proba(np.c_[array1.ravel(), array2.ravel()])[:, 1]
    Z = Z.reshape(array1.shape)
    ax.contourf(array1, array2, Z, cmap=cm, alpha=.8)
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
               edgecolors = 'k')
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
               edgecolors = 'k', alpha = 0.6)
    ax.set_xlim(array1.min(), array1.max())
    ax.set_ylim(array2.min(), array2.max())
    ax.set_xticks(())
    ax.set_yticks(())
    if ds_index == 0:
        ax.set_title("Gaussian Bayes")

    ax.text(array1.max() - .3, array2.min() + .3, ('{:.1f}%'.format(score * 100)),
            size = 15, horizontalalignment = 'right')
    i += 1
plt.tight_layout()
plt.show()

在这里插入图片描述

2.4 探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度

 1. 拟合曲线代码块:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_digits
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplit
from time import time
import datetime

#定义绘制学习曲线的函数
def plot_learning_curve(estimator,title, X, y,
                       ax, #选择子图
                       ylim=None, #设置纵坐标的取值范围
                       cv=None, #交叉验证
                       n_jobs=None #设定索要使用的线程
                       ):
  #train_sizes是每次建模后训练集上的样本数量
  train_sizes, train_scores, test_scores = learning_curve(estimator  #分类器
                                                          , X, y     #特征矩阵和标签
                                                          ,cv=cv     #交叉验证模式
                                                          ,n_jobs=n_jobs)
  #n_jobs是说每次运行时可以允许算法使用多少运算资源
  ax.set_title(title) #设置标题
  if ylim is not None:
     ax.set_ylim(*ylim)
  ax.set_xlabel("Training examples")
  ax.set_ylabel("Score")
  ax.grid() #显示网格作为背景,不是必须
  ax.plot(train_sizes, np.mean(train_scores, axis=1), 'o-'
          , color="r",label="Training score")
  ax.plot(train_sizes, np.mean(test_scores, axis=1), 'o-'
          , color="g",label="Test score")
  ax.legend(loc="best")
  return ax

#导入数据,定义循环
digits = load_digits()
X, y = digits.data, digits.target

title = ["Naive Bayes","DecisionTree","SVM, RBF kernel","RandomForest","Logistic"]
model = [GaussianNB(),DTC(),SVC(gamma=0.001)
          ,RFC(n_estimators=50),LR(C=.1,solver="lbfgs")]
cv = ShuffleSplit(n_splits=50, test_size=0.2, random_state=0)

                        #一行五列,尺寸大小
fig, axes = plt.subplots(1,5,figsize=(30,6))
for ind,title_,estimator in zip(range(len(title)),title,model): #zip是个元组
   times = time()
   plot_learning_curve(estimator, title_, X, y,
                       ax=axes[ind], ylim = [0.7, 1.05],n_jobs=4, cv=cv)
   print("{}:{}".format(title_,datetime.datetime.fromtimestamp(time()-
                         times).strftime("%M:%S:%f")))
plt.show()

在这里插入图片描述

在这里插入图片描述
 2. 在这个对比之下,我们可以看出:贝叶斯是速度很快,但分类效果一般,并且初次训练之后的结果就很接近算法极限的算法,几乎没有调参的余地。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js 实现导出模型文件(.glb,.gltf)功能 GLTFExporter

Three.js提供了导出(.glb,.gltf)文件的API GLTFExporter 用于实现场景内容导出模型文件的功能 导出模型文件主要使用 parse 方法,该方法接收三个参数: 1.scene:要导出的场景对象。 2.onComplete:解析完成…

Deformable DETR(2020 ICLR)

Deformable DETR(2020 ICLR) detr训练epochs缩小十倍,小目标性能更好 Deformable attention 结合变形卷积的稀疏空间采样和Transformer的关系建模能力 使用多层级特征层特征,不需要使用FPN的设计(直接使用backbone多层级输出&a…

cgroup version jdk version k8s

bug info: in centos, linux 3.10, cgroup:v1, service works well. in ubuntu 22.04 LTS, linux 5, systemd:v2, service is always crash on boot, or running some minutes then killed by OOM. deploy.yaml文件相关内容: specify limits:memory 1000M in yaml, killed …

区域气象-大气化学在线耦合模式(WRFChem)在大气环境领域实践技术应用

随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果,同时气象因…

Redis缓存相关问题

目录 缓存穿透 缓存雪崩 缓存击穿 Redis集群方案 主从复制Replication 哨兵sentinel 高可用介绍 Redis sentinel介绍 Redis sentinel使用 配置sentinel 启动sentinel 测试sentinel Redis内置集群cluster Redis cluster介绍 哈希槽方式分配数据 Redis cluster的…

ubuntu18.04 编译edk2项目下的intel架构bios

看了国内的edk2编译文章. 大不部分都是编译 用于虚拟机(qemu)或者模拟器上运行的 很少有编译edk2项目 出 真机的 bios 希望本文章对你有帮助, 请注意 github,com因为被墙了. 所有需要用gitee代替 参考来源 https://gitee.com/binout/edk2-platforms/tree/master https:/…

PHP8的类与对象的基本操作之类常量-PHP8知识详解

php 8引入了一种新的特性,称为类常量(class Constants)。类常量是在类中定义的常量,类似于全局常量,但作用域仅限于定义它们的类。 在PHP 8中,类常量的作用域被限制在定义它们的类中。这意味着只有类的成员…

【配电变电站的最佳位置和容量】基于遗传算法的最优配电变电站放置(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

uploadifive上传工具php版使用

uploadifive自带的DEMO文件。 下载地址&#xff1a; http://www.uploadify.com/download/ <!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>UploadiFive Test&…

C4BUILDER—用于构建C4模型图的Web项目

c4builder是什么&#xff1f; c4builder&#xff1a; 字面理解是产生C4架构图的构建器。 c4builder是一个轻量级的nodejscli工具&#xff0c;用于仅使用文本构建、维护和共享软件体系结构项目。 c4builder是一种架构设计工具&#xff0c;可以帮助开发人员和架构师描述和可视化…

结合购物车功能,了解RedisTemplate中的BoundHashOperations源码

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

零代码编程:用ChatGPT批量删除文件名称中的部分内容

要批量删除文件名称中的某些特定字符&#xff0c;可以在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个文件重命名的任务。具体步骤如下&#xff1a; 本地电脑&#xff1a;E:\peppa4 文件夹下有很多mp4文件&#xff0c;比如Peppa Pig Season…

轮换对称性

二重积分 普通对称性–D关于 y x yx yx对称&#xff1a; ∬ D f ( x , y ) d σ { 2 ∬ D 1 f ( x , y ) d σ f ( x , y ) f ( y , x ) 0 f ( x , y ) − f ( y , x ) \iint_{D}f(x,y)d\sigma\begin{cases} 2\iint_{D_1}f(x,y)d\sigma\ \ \ \ \ \ f(x,y)f(y,x) \\ 0 \ \…

每天几道Java面试题:IO流(第五天)

目录 第五幕 、第一场&#xff09;街边 友情提醒 背面试题很枯燥&#xff0c;加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。 第五幕 、 第一场&#xff09;街边 【衣衫褴褛老者&#xff0c;保洁阿姨&#xff0c;面试者老王】 衣衫褴褛老…

ATFX汇市:美联储宣布维持利率不变,鲍威尔继续发表鹰派言论

ATFX汇市&#xff1a;今日凌晨02:00&#xff0c;美联储公布9月利率决议结果&#xff0c;宣布维持5.25%5.5%的联邦基金利率区间不变。2:002:05&#xff0c;美元指数从最低104.75飙涨至最高105.21&#xff0c;对应EURUSD的汇率从最高1.0727下跌至最低1.0674&#xff0c;跌幅53基点…

如何将 Transformer 应用于时间序列模型

在机器学习的广阔前景中&#xff0c;transformers 就像建筑奇迹一样高高耸立&#xff0c;以其复杂的设计和捕获复杂关系的能力重塑了我们处理和理解大量数据的方式。 自 2017 年创建第一个 Transformer 以来&#xff0c;Transformer 类型呈爆炸式增长&#xff0c;其中包括 Chat…

VS|vs2017跨平台编译linuxC++ConsoleQtGUI

未完成 待更新 文章目录 首先安装vs时要勾选上使用C的Linux开发使用Vs2017创建跨平台C Console项目配置Vs的SSH连接 Debug >> Option >> Cross Plaform文件加入到Linux项目&#xff0c;使用Windows下的文件即可。将所有项目包含.CPP、.h文件包含进Linux项目设置项…

案例丨如何提升可视化分析能力?听听这两家企业怎么说

神策分析 2.5 版本正式发布经营分析能力以来&#xff0c;已有不少客户接入使用&#xff0c;并充分实现了可视化分析能力的提升。 本文将为大家分享两家客户的真实反馈&#xff0c;希望能够帮助您进一步了解神策经营分析的能力。 案例一&#xff1a;神策数据助力美篇打造公司级“…

Linux学习之gdb的使用

目录 1.Debug与Release模式 如何证明debug是可以被调试的&#xff1f; 2.Linux调试器-gdb使用 gdb调试的指令 指令一&#xff1a;list&#xff08;l&#xff09; 查看源代码 编辑 ​编辑 命令二&#xff1a;run&#xff08;r&#xff09;运行程序 命令三&#xff…

mall电商项目(学习记录1)

1.简介 mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署。前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。后台管理系统包含商品管理、订单管…