【机器学习】 朴素贝叶斯算法:原理、实例应用(文档分类预测)

1. 算法原理

1.1 朴素贝叶斯方法

朴素贝叶斯方法涉及一些概率论知识,我们先来复习一下。

联合概率:包含多个条件,并且所有的条件同时成立的概率,公式为:P(AB)=P(A)*P(B)

条件概率:事件A在另一个事件B已经发生的前提下发生的概率,记作P(A|B),如果有多个条件,

那记作:P(A1,A2|B)=P(A1|B)*P(A2|B)

朴素贝叶斯一般公式:P(A|B) = P(B|A)*P(A)/P(B)

我举个小例子帮助大家理解:

某学校有N名学生,男生占60%,女生占40%。男生都留短发,女生一半留短发,一半留长发。

问题1:随机一个学生,知道性别的情况下,他(她)留短发的概率是多少? 

答:男:P(短发|男生)=1;女:P(短发|女生)=0.5

问题2:随机一个学生,只知道他留短发,他是男生的概率是多少?

答:设 B=短发;A=男生

要求的是 P(A|B) = P(B|A)*P(A)/P(B)

P(B|A)=1, P(A)=0.6, P(B)=0.6*1+0.4*0.5=0.8

P(A|B)=1*0.6/0.8=0.75


1.2 文档分类方法

文档分类是在已经分类好了的文档中提取关键字,在以后遇到新的文档时,从这些关键字中预测这篇新文章是哪个类别。

在文档分类中,朴素贝叶斯公式为:

P(C|W) = P(W|C)*P(C)/P(W)

P(C|W) :某个关键字属于某个分类的概率

P(W|C) :某个分类下,某个关键字出现的概率

P(C)      某个类别的概率(某个类别的文档数/总文档数)

P(W)    这个关键字在需要预测的文档中出现的概率


1.3 拉普拉斯平滑系数

       假如现在有一新的篇文章,它的主题包括‘影院’‘云计算’等关键字,我计算它属于娱乐类文章的概率。公式如下:

P(娱乐类|影院,云计算) = P(影院,云计算|娱乐类)*P(娱乐类)/P(影院,云计算),

其中P(影院,云计算|科技类)=P(影院|科技类)* P(云计算|科技类)

       然而对于预测之前建立的分类模型,如果在已经分类好的文章中娱乐类文章种没有出现过云计算这个关键字,那么P(云计算|娱乐类)=0,导致P(影院,云计算|娱乐类)=0,结果就是一篇包括‘影院’‘云计算’等关键字的文章属于娱乐类的概率为0,这肯定不对。只要它里面包含了任何一个和娱乐类相关的词,都有可能是娱乐类。

       因此引入拉普拉斯平滑系数来避免出现0概率的情况。方法如下:

将 P(W|C) 更改为  P(W|C)=(Ni+a)/(N+a*m)

Ni:该W词在C类别所有文档中出现的次数,即云计算在娱乐类文章中出现了多少次。

N: C类别的文档所有词出现的次数和,即娱乐类一共有多少词。

a: 指定系数,一般为1。

m:训练文档中统计出现的特征词个数,即整个文档有多少词。


1.4 特征向量化方法

将一篇文章中出现的所有词进行特征向量化,将单词提取出来,计算它们一共出现了多少次。首先要从sklearn库中导入该方法 from sklearn.feature_extraction.text import CountVectorizer。

特征向量化方法:vect.fit_transform()

上式可理解为:fit表示提取特征,transform表示变成sparss矩阵

下面我用两个字符串例子来演示一下这个方法:

# 导入特征向量化方法
from sklearn.feature_extraction.text import CountVectorizer
# 定义两个字符串
word1 = 'i love python,  python makes me happy'
word2 = 'hello world, i love the world'
# 变量vect接收特征向量化方法
vect = CountVectorizer()
# 将2个变量传入特征向量化方法,用于提取每个单词出现的次数
words = vect.fit_transform([word1,word2])

words变量接收的是sprase类型的矩阵,sparse矩阵只会标记word1和word2中不为0的地方,为0的地方不显示,即空格符就不计数直接跳过。如'i','love'等词,sparse矩阵会对这些词进行标记,标记方式为该词出现的次数。下面用代码帮助大家理解。

