机器学习(五) -- 监督学习(3) -- 朴素贝叶斯

news2024/10/6 8:25:37

系列文章目录及链接

目录

前言

一、朴素贝叶斯通俗理解及定义

二、原理理解及公式

1、概率基础

2、贝叶斯公式

3、拉普拉斯平滑系数

三、**算法实现

四、接口实现

1、新闻数据集介绍

2、API

3、流程

3.1、获取数据

3.2、数据预处理

3.3、特征工程

3.4、朴素贝叶斯模型训练

3.5、模型评估

3.6、结果预测

4、优缺点


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。


一、朴素贝叶斯通俗理解及定义

1、什么叫朴素贝叶斯(What)

朴素贝叶斯是一种分类算法,经常被用于文本分类,它的输出结果是某个样本属于某个类别的概率

朴素:之所以朴素,就在于假定了特征与特征相互独立。(这样有些概率才有可计算性)

贝叶斯:数学中的贝叶斯公式。

2、朴素贝叶斯的目的(Why)

通过贝叶斯公式计算样本属于某个类别的概率。从而确定其分类。

3、怎么做(How)

通过求得先验概率得到所求概率。

二、原理理解及公式

1、概率基础

正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸出黑球的概率是多大?

逆向概率:事先不知道袋子里面黑白球的比例,闭着眼睛摸出一个或者好几个球,观察取出来的球的颜色后,我们可以对袋子里面的黑白球的比例作出什么样的预测?

---

边缘概率(先验概率):某个事件发生的概率。(边缘分布命名原因是因为它出现在概率分布表格的边缘)在联合概率中,把最终结果中那些不需要的事件通过合并成它们的全概率,而消去它们,这称为边缘化(marginalization)。

联合概率:含多个条件,且所有条件同时成立的概率。

条件概率(后验概率):事件A在另一个事件B已经发生条件下的发生概率。

相互独立:两事件联合概率等于两事件边缘概率之积,则他们相互独立。

2、贝叶斯公式

通过案例 “ 判断女神对你的喜欢情况 ”理解:

问题:

被女神喜欢的概率?                                    P(喜欢)=4/7
职业是程序员并且体型匀称的概率?                      P(程序员,匀称)=1/7
在女神喜欢的条件下,职业是程序员的概率?              P(程序员|喜欢)=2/4=1/2
在女神喜欢的条件下,职业是程序员、体重超重的概率?    P(程序员,超重|喜欢)=1/4

小明被女神喜欢的概率?                               P(喜欢|产品,超重)=?

这里就需要用到贝叶斯公式:

P(喜欢|产品, 超重) = P(产品,超重|喜欢)P(喜欢) / P(产品,超重)

计算可以发现:

P(产品,超重|喜欢) 和 P(产品,超重) 的结果均为0,导致无法计算结果。这是因为我们的样本量太少了,不具有代表性。
本来现实生活中,肯定是存在职业是产品经理并且体重超重的人的,P(产品,超重)不可能为0;
而且事件职业是产品经理和事件体重超重通常被认为是相互独立的事件,但是,根据我们有限的7个样本计算 P(产品,超重) = P(产品)P(超重) 不成立。

而朴素贝叶斯可以帮助我们解决这个问题:

简单理解,就是假定了特征与特征之间相互独立的贝叶斯公式。

所以小明被女神喜欢的概率可以这样算:

P(产品, 超重) = P(产品) * P(超重) = 2/7 * 3/7 = 6/49
p(产品, 超重|喜欢) = P(产品|喜欢) * P(超重|喜欢) = 1/2 * 1/4 = 1/8
P(喜欢|产品, 超重) = P(产品, 超重|喜欢)P(喜欢)/P(产品, 超重) = 1/8 * 4/7 / 6/49 = 7/12

3、拉普拉斯平滑系数

拉普拉斯平滑是为了解决零概率的问题。假定训练样本很大时,每个分量x的计数加1造成的估计概率变化可以忽略不计,但可以方便有效的避免零概率问题。

贝叶斯公式应用在文章分类中,可以这样看:

案例理解:
需求:通过前四个训练样本(文章),判断第五篇文章,是否属于China类

应用贝叶斯公式计算测试集,简化后应该是如下结果:

 当是China类的概率为3/4,和不是china类的概率1/4。

当是China类和不是china类的概率是不变的,分别是6/11,1/11,1/11。

所以我们需要计算的就是。且需要分别计算是China类和不是china类的概率。

 

# 计算是China类的概率: 
P(Chinese|C) = 5/8        # 是china类,共8词,5个Chinese
P(Tokyo|C) = 0/8
P(Japan|C) = 0/8

 

# 计算不是China类的概率:
P(Chinese|C) = 1/3
P(Tokyo|C) = 1/3
P(Japan|C) = 1/3

 从上面我们可以得到, 都是0,这是不合理的。如果词频列表里面有很多次数都为0,很可能计算结果都为0。所以需要用到拉普拉斯平滑系数。

利用拉普拉斯平滑系数 解决后:

# m=6(训练集中特征词的个数,重复不计)

是China类的概率:
    P(Chinese|C) = 5/8 --> 6/14
    P(Tokyo|C) = 0/8 --> 1/14
    P(Japan|C) = 0/8 --> 1/14

不是China类的概率: 
    P(Chinese|C) = 1/3 --> 2/9
    P(Tokyo|C) = 1/3 --> 2/9
    P(Japan|C) = 1/3 --> 2/9

代入公式得到:

[P(Chinese|C)^3 * P(Tokyo|C) * P(Japan|C) * P(C)] / [P(Chinese)^3 * P(Tokyo) * P(Japan)]

# 是china类
=[(6/14)^3 * (1/14) * (1/14) * (3/4)] / [(6/11)^3 * (1/11) * (1/11)]
=(3*11^5)/(4*14^5)

# 不是china类
=[(2/9)^3 * (2/9) * (2/9) * (3/4)] / [(6/11)^3 * (1/11) * (1/11)]
=(22^5)/(4*6^3*3^9)

三、**算法实现

四、接口实现

1、新闻数据集介绍

sklearn20类新闻分类,20个新闻组数据集包含20个主题的18000个新闻组帖子。

from sklearn.datasets import fetch_20newsgroups

# 获取数据
news = fetch_20newsgroups(subset='all',data_home='data')



print("新闻数据集的键:",news.keys())

print(len(news.data))
print(len(news.target))
print(len(news.target_names))

print(news.target_names)

2、API

sklearn.naive_bayes.MultinormalNB(alpha=1.0)
 
导入:
from sklearn.naive_bayes import MultinormalNB
 
语法:
mlt=MultinormalNB(alpha=1.0)
    alpha:拉普拉斯平滑系数


mlt.fit( x_train,y_train ):接收训练集特征和训练集目标
mlt.predict( x_test ):接收测试集特征,返回数据的类标签
mlt.score(x_test, y_test):接收测试集特征 和 测试集目标,返回准确率。
mlt.get_params():获取接收的参数(alpha、fit_prior这种参数)
mlt.set_params():设置参数
mlt.partial_fit():增量测试,用于数据量太大不能一次装入内存的情况,

3、流程

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.naive_bayes import MultinomialNB

3.1、获取数据

# 获取数据
news = fetch_20newsgroups(subset='all',data_home='data')

3.2、数据预处理

# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=1473)

3.3、特征工程

# 对数据集进行特征抽取
tf = TfidfVectorizer()

# 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
x_train = tf.fit_transform(x_train)

x_test = tf.transform(x_test)

3.4、朴素贝叶斯模型训练

# 进行朴素贝叶斯算法的预测,alpha是拉普拉斯平滑系数
mlt = MultinomialNB(alpha=1.0)

print(x_train.toarray())
# 训练
mlt.fit(x_train, y_train)

3.5、模型评估

y_predict = mlt.predict(x_test)

print("预测的文章类别为:", y_predict)

# 得出准确率
print("准确率为:", mlt.score(x_test, y_test))

 

