Python大数据分析——朴素贝叶斯模型

news2024/11/15 21:21:43

Python大数据分析——朴素贝叶斯模型

  • 数学方面
    • 思路
    • 理论基础
    • 高斯贝叶斯分类器
    • 多项式贝叶斯分类器
    • 伯努利贝叶斯分类器
  • 代码部分
    • 高斯贝叶斯——皮肤识别
    • 多项式贝叶斯——毒蘑菇识别
    • 伯努利贝叶斯——情感分析

数学方面

思路

该分类器的实现思想非常简单,即通过已知类别的训练数据集,计算样本的先验概率,然后利用贝叶斯概率公式测算未知类别样本属于某个类别的后验概率,最终以最大后验概率所对应的类别作为样本的预测值。

理论基础

在这里插入图片描述
在这里插入图片描述
比如在已知收入X的情况下,Ci是购买还是不购买的概率
P(buy|X)=? P(not buy|X)=?
在这里插入图片描述
在这里插入图片描述

高斯贝叶斯分类器

如果数据集中的自变量X均为连续的数值型,则在计算P(X I Ci)时会假设自变量X服从高斯正态分布,所以自变量X的条件概率可以表示成:
在这里插入图片描述
μ平均值;σ标准差;exp是根号;

假设某金融公司是否愿意给客户放贷会优先考虑两个因素,分别是年龄和收入。现在根据已知的数据信息考察一位新客户,他的年龄为24岁,并且收入为8500元,请问该公司是否愿意给客户放贷?
数据如图所示:
在这里插入图片描述
我们通过数学的方式计算一下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
被预测为不经过上面的计算可知,当客户的年龄为24岁,并且收入为8500时,放贷的概率是4.8079x10-8,放贷的概率为2.1479x10-6,所以根据argmax P(Ci)P(X I Ci)的原则,最终该金融公司决定给客户放贷。

多项式贝叶斯分类器

在这里插入图片描述
例子:
假设影响女孩是否参加相亲活动的重要因素有三个,分别是男孩的职业、受教育水平和收入状况;如果女孩参加相亲活动,则对应的Meet变量为1,否则为0。请问在给定的信息下,对于高收入的公务员,并且其学历为硕士的男生来说,女孩是否愿意参与他的相亲?
在这里插入图片描述
在这里插入图片描述
加了平滑系数α=1,在这里面n的样本类别为2.
在这里插入图片描述
经计算发现,当男生为高收入的公务员,并且受教育水平也很高时,女生愿意见面的概率约为0.0703不愿意见面的概率约为0.0056。
所以根据argmaxP(Ci)P(XICi)的原则,最终女生会选择参加这位男生的相亲。

伯努利贝叶斯分类器

在这里插入图片描述

例子:
假设对10条评论数据做分词处理后,矩阵中含有5个词语和1个表示情感的结果,其中类别为0表示正面情绪,1表示负面情绪。如果一个用户的评论中仅包含“还行”一词,请问该用户的评论属于哪种情绪?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果所示,当用户的评论中只含有“还行”一词时,计算该评论为正面情绪的概率约为0.015,评论为负面情绪的概率约为0.00073,故根据贝叶斯后验概率最大原则将该评论预判为正面情绪。

代码部分

高斯贝叶斯——皮肤识别

  1. 导入数据并做处理
# 导入第三方包
import pandas as pd
# 读入数据
skin = pd.read_excel(r'D:\pythonProject\data\Skin_Segment.xlsx')
# 设置正例和负例
skin.y = skin.y.map({2:0,1:1}) # 做了一个映射表示,将2映射到0;1映射到1
skin.y.value_counts()

输出:
y
0 194198
1 50859
Name: count, dtype: int64

# 导入第三方模块
from sklearn import model_selection
# 样本拆分
X_train,X_test,y_train,y_test = model_selection.train_test_split(skin.iloc[:,:3], skin.y, test_size = 0.25, random_state=1234)
  1. 进行预测
# 导入第三方模块
from sklearn import naive_bayes
# 调用高斯朴素贝叶斯分类器的“类”
gnb = naive_bayes.GaussianNB()
# 模型拟合
gnb.fit(X_train, y_train)
# 模型在测试数据集上的预测
gnb_pred = gnb.predict(X_test)
# 各类别的预测数量
pd.Series(gnb_pred).value_counts()