使用 vect.get_feature_names() 命令来获取word1和word2中出现的所有单词。
# 查看提取了哪些单词
names = vect.get_feature_names()  #提取word1和word2中出现过的所有单词
# 将sparse矩阵转换成正常的数组形式
arr = words.toarray()  

解释:arr变量中第0行表示word1某单词出现次数,第1行表示word2,某出现次数与names列表中的对应。即name列表中的'happy'在word1中出现了1次,在word2中出现了0次‘world’这个词在word1中出现了0次,在word2中出现了2次


2. 文档分类实战

2.1 数据获取

       使用sklearn内部数据集获取新闻分组数据,下载到指定文件夹。有关系统内部数据集的获取方法可以参考我的前一篇文章机器学习-K近邻算法,或者该网页sklearn数据集,本篇文章就不进行详述。如果找不到数据集的,文末有数据集,有需要的自取。

# 使用sklearn内部数据集,获取新闻分组数据
from sklearn.datasets import fetch_20newsgroups
# 指定文件下载位置,把新闻数据下载到里面
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件处理\\newsgroup'
newsgroups = fetch_20newsgroups(data_home = filepath)  #返回值是一个.Bunch类型数据

       我们得到的newsgroups是一个.Bunch类型的数据;data中存放的是11314篇新闻文章;DESCR是对这个数据集的描述;filename是文件路径,可以忽视;target存放的是这11314篇文章的分类,一共有20个类别记作0到19;target_names记录的是20种分类的名称。

2.2 数据处理

        首先从.Bunch数据中提取我们需要的,news_data相当于预测所需的特征值xnews_target相当于预测目标y

# news_data中存放具体的文章,相当于x
news_data = newsgroups.data
# news_target中存放数据的目标值,即分类的结果,相当于y
news_target = newsgroups.target

        从数据中提取最后10行用于结果验证,news_predict_data 存放最后十个的文章数据,用作最后预测函数的输入值,news_predict_target 存放最后十个主题分类,用于和最终预测结果比较,验证是否正确。然后将建模所用的数据剔除最后10行,即将 news_data 和 news_target 都删除最后10行数据。

# 取最后10行特征值作为验证集。用于预测的x
news_predict_data = news_data[-10:] 
# 最后10行目标作为验证预测结果的准确性。用于验证的y
news_predict_target = news_target[-10:]
# 用于建模的特征值删除最后10行,x
news_data = news_data[:-10]
# 用于建模的目标值删除最后10行,y
news_target = news_target[:-10]

到此我们已经划分出验证所用数据和建模所用数据。


2.3 划分训练集和测试集

一般采用75%的数据用于训练,25%用于测试,因此把数据进行训练之前,先要对数据划分。
使用 sklearn.model_selection.train_test_split 进行分割

划分方式:
x_train,x_test,y_train,y_test = train_test_split(x数据,y数据,test_size=数据占比)

train_test_split() 参数
x:数据集特征值(news_data)
y:数据集目标值(news_target)
test_size: 测试数据占比,用小数表示

train_test_split() 返回值
x_train:训练部分特征值
x_test: 测试部分特征值
y_train:训练部分目标值
y_test: 测试部分目标值

# 划分测试集和训练集
from sklearn.model_selection import train_test_split
# 数据的75%用于训练,25%用于测试
x_train,x_test,y_train,y_test = train_test_split(news_data,news_target,test_size=0.25)

2.4 特征提取

       为了统计每一篇文章中各个单词出现的次数,哪些分类中哪些单词出现的比较多,从而建立分类模型,同1.4所述。因此导入特征向量化方法CountVectorizer()

        然后,对用于训练的新闻数据 x_train 进行 .fit_transform() 操作,先进行fit提取特征值,再transform 将数据sparse矩阵化,统计各个单词出现次数,特征向量化方法见1.4。

       那么为什么对于测试用的新闻数据 x_test 只需要进行 transform 操作,而不需要 fit 提取特征值呢?可以简单理解为x_train 是用来建立模型的,我需要知道它有哪些特征,这些特征值如何与目标值 y_train 相对应。模型建立完成之后,测试数据 x_test 是用来检测这个模型的准确率,相当于我给这个模型传一个 sparse 矩阵,这么模型自己就会进行一个特征的提取,内部会对我对输入值进行一系列处理得到预测结果。同理,我们也需要对验证所用的x数据 news_predict_data 进行sparse矩阵化。

