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

朴素贝叶斯

  • 一、概述
    • 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, ComplementNBh = .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 = dsX = 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() + .5x2_min, x2_max = X[:, 1].min() - .5, X[:, 1].max() + .5array1, array2 = np.meshgrid(np.arange(x1_min, x1_max, 0.2),np.arange(x2_min, x2_max, 0.2))cm = plt.cm.RdBucm_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 += 1ax = 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.targettitle = ["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.mzph.cn/news/84655.shtml

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

相关文章

Go编程规范

文章目录 注释转义符定义变量方法一:指定变量类型,声明后若不赋值,使用默认值方法二:根据值自行判定变量类型(类型推导)方法三:省略var, 注意:左侧的变量不应该是已经声明过的,否则会导致编译错误[推荐]全局…

【Redis】Redis 的学习教程(十一)之使用 Redis 实现分布式锁

1. 分布式锁概念 在多线程环境下,为了保证数据的线程安全,锁保证同一时刻,只有一个可以访问和更新共享数据。在单机系统我们可以使用 synchronized 锁、Lock 锁保证线程安全。 synchronized 锁是 Java 提供的一种内置锁,在单个 …

快速用Python进行数据分析技巧详解

概要 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以&#xff0…

leetcode543 二叉树的直径

题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 输入:root [1,2,3,4,5] 输出&#xff1…

全国职业技能大赛云计算--高职组赛题卷⑤(容器云)

全国职业技能大赛云计算--高职组赛题卷⑤(容器云) 第二场次题目:容器云平台部署与运维任务2 基于容器的web应用系统部署任务(15分)任务3 基于容器的持续集成部署任务(15分)任务4 Kubernetes容器…

web:[HCTF 2018]WarmUp

题目 点进页面&#xff0c;页面只有一张滑稽脸&#xff0c;没有其他的提示信息 查看网页源代码&#xff0c;发现source.php&#xff0c;尝试访问一下 跳转至该页面&#xff0c;页面显示为一段php代码&#xff0c;需要进行代码审计 <?phphighlight_file(__FILE__);class emm…

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18 而数据库中原始数据如下,并没有到下午5点…

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A

多线程的学习上篇

座右铭: 天行健&#xff0c;君子以自强不息;地势坤&#xff0c;君子以厚德载物. 引入进程这个概念的目的 引入进程这个概念,最主要的目的,是为了解决“并发编程"这样的问题. 这是因为CPU进入了多核心的时代 要想进一步提高程序的执行速度,就需要充分的利用CPU 的多核资源…

滑动时间窗口的思想和实现,环形数组,golang

固定时间窗口 在开发限流组件的时候&#xff0c;我们需要统计一个时间区间内的请求数&#xff0c;比如以分钟为单位。所谓固定时间窗口&#xff0c;就是根据时间函数得到当前请求落在哪个分钟之内&#xff0c;我们在统计的时候只关注当前分钟之内的数量&#xff0c;即 [0s, 60…

【大数据之Kafka】十六、Kafka集成外部系统之集成Flume

Flume 是一个在大数据开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以用于 Kafka 的消费者。 Flume安装和部署&#xff1a;https://blog.csdn.net/qq_18625571/article/details/131678589?spm1001.2014.3001.5501 1 Flume生产者 &#xff08;1&#xff09…

帆软BI开发-Day2-趋势图的多种变形

前言&#xff1a; 在BI数据展示中&#xff0c;条形图、趋势图无疑是使用场景非常多的两种图形。与条形图不同的是&#xff0c;趋势图更能反馈出一定的客观规律和未来的趋势走向&#xff0c;因此用于作为预警和判异的业务场景&#xff0c;但实际业务场景的趋势图可没你想的那么简…

华为HCIA(三)

链路本地地址接口标识64bit 当STP端口到了Forwarding状态后&#xff0c;会转发流量&#xff0c;也处理报文 在TCP/IP模型中&#xff0c;会话层&#xff0c;表示层和应用层&#xff0c;都规划成了应用层 路由表包含目的地址和掩码&#xff0c;优先级&#xff0c;cost,下一跳和…

laravel框架 - 事件与监听器

一&#xff0c;绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…

高云FPGA系列教程(10):letter-shell移植

文章目录 letter-shell简介letter-shell源码获取letter-shell移植函数和变量应用示例 本文是高云FPGA系列教程的第10篇文章。 shell&#xff0c;中文是外壳的意思&#xff0c;就是操作系统的外壳。通过shell命令可以操作和控制操作系统&#xff0c;比如Linux中的Shell命令就包括…

QT--day5

注册 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include <QMessageBox> #include<QString> #include<QSqlDatabase> …

CAN总线物理层

本文的目的并不是为了介绍或普及CAN总线相关知识,而是为了了解CAN总线,进而为CAN通信一致性测试做知识储备。 CAN,控制器局域网,全称:Controller Area Network。1986年,由德国Bosch公司为汽车开发的网络技术,主要用于汽车的监测与控制,目的为适应汽车“减少线束的数量…

1787_函数指针的使用

全部学习汇总&#xff1a;GitHub - GreyZhang/c_basic: little bits of c. 前阵子似乎写了不少错代码&#xff0c;因为对函数指针的理解还不够。今天晚上似乎总算是梳理出了一点眉目&#xff0c;在先前自己写过的代码工程中做一下测试。 先前实现过一个归并排序算法&#xff0c…

1999-2018年地级市不同所有制成分工业总产值数据

1999-2018年地级市不同所有制成分工业总产值数据 1、时间&#xff1a;1999-2018年 2、范围&#xff1a;地级市 3、指标&#xff1a;行政区划代码、城市、年份、规模以上工业企业数_全市_个、规模以上工业企业数_市辖区_个、规模以上内资企业数_全市_个、规模以上内资企业数_…

【AI视野·今日CV 计算机视觉论文速览 第250期】Wed, 20 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Wed, 20 Sep 2023 Totally 95 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers PanopticNeRF-360: Panoramic 3D-to-2D Label Transfer in Urban Scenes Authors Xiao Fu, Shangzhan Zhang, Tianrun Chen…