用分类报告【详情请看机器学习(四) -- 模型评估(2)-分类报告】

from sklearn.metrics import classification_report
print(classification_report(y_test, y_predict, target_names=news.target_names))

精确率(precision)、召回率(recall)、F1 值(F1-score)和样本数目(support)

用ROC曲线和AUC

from sklearn.metrics import roc_curve

fpr,tpr,thresholds=roc_curve(y_test,y_predict)
 
plt.plot(fpr, tpr)
plt.axis("square")
plt.xlabel("假正例率/False positive rate")
plt.ylabel("正正例率/True positive rate")
plt.title("ROC curve")
plt.show()

from sklearn.metrics import roc_auc_score

# 把0-19总计20个分类,变为0和1
y_test = np.where(y_test == 0, 1, 0)
y_predict = np.where(y_predict == 0, 1, 0)
# roc_auc_score的y_test只能是二分类,针对多分类如何计算AUC
print("AUC指标:", roc_auc_score(y_test, y_predict))

3.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

4、优缺点

4.1、优点:

  • 朴素贝叶斯有稳定的分类效率
  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类
  • 分类准确度高,速度快

4.2、缺点:

  • 由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好
  • 需要计算先验概率,而先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳;

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

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

相关文章

芯课堂 | JScope虚拟示波器使用说明

​1. 首先需要安装Jlink的驱动,即安装JLink_Windows_V634e之后才能安装JScope,一般这个能正常使用Jlink下载、仿真说明你的Jlink驱动已经正常安装 2. 需要安装Jscope,即安装Setup_JScope_V611m,安装完成之后能看到以下画面 3. 新建…

TypeScript 泛型工具类型

文章目录 前言Partial(可选)代码解读 Readonly代码解读 Pick代码解读 Record代码解读 ---上面是常用的&#xff0c;下面是不常用的&#xff0c;需要的话往下看 ( 进阶 )---Required<T>&#xff1a;Required与Partial相反&#xff0c;作用是将所有属性变成必选属性&#x…

路径规划——曲线拟合详解(二):贝塞尔曲线、B样条曲线与QP优化( Fast-Planner算法核心部分)

1. 贝塞尔曲线 (1). 贝塞尔曲线的作用 贝塞尔曲线的作用是给定控制点&#xff0c;通过控制点生成对应的曲线进行轨迹拟合&#xff0c;输入为点&#xff0c;输出为受到控制点约束而产生的轨迹。 (2). 贝塞尔曲线的数学表达式 假设给定N个控制点&#xff0c;得到的为N-1阶的贝…

GA-SVM,基于GA遗传算法优化SVM支持向量机回归预测(多输入单输出)

基于遗传算法&#xff08;Genetic Algorithm, GA&#xff09;优化支持向量机&#xff08;Support Vector Machine, SVM&#xff09;用于回归预测是一个常见的任务。在这个任务中&#xff0c;我们使用GA来寻找SVM的最佳超参数配置&#xff0c;以最大化回归性能指标&#xff0c;例…

PyCharm使用指南(个性化设置、开发必备插件、常用快捷键)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;本文已收录于Python系列专栏&#xff1a; 零基础学Python &#x1f4ac;订阅专栏后可私信博主进入Python学习交流群&#xff0c;进群可领取Python视频教程以及Python相关电子书合…

【Ambari】Ansible自动化部署大数据集群

目录 一&#xff0e;版本说明和介绍信息 1.1 大数据组件版本 1.2 Apache Components 1.3 Databases支持版本 二&#xff0e;安装包上传和说明 三&#xff0e;服务器基础环境配置 3.1global配置修改 3.2主机名映射配置 3.3免密用户名密码配置 3.4 ansible安装 四. 安…

虚幻引擎像素流源码解读

前言 假期在家把虚幻引擎像素流的源码有研究了一下&#xff0c;进行了一下总结&#xff0c;本文适合有一定使用虚幻引擎像素流经验的人阅读。 源码地址 这里研究的是UE5.1的版本&#xff0c;源码位置如下 C:\Program Files\Epic Games\UE_5.1\Engine\Plugins\Media\PixelStream…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