# 导入特征向量化方法
from sklearn.feature_extraction.text import CountVectorizer
# news_vect 接收特征向量化方法
news_vect = CountVectorizer()  
# 将x_train传入特征向量化方法
x_train = news_vect.fit_transform(x_train) #用于训练
# 测试数据矩阵化
x_test = news_vect.transform(x_test) #用于测试
# 把验证数据变成sparss矩阵,输入sparss矩阵,输出预测结果
news_predict_data = news_vect.transform(news_predict_data) 

2.5 朴素贝叶斯方法预测

首先导入朴素贝叶斯方法库 from sklearn.naive_bayes import MultinomialNB

朴素贝叶斯函数:  MultinomialNB()

MultinomialNB() 接收的参数 (alpha=1,fit_prior=True,class_prior=None)
alpha:拉普拉斯平滑系数,默认为1

朴素贝叶斯训练方法:  .fit(self, x_train, y_train, sample_weight=None)

传入的x可以是数组、列表、sparss矩阵

# 导入朴素贝叶斯方法
from sklearn.naive_bayes import MultinomialNB  
# nb接收朴素贝叶斯方法
nb = MultinomialNB()  
# 训练,传入训练的特征sparss矩阵,训练的目标值
nb.fit(x_train,y_train)
# 评分法看模型准确率,传入测试值特征sparss矩阵,和测试目标值
accuracy = nb.score(x_test,y_test) 
# 预测,输入预测所需的特征值x
result = nb.predict(news_predict_data)
评分法计算模型准确率:  .score(x_test, y_test)

根据x_test预测结果,把预测结果和真实的y_test比较,计算准确率

朴素贝叶斯预测方法:  .predict(预测所需的x数据)

此处的x数据需要输入sparse矩阵

accuracy 存放模型准确率,result 存放分类结果,最终准确率为83%,result和实际结果news_predict_target有微小偏差。


完整代码如下:
# 文档分类实战#(1)数据获取
# 使用sklearn内部数据集,获取新闻分组数据
from sklearn.datasets import fetch_20newsgroups
# 指定文件下载位置,把新闻数据下载到里面
filepath = 'C:\\Users\\admin\\.spyder-py3\\test\\文件处理\\newsgroup'
newsgroups = fetch_20newsgroups(data_home = filepath)  #返回值是一个.Bunch类型数据#(2)数据预处理
# news_names存放分类,一共20
news_names = newsgroups.target_names
# news_data中存放具体的文章,相当于x
news_data = newsgroups.data
# news_target中存放数据的目标值,即分类的结果,相当于y
news_target = newsgroups.target# 取最后10行特征值作为验证集。用于预测的x
news_predict_data = news_data[-10:] 
# 最后10行目标作为验证预测结果的准确性。用于验证的y
news_predict_target = news_target[-10:]
# 用于建模的特征值删除最后10行,x
news_data = news_data[:-10]
# 用于建模的目标值删除最后10行,y
news_target = news_target[:-10]#(3)划分测试集和训练集
from sklearn.model_selection import train_test_split
# 数据的75%用于训练,25%用于测试
x_train,x_test,y_train,y_test = train_test_split(news_data,news_target,test_size=0.25)#(4)特征抽取
# 导入特征向量化方法
from sklearn.feature_extraction.text import CountVectorizer
news_vect = CountVectorizer()  # news_vect 接收特征向量化方法
# 将x_train传入特征向量化方法,用于统计x_train中每篇文章的单词出现了多少次,返回sparss矩阵
# fit先提取x_train的特征,transform将x_train中的数据进行sparss矩阵化
x_train = news_vect.fit_transform(x_train) #用于训练
# 上面已经进行过提取特征的操作,这一步不需要fit,直接进行transform矩阵化即可
x_test = news_vect.transform(x_test) #用于测试,我给模型一个sparss矩阵,模型给我一个预测结果
# 同理,我也需要把验证数据变成sparss矩阵,输入sparss矩阵,输出预测结果
news_predict_data = news_vect.transform(news_predict_data) #(5)朴素贝叶斯方法预测
from sklearn.naive_bayes import MultinomialNB  # 导入朴素贝叶斯方法
# MultinomialNB接收的参数(alpha=1,fit_prior=True,class_prior=None)
# alpha:拉普拉斯平滑系数,默认为1
# 用于训练时的fit()方法,fit(self,x,y,sample_weight=None)
# 传入的x可以是数组、列表、sparss矩阵nb = MultinomialNB()  # nb接收朴素贝叶斯方法
# 训练,传入训练的特征sparss矩阵,训练的目标值
# 朴素贝叶斯训练时,只需要提取特征值fit,不需要transform对特征进行一系列操作
nb.fit(x_train,y_train)
# 评分法看模型准确率,传入测试值特征sparss矩阵,和测试目标值
accuracy = nb.score(x_test,y_test)  # 根据x_test预测结果,把预测结果和真实的y_test比较,计算准确率
# 预测,输入预测所需的特征值x(非sparss矩阵)
result = nb.predict(news_predict_data)

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

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