输出:
0 50630
1 10635
Name: count, dtype: int64
预测0是5w个;1是1w个

  1. 查看下评估结果
# 导入第三方包
from sklearn import metrics
import matplotlib.pyplot as plt
import seaborn as sns
# 构建混淆矩阵
cm = pd.crosstab(gnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()

print('模型的准确率为:\n',metrics.accuracy_score(y_test, gnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test, gnb_pred))

输出:
在这里插入图片描述
发现模型评估结果还是比较高的。
也可以坐下ROC曲线

# 计算正例的预测概率,用于生成ROC曲线的数据
y_score = gnb.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

输出:
在这里插入图片描述
大于0.8,认为我们的模型是合理的

多项式贝叶斯——毒蘑菇识别

MultinomialNB(alpha =1.0, fit_prior = True, class_prior = None)
alpha: 用于指定平滑系数a的值,默认为1.0
fit_prior: bool类型参数,是否以数据集中各类别的比例作为P(Ci)的先验概率,默认为True
class_prior:用于人工指定各类别的先验概率P(Ci),如果指定该参数,则参数fit_prior不再有效

  1. 查看数据
# 导入第三方包
import pandas as pd
# 读取数据
mushrooms = pd.read_csv(r'D:\pythonProject\data\mushrooms.csv')
# 数据的前5行
mushrooms.head()

输出:
在这里插入图片描述

我们发现蘑菇有21个x,并且都是字符型的离散型变量,所以给选择多项式模型,我们需要转化成数字类型变量

  1. 数据处理
# 将字符型数据作因子化处理,将其转换为整数型数据
columns = mushrooms.columns[1:]
for column in columns:
    mushrooms[column] = pd.factorize(mushrooms[column])[0]
mushrooms.head()

输出:
在这里插入图片描述

from sklearn import model_selection
# 将数据集拆分为训练集合测试集
Predictors = mushrooms.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(mushrooms[Predictors], mushrooms['type'], test_size = 0.25, random_state = 10)
  1. 预测结果
from sklearn import naive_bayes
from sklearn import metrics
import seaborn as sns
import matplotlib.pyplot as plt
# 构建多项式贝叶斯分类器的“类”
mnb = naive_bayes.MultinomialNB()
# 基于训练数据集的拟合
mnb.fit(X_train, y_train)
# 基于测试数据集的预测
mnb_pred = mnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(mnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()

# 模型的预测准确率
print('模型的准确率为:\n',metrics.accuracy_score(y_test, mnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test, mnb_pred))

在这里插入图片描述

from sklearn import metrics
# 计算正例的预测概率,用于生成ROC曲线的数据
y_score = mnb.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test.map({'edible':0,'poisonous':1}), y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

在这里插入图片描述

伯努利贝叶斯——情感分析

BernoulliNB (alpha =1.0, binarize=0.0, fit prior = True, class prior = None)
alpha: 用于指定平滑系数a的值,默认为1.0
binarize: 如果该参数为浮点型数值,则将以该值为界限,当自变量的值大于该值时,自变量的值将被转换为1,否则被转换为0;如果该参数为None时,则默认训练数据集的自变量均为0-1值
fit prior: bool类型参数,是否以数据集中各类别的比例作为P(Ci)的先验概率,默认为True
class prior: 用于人工指定各类别的先验概率P(Ci),如果指定该参数,则参数fit prior不再有效

  1. 查看数据
import pandas as pd
# 读入评论数据
evaluation = pd.read_excel(r'D:\pythonProject\data\Contents.xlsx',sheet_name=0)
# 查看数据前10行
evaluation.head(10)

输出:
在这里插入图片描述

  1. 数据处理
# 运用正则表达式,将评论中的数字和英文去除
evaluation.Content = evaluation.Content.str.replace('[0-9a-zA-Z]','')
evaluation.head()

在这里插入图片描述

# 导入第三方包(切词的功能包)
import jieba

# 加载自定义词库(通过自定义词库更好的切词)
jieba.load_userdict(r'D:\pythonProject\data\all_words.txt')

# 读入停止词(比如虚词,感叹词等)
with open(r'D:\pythonProject\data\mystopwords.txt', encoding='UTF-8') as words:
    stop_words = [i.strip() for i in words.readlines()]

# 构造切词的自定义函数,并在切词过程中删除停止词
def cut_word(sentence):
    words = [i for i in jieba.lcut(sentence) if i not in stop_words]
    # 切完的词用空格隔开
    result = ' '.join(words)
    return(result)
# 对评论内容进行批量切词
words = evaluation.Content.apply(cut_word)
# 前5行内容的切词效果
words[:5]

在这里插入图片描述

  1. 做文档词条矩阵
# 导入第三方包
from sklearn.feature_extraction.text import CountVectorizer
# 计算每个词在各评论内容中的次数,并将稀疏度为99%以上的词删除(就是该词在99%的文档都没出现过的我们直接舍弃不要)
counts = CountVectorizer(min_df = 0.01)
# 文档词条矩阵
dtm_counts = counts.fit_transform(words).toarray()
# 矩阵的列名称
columns = counts.get_feature_names_out()
# 将矩阵转换为数据框--即X变量
X = pd.DataFrame(dtm_counts, columns=columns)
# 情感标签变量
y = evaluation.Type
X.head()

在这里插入图片描述

  1. 准确度
from sklearn import model_selection
from sklearn import naive_bayes
from sklearn import metrics
import matplotlib.pyplot as plt
import seaborn as sns
# 将数据集拆分为训练集和测试集
X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.25, random_state=1)
# 构建伯努利贝叶斯分类器
bnb = naive_bayes.BernoulliNB()
# 模型在训练数据集上的拟合
bnb.fit(X_train,y_train)
# 模型在测试数据集上的预测
bnb_pred = bnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(bnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()

# 模型的预测准确率
print('模型的准确率为:\n',metrics.accuracy_score(y_test, bnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test, bnb_pred))

在这里插入图片描述

# 计算正例Positive所对应的概率,用于生成ROC曲线的数据
y_score = bnb.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test.map({'Negative':0,'Positive':1}), y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

在这里插入图片描述

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

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

相关文章

vs code 代码同步到服务器,无需下载插件,使用自带ftp

可使用 vscode 自带ftp,无需下载插件 快捷键 ctrl shift p {"name": "My Server", //上传名"host": "192.168.56.102",//服务器"protocol": "ftp",//协议"port": 21,//端口"username": &q…

《机电信息》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《机电信息》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《机电信息》级别? 答:省级。主管单位:江苏省设备成套股份有限公司 主办单位&#x…

nvm安装高版本的node18.17.0,报https://nodejs.org/dist/latest/SHASUMS256.txt

1、执行npm install v18.17.0这条命令时,报如下错误: 2、或者报Node.js v18.17.0 is not yet released or is not available. 解决方案: 1、打开nvm 的安装路径中的setting.json node_mirror:npm.taobao.org/mirrors/node/ npm_mirror:npm.…

基于目标检测的目标跟踪(python)

文章目录 概要环境准备目标检测实现目标跟踪实现整合后的代码可能遇到的问题Could not load library libcudnn_ops_infer.so.8. Error: libcudnn_ops_infer.so.8: cannot open shared object file: No such file or directory参考概要 基于目标检测的目标跟踪过程通常包括以下…

硬控年轻人的长沙,城市底色竟是研发

近年来,找到“流量密码”的长沙,吸引了来自全国各地的年轻人,形成百川赴海之势。而消费生力军的到来,也让长沙成为新消费发展的“沃土”,三顿半、茶颜悦色、文和友、墨茉点心局、柠季、零食很忙等一众“顶流”新消费品…

ADC的一些细节

一,输入通道 总共 2 个 ADC(ADC1,ADC2),每个 ADC 有 18 个转换通道: 16 个外部通道、 2 个内部通道(温度传感器、内部参考电压) ADC1和ADC2的通道都相同,是采用分时复用来…

汇凯金业:黄金交易技术分析方法

黄金交易,作为一种高风险、高收益的投资方式,需要投资者具备一定的专业知识和技能,才能在市场中获得收益。技术分析,作为一种重要的分析方法,可以帮助投资者判断市场趋势,寻找交易机会。 一、趋势分析&…

TOB拓客销售新方向全网大数据捕捉

销售开拓市场什么最重要 ? 思考这个问题几秒钟,相信大家就知道了 当然是客户数据,只有源源不断的客户数据才有成交机会,所以每个企业都会遇到获客难的问题 那么今天哦我们俩围绕这个问题,给大家汇报一下&#xff…

5 倍网络性能提升!DigitalOcean上线全新高级内存优化型和高级存储优化型 Droplet 云主机

支持用户从想法到实现,再到业务不断发展过程中提供持续可靠的支持,这是 DigitalOcean 的核心使命。所以 DigitalOcean 也在不断推出更多专业的解决方案。 DigitalOcean Droplet 是基于虚拟化硬件上运行的虚拟机(VM)。用户创建的每…

使用无服务器功能的云计算成新趋势?无服务器功能的隐藏挑战

无服务器函数非常适合小任务 使用无服务器功能的云计算已广受欢迎。它们对实现新功能的吸引力源于无服务器计算的简单性。您可以使用无服务器功能来分析传入的照片或处理来自 IoT 设备的事件。它快速、简单且可扩展。您不必分配和维护计算资源 - 只需部署应用程序代码。主要的…

简单的docker学习 第11章 镜像中心

第11章 镜像中心 Docker Hub 与阿里云都是 Docker 的公网镜像中心,用户可以将自己的镜像 push 到公网镜像中心中自己的镜像仓库,并可将仓库设置为私有库,使他人无法看到,更无法 pull,以保证镜像的安全性。不过&#x…

云服务IaaS、PaaS、SaaS的区别

云计算有三种主要服务模式:基础设施级服务(IaaS),平台级服务(PaaS)和软件级服务(SaaS),它们具体是啥?三者之间的区别是什么? IaaS、PaaS、SaaS是…

WAF是什么,有什么用?

在互联网技术的飞速发展下,企业对网络安全的重视程度与日俱增。面对日益复杂的网络攻击和数据安全威胁,云WAF(Web Application Firewall)作为一种先进的网络安全解决方案,正逐渐成为企业网络安全架构中的关键组件。本文…

WEB渗透Web突破篇-WAF绕过

SQL注入分块传输 https://github.com/c0ny1/chunked-coding-converter跑注入点被拦截使用分块传输,右键选择使用SQLMAP跑注入>python sqlmap.py -r 1.txt --batch --proxyhttp://127.0.0.1:8080 --dbs自动提供可用的tamper Atlas https://github.com/m4ll0k/At…

第1讲:C语言常见概念

目录 1. C语言是什么? 2. C语言的历史和辉煌 3. 编译器的选择VS2022 4. VS项目和源文件、头文件介绍 5. 第⼀个C语言程序 6. main函数 7. printf和库函数 8. 关键字介绍 9. 字符和ASCII编码 10. 字符串和\0 1. 转义字符 12. 语句和语句分类 13. 注释是什…

sql注入知识整理

sql注入知识整理 一、SQL注入概念 SQL注入就是用户输入的一些语句没有被过滤,输入后诸如这得到了数据库的信息SQL 注入是一种攻击方式,在这种攻击方式中,在字符串中插入恶意代码,然后将该字符串传递到 SQL Server 数据库引擎的实…

<数据集>电梯内人车识别数据集<目标检测>

数据集格式:VOC格式 图片数量:97张 标注数量(xml文件个数):97 标注类别数:3 标注类别名称: [person, motorcycle, bicycle] 序号类别名称图片数框数1person891322motorcycle78793bicycle2222 使用标注工具&#…

跑酷视频素材去哪里下载?哪里有跑酷游戏视频素材?

在这个快节奏的视觉时代,跑酷视频因其惊险和动感吸引了众多动作爱好者和视频创作者的目光。如果您正在寻找高质量的跑酷视频素材来丰富您的项目,无论是增强视频的视觉冲击力还是展现跑酷运动的魅力,以下几个推荐的网站将是您的理想选择。 蛙…

『哈哥赠书 - 55期』-『码农职场:IT人求职就业手册』

文章目录 ⭐️ 码农职场:IT人求职就业手册⭐️ 本书简介⭐️ 作者简介⭐️ 编辑推荐 这是一本专为广大IT行业求职者量身定制的指南,提供了从职前准备到成功就业的全方位指导,涵盖了职业目标规划、自我技能评估、求职策略、简历准备以及职场心…

Monorepo与pnpm:前端项目管理的完美搭档

一、什么是pnpm pnpm又称 performant npm,翻译过来就是高性能的npm。 1.节省磁盘空间提高安装效率 pnpm通过使用硬链接和符号链接(又称软链接)的方式来避免重复安装以及提高安装效率。硬链接:和原文件共用一个磁盘地址&#xf…