pytest的时候输出一个F后面跟很多绿色的点解读

使用pytest来测试pyramid和kotti项目&#xff0c;在kotti项目测试的时候&#xff0c;输出一个F后面跟很多绿色的点&#xff0c;是什么意思呢&#xff1f; 原来在使用pytest进行测试时&#xff0c;输出中的“F”代表一个失败的测试&#xff08;Failed&#xff09;&#xff0c;而…

Spring源码分析(@Configuration)

文章目录 Spring源码分析&#xff08;Configuration&#xff09;一、ConfigurationClassPostProcessor1、主要作用和特点2、执行的时机3、BeanFactoryPostProcessor4、BeanDefinitionRegistryPostProcessor5、ConfigurationClassPostProcessor1&#xff09;postProcessBeanDefi…

ebpf+perfetto实现调度延迟记录与展示

1.背景 需要分析生产环境的调度问题,如线程的调度延迟有多少,在哪些时间点延迟比较明显,影响其调度的主要原因是什么?其次,我们希望可以比较直观的展示调度延迟情况。最好能对接perfetto的UI和后处理,因为perfetto已经用于分析比较多的性能数据,可以和调度数据进行整合.我们…

聚观早报 | 沃尔沃发布一季度全球销量;苹果将举办财报电话会议

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月07日消息 沃尔沃发布一季度全球销量 苹果将举办新财报电话会议 荣耀Magic6支持5.5G通信 特斯拉将建最大超级充…

【计算机网络经典面试题】简述 TCP 三次握手和四次挥手的过程

TCP链接 1.三次挥手2.四次挥手3.拓展说说 TCP 2次握手行不行&#xff1f;为什么要3次 1.三次挥手 1&#xff09;第一次握手&#xff1a;建立连接时&#xff0c;客户端向服务器发送SYN包&#xff08;seqx&#xff09;&#xff0c;请求建立连接&#xff0c;等待确认 2&#xff09…

基于Springboot的Java学习平台

采用技术 基于Springbootjava学习平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能模块 后台管理 用户注册 课程信息 作业信息 资料信息…

【Linux实践室】Linux高级用户管理实战指南:创建与删除用户组操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux创建用户组命令2.1.1 知识点讲解2.1.2…

MacOS Docker 可视化面板 Portainer

一、简介 Portainer 是一个可视化的容器镜像图形管理工具&#xff0c;使用 Portainer 可以轻松构建、管理和维护Docker 环境。 而且完全免费&#xff08;portainer-ce 是免费的&#xff0c;portainer-ee 是需要授权的&#xff0c;今天安装的是 portainer-ce 版本&#xff09;&…

基于51单片机的尾气检测报警器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1DBn8A-p6wmP3Zssrrwspyg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectroni…

Transformer模型-add norm(残差连接归一化)的简明介绍

今天介绍transformer模型的add & norm&#xff08;残差连接&归一化&#xff09; add代表残差连接&#xff08;Residual Connection&#xff09; 残差连接是一种跳过连接,它将输入添加到网络的中间层或输出上。 **残差连接&#xff08;Residual Connection&#xff09;…

深度学习-机器视觉part2

深度学习-机器视觉part2 文章目录 深度学习-机器视觉part2一、从卷积到卷积神经网络二、手撕卷积代码2.1 动机2.2 数据集2.3 卷积操作2.3.1 填充&#xff08;padding&#xff09;2.3.2 卷积块2.3.3 池化2.3.4 Softmax 2.4 完整CNN2.5 训练改进 三、经典CNN模型介绍四、CNN模型的…

SQL Server详细安装使用教程

1.安装环境 现阶段基本不用SQL Server数据库了&#xff0c;看到有这样的分析话题&#xff0c;就把多年前的存货发一下&#xff0c;大家也可以讨论看看&#xff0c;思路上希望还有价值。 SQL Server 2008 R2有32位版本和64位版本&#xff0c;32位版本可以安装在Windows XP及以上…