相关文章

第3关:集合操作100

任务描述相关知识编程要求测试说明 任务描述 本关任务:使用 集合操作解决实际问题 相关知识 1.集合并操作符 可转换为SQL 若R,S的属性名不同,可使用重命名使相应列名一致后进行并操作 例如:R(A,B,C) S(D,E,F) select A,B from R union sel…

你真的会使用 MySQL中EXPLAIN吗

EXPLAIN是MySQL数据库中一个强大的工具,用于查询性能分析和优化。通过EXPLAIN,你可以查看MySQL查询的执行计划,了解MySQL是如何执行你的查询语句的。这篇文章将详细介绍EXPLAIN的使用,帮助你更好地理解和优化MySQL查询。 为什么使…

phpstudy 开启目录浏览功能

(1)在该目录下: (2)选择对应网站的配置文件; (3)修改: # Options FollowSymLinks ExecCGI Options Indexes FollowSymLinks ExecCGI

机器视觉行业,日子不过了吗?都进入打折潮,双11只是一个借口,打广告出新招,日子不好过是真的

我就不上图了,大家注意各个机器视觉公司公众号,为什么打折?打广告也只是宣传手段,进入打折潮,内卷严重,价格战变成白刃战,肯定日子不好过了。

【广州华锐互动】楼宇智能化VR虚拟教学系统

在如今的技术时代,教育行业正在逐步引入各种创新方法以提升教学质量。VR公司广州华锐互动开发的楼宇智能化VR虚拟教学系统就是其中的一种,它利用虚拟现实(VR)技术,为学生提供一种全新的、沉浸式的学习体验。 楼宇智能化VR虚拟教学系统涵盖综合…

青少年编程学习 等级考试 信奥赛NOI/蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代,编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加,青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程,提升他们的技能和素质,博主结合自身多年从事青…

火山引擎DataTester上线「集成工作台」功能,助力企业打造专属AB平台

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 AB测试不仅是做增长的“利器”,也是企业优化效率、增加决策精确度的有效工具。随着国内企业服务市场需求的多元,企业对AB测试平台的“个性化…

Shiro快速入门之一

一、前言 Java有两个出名的安全框架,一个是Apache Shiro,另一个是Spring Security ,相对而言Shiro更简单、控制权限的粒度可粗可细,我们项目中使用的是Shiro。 二、概念 Shiro最主要的功能是验证用户身份和用户访问权限控制&am…

基于ssm的学生档案管理系统(有报告)。Javaee项目,ssm项目。

演示视频: 基于ssm的学生档案管理系统(有报告)。Javaee项目,ssm项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff…

「 电商API接口系列之淘宝API接口调用 」

API从技术角度来说就是应用程序编程接口。通过API我们可以直接获取一些我们需要的数据结果,而不需要自己编写相应的程序,有点类似模块化调用函数,大大加快了我们编程的速度。当然这个数据传输是需要网络的,所以一般API的形式看起来…

