Python机器学习:朴素贝叶斯

前两天不知道把书放哪去了,就停更了一下,昨天晚上发现被我放在书包夹层里面了,所以今天继续开始学习。

首先明确一下啊,朴素贝叶斯是什么:朴素贝叶斯分类器是一种有监督的统计学过滤器,在垃圾邮件过滤、信息检索等领域经常被使用到。

一、极大似然估计:这个我就不讲了,纯纯数理统计的问题,目标就是找到一个参数p,让他使得所有随机变量的联合概率最大,我就直接贴上一张图吧:

图1:最大似然估计

 二、朴素贝叶斯分类:

先回忆一下,概率论里面贝叶斯公式是什么?想不起来的话,建议翻一翻浙大的那本概率论与数理统计,那里面有的,简单的来说,就是求条件概率,或者说,已知道一件事情X发生的概率,求X发生情况下另一个事件Y发生的概率:

P(Y_i |X)=\frac{P(X,Y_i)}{P(X)}=\frac{P(Y_i)P(X|Y_I)}{\sum_{j=1}^{K}P(Y_j)P(X|Y_j)}

那么,用频率代替概率在样本集合上进行估计的话,就是:

\left\{\begin{matrix} P(Y=c_k)\approx \frac{N_k}{m} & \\ P(X^i=x^i|Y=c_k)\approx \frac{\sum_{j=1}^{m}I\left \{x_j^i =x^i,y_j=c_k \right \}}{N_k} & \end{matrix}\right.

三、拉普拉斯平滑:

如果说,我们的样本集合不够大,就可能没有法子去覆盖特征值的所有可能取值,也就是说,可能会出现这种情况:

P(X^i=x^i|Y=c_k)

这个时候,你不管怎么给其他的特征分量取值,都会出现:

P(Y=c_k)\prod_{I=1}^{N}P(X^i=x^i|Y=c_k)=0

这种情况,很麻烦吧,但是,这种情况是可以避免的,通过平滑处理(典型的就是拉普拉斯平滑):

\left\{\begin{matrix} P(Y=c_k)\approx \frac{N_k+1}{m+K} & \\ P(X^i=x^i|Y=c_k)\approx \frac{\sum_{j=1}^{m}I\left \{x_j^i =x^i,y_j=c_k \right \}+1}{N_k+A^i} & \end{matrix}\right.

A_iX_i的所有可能取值的个数。

来看一下书上给出的完整的朴素贝叶斯分类器的算法:

我们要输入的是:样本集合D=\left \{ (x_1,y_1),(x_2,y_2),....(x_n,y_n) \right \},待预测样本下,样本标记的所有可能值:\left\{c_1,c_2,\cdots,c_k\right\}样本输入变量X的每个属性X_i的所有可能取值\left\{a_i1,a_i2,\cdots,a_{iA_i}\right\};

输出很简单:带预测样本x所属类别

算法如下:

step1:计算标记为c_k的样本出现的概率:

P(Y=c_k)\approx \frac{N_k+1}{m+K}

step2:计算标记为c_k的样本,其X_i分量的属性值为a_{ip}的概率

P(X^i=x^i|Y=c_k)\approx \frac{\sum_{j=1}^{m}I\left \{x_j^i =x^i,y_j=c_k \right \}+1}{N_k+A^i}

step3:根据上面的估计值计算x属于所有y_k的概率值,并且喧杂概率最大的作为输出

y=\arg max_{k=1,2,\cdots,K}(P(Y=c_k|X=x))

即:

y=\arg max_{k=1,2,\cdots,K}(P(Y=c_k)\prod_{i=1}^{n}P(X^i=x^i|Y=c_k))

 其实,朴素贝叶斯的本质就是极大似然估计,我也不知道再写些啥,书上有P(Y=c_k)P(X^i=x^i|Y=c_k)的计算方法,想推的自己推一推吧,极大似然估计这个是考研数一的必考点,我在这里强烈推荐宇哥的视频,学完一身轻松。

我们看一个书上给出的利用朴素贝叶斯实现垃圾短信分类的应用,emm,他用的是SMS Spam Collection DataSet,you 5574条短信,其中有747条垃圾短信,数据集和是个纯文本,每行对应一条垃圾短信,第一个单词是Spam或者ham,表示是不是垃圾短信,这就是很简单的标签了,标签和短信内容之间用制表符分隔。

其实看到这个的时候,我想说,好好学一学,没啥坏处,我的qq邮箱和163邮箱里面全是垃圾邮件,每天都有,烦死了快。

找了一下啊,Kaggle上面是有这个数据集的,其他人的博客也给出了相关的下载地址,我会把这个传到我的下载哪一栏里面去,有需要的可以下载。

with open('./spam.csv','r',encoding='gb18030', errors='ignore')as f:
    sms=[line.split(',')for line in f ]#,encoding='utf-8'
y,x=zip(*sms)
from sklearn.feature_extraction.text import CountVectorizer as CV
from sklearn.model_selection import train_test_split
y=[label=='spam'for label in y]
x_train,x_test,y_train,y_test=train_test_split(x,y)
counter=CV(token_pattern='[a-zA-Z]{2,}')
x_train=counter.fit_transform(x_train)
x_test=counter.transform(x_test)
# print (x_train)
# print(x_test)
from sklearn.naive_bayes import MultinomialNB as NB
model=NB()
model.fit(x_train,y_train)
train_score=model.score(x_train,y_train)
test_score=model.score(x_test,y_test)
print("train_score:",train_score)
print("test_score:",test_score)

注意,这里有两个地方和书上的不一样,因为我从kaggle上面下载的是.csv文件,一直读不出来,然后查了一下,将encoding='utf-8'改成了encoding='gb18030', errors='ignore',同时,这个数据集合并没有和书上说的那样子,标签和正文以空格隔开,而是用“,”隔开的,所以分隔那里我用的是

line.split(','),这下才读取成功,这个地方告诉我们,搞之前要好好看一下数据集合,不能一昧的跟着书上走,因为书是先出的,你是后学的,先出的肯定会和你后面学习要用到的东西有出入,因地制宜,合理发展,产品迭代才是硬道理(此处连续三个/doge)

好了,来看看分类效果,为啥把两个print给注释了?没错误啊,绝对保真,就是输出太多了,我嫌烦才给注释了。

图2:朴素贝叶斯分类结果

 可以看到,训练结果是0.989,测试结果是0.979,效果还是可以滴。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务 API 设计之 ——API 参数规范

【强制】字段名称用小驼峰风格 【强制】Service API 返回值必须使用 Response 包装 Service API 返回值强制要求进行通用包装,例如:Response。Response 的作用: 统一方法表示 API 调用是否成功API 调用失败时,统一格式反馈错误 C…

vue实现轨迹回放(很详细)

效果 功能 时间搜索查询轨迹并生成(默认是当前的一天的时间) 图标能跟随路径方向移动 删除了百度logo和版权信息(业务需要,不建议删除) Vue Baidu Map npm install vue-baidu-map --save main.js import Vue from vu…

关于h5跳转app的坑

需求&#xff1a;h5点击按钮跳转app&#xff0c;有下载app的直接打开&#xff0c;无下载就跳转下载的链接&#xff08;安卓跟ios的下载链接不一样&#xff09; 1、用超链接的方式打开app <a href"xxxx"></a> 弊端&#xff1a;这种方式只能控制有下载ap…

基于电子商务平台客户管理系统的设计与实现_kaic

摘要 本论文旨在设计和实现一个基于电子商务平台的客户关系管理系统&#xff0c;以提高企业与客户之间的互动和关系维护效率。本文首先介绍了客户关系管理系统的相关理论和技术&#xff0c;并分析了其在电子商务平台中的应用价值。接着&#xff0c;进行了电子商务平台客户关系管…

【计算机组成原理笔记】

【计算机组成原理笔记】 1.1 计算机系统简介 计算机系统由软件和硬件组成。软件又可分为系统软件和应用软件。 计算机体系结构指的是&#xff08;机器语言&#xff09;程序员所看到的计算机系统属性概念性的结构与功能特性。&#xff08;研究有无乘法指令&#xff09; 计算机…

【ROS服务通信如果先启动客户端,那么会请求异常需求,如何解决?最全】

问题: 如果在启动 ROS 服务的客户端之前启动了 ROS 服务&#xff0c;客户端可能会因为缺少服务而发出异常请求。这可能会导致服务端不知道如何处理请求&#xff0c;从而导致通信失败。要解决这个问题&#xff0c;有以下几种方法&#xff1a; 等待服务启动&#xff1a;在启动客…

C语言爱心代码大全集—会Ctrl+C就可以表白了

一、C语言爱心代码大全&#xff0c;会CtrlC就可以表白了&#xff01; 博主整理了一个C语言爱心代码大全&#xff0c;里面有C语言爱心代码会动的动态效果和C语言爱心代码大全静态效果&#xff0c;只需复制粘贴就可以用啦&#xff01; 1、动态C语言爱心代码效果图如下&#xff…

如何优雅地使用 Markdown?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 要想优雅&#xff0c;首先得有一个丝滑、好用的Markdown编辑器。 我用typora做笔记三年多&#xff0c;收费之后我开始找替代品&#xff0c;尝试了很多&#xff0c;总是有这样那样的问题不满意&#x…

QT设置图标

可执行文件图标 把.ico文件放到工程目录中&#xff0c;于.pro文件同级&#xff0c;然后在.pro文件中加上 RC_ICONSxxx.ico窗口左上角图标和任务栏图标 在mainwindows的ui文件中 选择文件或选择资源。资源的话就是从QT resources中找。百度关键字QT resources。

软件测试面试复盘:技术面没有难倒我,hr面被虐的体无完肤

一般提到面试&#xff0c;肯定都会想问一下面试结果&#xff0c;我就大概的说一下面试结果&#xff0c;哈哈&#xff0c;其实不太想说&#xff0c;因为挺惨的&#xff0c;并没有像很多大佬一样 ”已拿字节阿里腾讯各大厂offer”&#xff0c;但是毕竟是自己的经历&#xff0c;无…

【JavaWeb】7—会话控制

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

7.redis-集群

一.概念 1.分片 集群中的每个redis实例都被认为是整个数据的一个分片&#xff0c;官方建议是最大1000个 2.槽位 redis集群有16384个哈希槽&#xff0c;每个key通过CRC16校验后通过总分片数量,对16384取模来决定放哪个槽&#xff0c;集群的每个节点负责一部分hash槽位。 3.槽位…

springboot+vue+java高速公路收费管理系统的设计

.第一&#xff0c;友好界面。高速公路收费管理系统开发设计&#xff0c;界面的友好性比较重要&#xff0c;满足这一要求才能体现出人性化设计特征&#xff0c;和用户应用系统便捷性相适应&#xff0c;动态的人机交互设计&#xff0c;用户应用系统的时候能感受到操作的便利&…

Maven核心概念

一、Maven基础知识 Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档。 1、Maven模型 2、仓库分类 本地仓库&#xff1a;自己计算机上的一个目录中央仓库&a…

【vite+vue3】 多页面应用模式

需要注意到的点&#xff1a; 1. 项目文件结构 2. vite.config.js 的配置 3. 访问地址的路径 假设你有下面这样的项目文件结构 ├── package.json ├── vite.config.js ├── index.html ├── main.ts └── src├── project&#xff5c;————projectA&#xf…

1669_MIT 6.828 xv6代码的获取以及编译启动

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 6.828的学习的资料从开始基本信息的讲解&#xff0c;逐步往unix的一个特殊版本xv6过度了。这样&#xff0c;先得熟悉一下这个OS的基本代码以及环境。 在课程中其实…

Python工具库安装

1、Python工具库下载 &#xff08;1&#xff09;查询安装Python的版本信息。 按键 WinR&#xff0c;在弹出的“运行”对话框中输入cmd&#xff0c;在弹出的Dos系统中&#xff0c;输入python&#xff0c;即可查询得到Python的版本信息。本次所安装的python版本为3.8.10。 &…

后端开发之Swagger API开发工具

最近刚入职公司&#xff0c;做Java后端。当下对于新手程序员来说&#xff0c;的确并不友好&#xff0c;不仅是经济低迷&#xff0c;而且这次chatgpt的大火也极大地冲击了软件开发行业&#xff0c;所以小白必须抓紧时间卷&#xff0c;哪怕自己写出来的东西把自己搞失业……也要尽…

【Python从入门到进阶】14、字典高级应用

接上篇《13、元组高级应用及常见切片操作》 上两篇我们学习了Python中元组的高级应用&#xff0c;以及字符串、列表和元祖的切片操作。本篇我们来学习字典的高级应用&#xff0c;包括字典的查询、修改、添加、删除及遍历操作。 一、字典高级简介 我们通过前面的学习知道&…

ORACLE创建表空间、用户、授权和Navicat创建序列和触发器及解决ORA-00942、ORA-01219错误

问题描述&#xff1a;因为每次Oracle删除数据库的时候磁盘文件还没删除&#xff0c;然后自己手动停止Oracle&#xff0c;删除磁盘里的.DBF文件导致数据库重启后无法连接。 cmd sqlplus sys as sysdba执行alter database open;查看你报错的数据文件&#xff08;就是你停止Orac…