机器学习——贝叶斯(三种分布)/鸢尾花分类分界图/文本分类应用

2023-09-14 21:06:49

0、前言:

  • 机器学习中的贝叶斯的理论基础是数学当中的贝叶斯公式。
  • 这篇博客强调使用方法,至于理论未作深究。
  • 机器学习中三种类型的贝叶斯公式:高斯分布(多分类)、多项式分布(文本分类)、伯努利分布(二分类任务)
  • 贝叶斯算法优点:对小规模数据表现好,能处理多分类任务,常用于文本分类。缺点:只能用于分类问题。

1、高斯分布的贝叶斯算法:

  • 应用:鸢尾花分类任务分界图
# 导入基础库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# 导入贝叶斯(高斯分布、多项式分布、伯努利分布)
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
data,target = load_iris(return_X_y=True)
display(data.shape, target.shape)

data2 = data[:,2:].copy()
# 训练模型
GS_nb = GaussianNB()
GS_nb.fit(data2,target)

# 画分界图
# 先生成x坐标和y坐标
X = np.linspace(data2[:,0].min(),data2[:,0].max(),1000)
Y = np.linspace(data2[:,1].min(),data2[:,1].max(),1000)

# 然后将x坐标和y坐标对应的网格坐标对应出来
nx,ny = np.meshgrid(X,Y)

# 扁平化
nx = nx.ravel()
ny = ny.ravel()

# 组合堆积成新的数据集
disdata = np.c_[nx,ny]
pd.DataFrame(disdata).head(3)

# 预测
disdata_pred = GS_nb.predict(disdata)

# 绘制分界图(这种速度比较慢)
plt.scatter(disdata[:,0],disdata[:,1],c=disdata_pred)
plt.scatter(data2[:,0],data2[:,1],c=target,cmap='rainbow')

# 绘制分界图(这种速度快)
plt.pcolormesh(X,Y,disdata_pred.reshape(1000,-1)) # 将'disdata_pred'的值以伪彩色图(plt.pcolormesh)的形式在二维网格上显示出来。
plt.scatter(data2[:,0],data2[:,1],c=target,cmap='rainbow') # cmap='rainbow'是matplotlib库中plt.scatter函数的一个参数。这个参数用于指定色彩映射(colormap)。在这种情况下,'rainbow'是一种色彩映射,它会从红色开始,逐渐过渡到橙色、黄色、绿色、青色、蓝色和紫色。

在这里插入图片描述

  • 在这个应用中,用多项式分布的贝叶斯分类效果没有高斯分布好,而伯努利分布的贝叶斯只能用于二分类任务。

2、三种贝叶斯算法的文本分类应用效果:

  • 代码:
# 老三件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 导入三种贝叶斯算法
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
# 导入数据(5571条数据,有两列,其中第一列为标签,第二列为短信内容)
data = pd.read_table('./data2/SMSSpamCollection',header=None)
pd.DataFrame(data).head(2)
# 从数据中分词,并且统计每个短信中分词的出现频率,最终呈现一个稀疏矩阵作为贝叶斯算法的输入
a_data = data[1].copy()
target = data[0].copy()
a_data.shape # 一维
from sklearn.feature_extraction.text import TfidfVectorizer # 特征提取库中的Tfid~是用于文本数据的特征提取
'''
1、TfidfVectorizer将文本数据转换为特征向量形式,每个词表示一个特征维度,每个维度的值是这个词在文本中的权重(出现的次数)
2、这个库是文本数据用于机器学习模型的关键步骤
3、导入后使用方法和机器学习算法非常类似,要先创建对象,然后fit()
'''
# 创建特征词向量的对象
tf = TfidfVectorizer()
tf.fit(a_data) # 输入一维的源文本数据即可,这一步会统计分词信息
X = tf.transform(a_data).toarray() # 这一步会根据上面统计的分词信息构建稀疏矩阵

# tf.transform(a_data):
# <5572x8713 sparse(稀疏) matrix of type '<class 'numpy.float64'>'
# 	with 74169 stored elements in Compressed Sparse Row format>
# .toarray(),就是将结果转换为array数组
# 高斯分布贝叶斯
GS = GaussianNB()
GS.fit(X,target)
GS.score(X,target) # 0.9414931801866475
# 多项式分布贝叶斯
MT = MultinomialNB()
MT.fit(X,target)
MT.score(X,target) # 0.9761306532663316
# 伯努利分布贝叶斯
BE = BernoulliNB()
BE.fit(X,target)
BE.score(X,target) # 0.9881550610193827
# 预测数据处理,要按照之前特征词向量对象模型转换(不能重新设置特征词向量对象后fit,会导致测试数据维度和训练模型的输入数据维度不匹配)
m = [
    'hello, nice to meet you',
    'Free lunch, please call 09999912313',
    'Free lunch, please call 080900031 9am - 11pm as a $1000 or $5000 price'
]
m = tf.transform(m).toarray()
# 测试预测
GS.predict(m) # array(['ham', 'ham', 'ham'], dtype='<U4')
MT.predict(m) # array(['ham', 'ham', 'spam'], dtype='<U4')
BE.predict(m) # array(['ham', 'ham', 'spam'], dtype='<U4')


  • 总结:
    1、在进行文本分类时调用贝叶斯算法的方式还是中规中矩,其中一个难点是读数据时要先知道数据的格式,然后才能通过pandas来读取
    2、非常重要的一个工具就是sklearn库提供的分词工具from sklearn.feature_extraction.text import TfidfVectorizer,它可以把一个一维的文本数据(每个元素是一个句子文本的列表或者其他一维数据)通过fit方法将其特征词提取出来,进行分词,之后通过transform方法再次输入数据就可以把数据变成稀疏矩阵,然后再次通过toarray方法将数据变成真真的numpy二维数组。
    3、从文本分类结果看,多项式分布更适合做文本分类,但是对于二分类文本分类任务伯努利效果更佳。