C语言--数组的长度计算【详细解释】

一.数组的长度计算公式 我们都知道字符串有特定的函数strlen,而数组没有,(虽然字符串也是一种特殊的数组) 但是,类似于这样的数组: int arr[]{12,89,1,5,31,78,45,12,12,0,45,142,21,12}; 我们很难一眼…

OpenCV踩坑笔记使用笔记入门笔记整合SpringBoot笔记大全

springboot开启摄像头抓拍照片并上传实现&问题记录 NotAllowedErrot: 请求的媒体源不能使用,以下情况会返回该错误: 当前页面内容不安全,没有使用HTTPS没有通过用户授权NotFoundError: 没有找到指定的媒体通道NoReadableError: 访问硬件设备出错Ov…

【Unity实战】实现强大通用易扩展的对话系统(附项目源码)

文章目录 先看看实现的最终效果前言素材前期准备工作1. 简单绘制地形2. 绘制对话框3. 配置人物动画4. 实现简单的控制人物移动 控制对话框的显示隐藏定义对话内容实现简单的对话功能逐字打印效果按下按键快速显示文本实现多个NPC配置不同对话扩展TextAsset 读取文档文件实际应用…

java 旋转方阵

public static void main(String[] args) {Scanner scanner new Scanner(System.in);// N阶方阵int n scanner.nextInt();// 构建方阵List<List<Integer>> matrix new ArrayList<>();for (int i 0; i < n; i) {List<Integer> row new ArrayLis…

win10录屏软件大揭秘,谁才是真正的录屏王者?

Windows 10为用户提供了多种强大的录屏工具&#xff0c;无论您是想捕捉游戏精彩瞬间、记录教程&#xff0c;还是制作演示文稿&#xff0c;都有合适的工具可供选择。本文将详细介绍三款win10录屏软件&#xff0c;通过使用这些录屏软件&#xff0c;用户可以方便地录制下电脑屏幕上…

阿里达摩院开源DAMO-YOLO

1.简介 DAMO-YOLO是一个兼顾速度与精度的目标检测框架&#xff0c;其效果超越了目前的一众YOLO系列方法&#xff0c;在实现SOTA的同时&#xff0c;保持了很高的推理速度。DAMO-YOLO是在YOLO框架基础上引入了一系列新技术&#xff0c;对整个检测框架进行了大幅的修改。具体包括…

人工智能基础_机器学习027_L2正则化_岭回归_非稀疏性_原理解读_公式推导---人工智能工作笔记0067

然后我们再来看一下岭回归,也就是第二范数对吧, 他的公式,平方以后,加和然后开平方.L2的公式是 可以看到L2公式,也是有个阿尔法,惩罚项对吧. 可以看到因为L2带有平方,所以他的图形是个圆形 我们可以把L2范数,进行画出来看看 这里我们先看L2的公式,这里我们让 这个公式写成1 …

汽车OBD2蓝牙诊断仪解决方案程序开发

1、因TL718已经为你建立了物理层、数据链层和部分应用层的协议&#xff0c;所以只要OBD2标准应用层协议文本&#xff0c;ISO15031-5 或 SAE J1979&#xff08;这两个协议是相同的内容&#xff09;。 2、TL718诊断接口 1 套或用TL718芯片自建电路。3、家用PC机电脑一台。4、安…

Python 列表List数据复杂操作

一、将列表数据每2个取一个数据添加到新列表中 prov_code [130100000000, 石家庄市, 130200000000, 唐山市, 130300000000, 秦皇岛市, 130400000000,邯郸市,130500000000, 邢台市, 130600000000, 保定市, 130700000000, 张家口市, 130800000000,承德市,130900000000, 沧州市, …

易云维®医院能源管理系统提供多方案实现医院节能计划

德国卫生部长卡尔劳特巴赫采访时说&#xff1a;“如果我们不赶紧采取有效措施&#xff0c;就会&#xff08;有医院&#xff09;倒闭。” 2022年的德国面临能源危机和通胀挑战&#xff0c;医院系统面临的人员和资金压力再次敲响警钟&#xff0c;正陷入举步维艰的处境。德国医院…