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

0、前言:

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

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

  • 应用:鸢尾花分类任务分界图
python 复制代码
# 导入基础库
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、三种贝叶斯算法的文本分类应用效果:

  • 代码:
python 复制代码
# 老三件
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、从文本分类结果看,多项式分布更适合做文本分类,但是对于二分类文本分类任务伯努利效果更佳。

相关推荐
dundunmm15 分钟前
机器学习之pandas
人工智能·python·机器学习·数据挖掘·pandas
小火炉Q25 分钟前
16 循环语句——for循环
人工智能·python·网络安全
88号技师1 小时前
真实环境下实车运行,新能源汽车锂离子电池数据集
人工智能·电动汽车·电池状态估计
原点安全1 小时前
“鼎和财险一体化数据安全管控实践”入选信通院金融领域优秀案例
大数据·人工智能·金融
吃个糖糖1 小时前
37 Opencv SIFT 特征检测
人工智能·opencv·计算机视觉
麦田里的稻草人w1 小时前
【YOLO】(基础篇一)YOLO介绍
人工智能·python·神经网络·yolo·机器学习
BTColdman12 小时前
探索 Pencils Swap 的叙事:为 DeFi 的再次爆发蓄力
人工智能·区块链
Do1phln2 小时前
论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》
论文阅读·人工智能·语言模型
小嗷犬2 小时前
【论文笔记】Visual Alignment Pre-training for Sign Language Translation
论文阅读·人工智能·机器翻译·多模态·手语翻译·手语识别
GPT祖弘2 小时前
【Agent】Chatbot、Copilot与Agent如何帮助我们的提升效率?
人工智能·copilot