更多推荐

Day69:283. 移动零、11. 盛最多水的容器、42. 接雨水

283.移动零leetcode链接:https://leetcode.cn/problems/move-zeroes/给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3

华为云云耀云服务器L实例评测|怎么搭建企业综合Web平台

前言记得2019年,公司搞混合云的时候,测试过多家公有云,其中就有华为云。因公司也在深圳,项目也比较急,我司业务上云经验又不足,华为官方获悉情况后,第二天就派了4人小团队到我司来交流,整个交流过程非常流畅,从华为云的优势,华为POP点到我司机房网络,我司金融Web业务的特点,金融行业的通用迁云经验,甚至到后台团队连线,

数据库的模糊查询

命中率越高–策略越好数据库的模糊查询work918在SQL中,模糊查询可以使用LIKE关键字来实现。LIKE关键字后面可以跟一个模式,其中%表示任意数量的字符,_表示一个字符。例如,如果你想在一个名为students的表中查找所有名字以Li开头的学生,你可以这样做:SELECT*FROMstudentsWHEREnam

uview组件库的安装

更多的请查看官方文档uView2.0-全面兼容nvue的uni-app生态框架-uni-appUI框架(uviewui.com)//如果您的根目录没有package.json文件的话,请先执行如下命令://npminit-y安装npminstalluview-ui@2.0.36//更新//npmupdateuview-

【基本数据结构 四】线性数据结构:队列

学习了栈后,再来看看第四种线性表结构,也就是队列,队列和栈一样也是一种受限的线性表结构,和栈后进先出的操作方式不同的是,队列是FIFO的结构,也就是先进先出的操作方式。队列的定义队列这个概念非常好理解。可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”.栈只支持两个基本

在Docker中使用MindSpore GPU版本

文章目录在Docker中使用MindSporeGPU版本获取安装命令安装安装nvidia-container-toolkit获取MindSpore镜像测试运行MindSpore镜像运行代码使用VSCode开发在Docker中使用MindSporeGPU版本参考官方文档:安装指南获取安装命令如图所示命令为dockerpu

【深入理解ES6】函数

箭头函数这是ES6中引入的一个有趣的新特性。箭头函数,顾名思义就是一种使用箭头(=>)定义的新语法,与传统函数的差别如下:没有this、super、arguments和new.target绑定,他们由外围最近一层非箭头函数决定。不能通过New关键字调用。箭头函数没有construct方法,所以不能用作构造函数。没有原型

39.地址算术运算

如果p是一个指向数组中某个元素的指针,那么p++将会对p进行自增运算并指向下一个元素,而p+=i将对p进行加i的增量运算,使其指向指针p当前所指向的元素之后的第i个元素。这类运算时指针或地址算术运算中最简单的形式。allocbuf中的空间使用状况也是我们需要了解的信息。我们使用指针allocp指向allocbuf中的下

Docker实践:使用Docker搭建个人开发环境(极简版)

文章目录说明教程1.编写Dockerfile2.编写docker-compose.yml3.使用容器创建容器启动容器进入容器命令行VSCode4.关闭容器5.备份容器导出导入6.重置容器相关资料文章合集详细了解本文在个人电脑上安装Docker容器使用NVIDIA显卡托管镜像运行GUI程序说明本文是在服务器已经配置好Do

python入门篇03 基础案例 python版与java版 语法不同之处

目录1.前言:->上篇传送门:python入门篇02python的语法基础2.案例:pzy超市的收银系统(控制台输入版)->2.0需求摘要:->2.1python代码答案:<直接可以运行>->2.2java代码答案:<必须有main方法>2.3两种代码运行的结果:(一样的结果)--->2.3.2python运行结果(图

【实用 Python 库】Python glob库:轻松应对文件和目录管理

导言在Python编程中,我们经常需要处理文件和目录。为了更便捷地处理这些任务,Python提供了glob库,它允许我们根据特定模式匹配文件和目录。本篇博客将详细介绍glob库的用法,并通过实例演示它的各种功能。什么是glob库?glob库是Python标准库中的一个模块,它提供了一个简单而强大的方法来匹配文件和目录的

热文推荐