机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析

news2025/2/24 4:28:52

在这里插入图片描述

基于高斯贝叶斯对面部皮肤进行预测分析

作者:i阿极

作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


专栏案例:机器学习案例
机器学习(一):线性回归之最小二乘法
机器学习(二):线性回归之梯度下降法
机器学习(三):基于线性回归对波士顿房价预测
机器学习(十四):基于逻辑回归对超市销售活动预测分析
机器学习(十五):基于神经网络对用户评论情感分析预测
机器学习(十六):线性回归分析女性身高与体重之间的关系
机器学习(十七):基于支持向量机(SVM)进行人脸识别预测
机器学习(十八):基于逻辑回归对优惠券使用情况预测分析
机器学习(十九):基于逻辑回归对某银行客户违约预测分析
机器学习(二十):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测

文章目录

  • 基于高斯贝叶斯对面部皮肤进行预测分析
  • 1、模型原理
  • 2、模型举例理解
  • 3、实验环境
  • 4、高斯贝叶斯模型-面部皮肤判别
    • 4.1数据说明
    • 4.2数据准备
    • 4.3划分训练集和测试集
    • 4.4高斯贝叶斯模型建立
    • 4.5绘制混淆矩阵
    • 4.6计算正例的预测概率,用于生成ROC曲线的数据


1、模型原理

高斯朴素贝叶斯算法是一种分类算法,它基于贝叶斯定理和特征之间的高斯分布假设。该算法被广泛应用于文本分类、垃圾邮件过滤、生物信息学等领域。
在这里插入图片描述

高斯朴素贝叶斯算法假设每个特征都是独立的,且每个特征在每个类别下都符合高斯分布。假设样本的特征为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,样本所属的类别为 y y y,则高斯朴素贝叶斯算法可以表示为:

p ( y ∣ x 1 , x 2 , … , x n ) = p ( y ) p ( x 1 ∣ y ) p ( x 2 ∣ y ) … p ( x n ∣ y ) p ( x 1 , x 2 , … , x n ) p\left(y \mid x_{1}, x_{2}, \ldots, x_{n}\right)=\frac{p(y) p\left(x_{1} \mid y\right) p\left(x_{2} \mid y\right) \ldots p\left(x_{n} \mid y\right)}{p\left(x_{1}, x_{2}, \ldots, x_{n}\right)} p(yx1,x2,,xn)=p(x1,x2,,xn)p(y)p(x1y)p(x2y)p(xny)

p ( y ) p(y) p(y) 表示类别 y y y 在样本中出现的概率, p ( x i ∣ y ) p(x_i|y) p(xiy) 表示在类别 y y y 下,特征 x i x_i xi 出现的概率, p ( x 1 , x 2 , . . . , x n ) p(x_1,x_2,...,x_n) p(x1,x2,...,xn) 表示样本出现的概率.

为了方便计算,通常假设 p ( y ) p(y) p(y) p ( x i ∣ y ) p(x_i|y) p(xiy) p ( x 1 , x 2 , . . . , x n ) p(x_1,x_2,...,x_n) p(x1,x2,...,xn) 都符合高斯分布,其概率密度函数为:

p ( x i ∣ y ) = 1 2 π σ y , i 2 exp ⁡ ( − ( x i − μ y , i ) 2 2 σ y , i 2 ) p\left(x_i \mid y\right)=\frac{1}{\sqrt{2 \pi \sigma_{y, i}^2}} \exp \left(-\frac{\left(x_i-\mu_{y, i}\right)^2}{2 \sigma_{y, i}^2}\right) p(xiy)=2πσy,i2 1exp(2σy,i2(xiμy,i)2)

μ y , i \mu_{y,i} μy,i 表示类别 y y y 下特征 x i x_i xi 的均值, σ y , i \sigma_{y,i} σy,i 表示类别 y y y 下特征 x i x_i xi 的标准差。

在训练阶段,需要根据训练数据集计算出每个类别下每个特征的均值和标准差。在预测阶段,需要根据已有的均值和标准差计算每个类别下的概率,并选择概率最大的类别作为预测结果

2、模型举例理解

为了更好的理解 p ( x i ∣ y ) p(x_i|y) p(xiy) 数学公式计算过程,我们将使用一个例子来解释。

假设我们有一个数据集,其中包含了年龄、收入以及一些其他特征,如下所示:

年龄性别是否放贷
2380001
27120001
2560000
2165000
32150001
45100001
1845000
2275001
2360000
2065000

我们的目标是通过这些特征来预测是否放贷。假设我们现在想要预测是否放贷,他的年龄为24岁,收入为8500元。我们需要使用高斯朴素贝叶斯算法来进行预测。

首先,计算因变量各类别的频率:

P (  loan  = 0 ) = 5 / 10 = 0.5 P (  loan  = 1 ) = 5 / 10 = 0.5 \begin{aligned} & P(\text { loan }=0)=5 / 10=0.5 \\ & P(\text { loan }=1)=5 / 10=0.5\end{aligned} P( loan =0)=5/10=0.5P( loan =1)=5/10=0.5

其次,计算各类别的均值:

μ Age  0 = 21.40 μ Age  1 = 29.8 μ Income  0 = 5900 μ Income  1 = 10500 \begin{aligned} & \mu_{\text {Age }_0}=21.40 \\ & \mu_{\text {Age }_1}=29.8 \\ & \mu_{\text {Income }_0}=5900 \\ & \mu_{\text {Income }_1}=10500 \\ & \end{aligned} μAge 0=21.40μAge 1=29.8μIncome 0=5900μIncome 1=10500

最后,计算标准差:

σ Age  0 = 2.42 σ Age  1 = 8.38 σ Income  0 = 734.85 σ Income  1 2576.81 \begin{aligned} \sigma_{\text {Age }_0} & =2.42 & & \sigma_{\text {Age }_1}=8.38 \\ \sigma_{\text {Income }_0} & =734.85 & & \sigma_{\text {Income }_1} 2576.81\end{aligned} σAge 0σIncome 0=2.42=734.85σAge 1=8.38σIncome 12576.81

单变量条件概率:

P (  Age  = 24 ∣  loan  = 0 ) = 1 2 π × 2.42 exp ⁡ ( − ( 24 − 21.4 ) 2 2 × 2.4 2 2 ) = 0.0926 P (  Age  = 24 ∣  loan  = 1 ) = 1 2 π × 8.38 exp ⁡ ( − ( 24 − 29.8 ) 2 2 × 8.3 8 2 ) = 0.0375 P (  Income  = 8500 ∣  loan  = 0 ) = 1 2 π × 734.85 exp ⁡ ( − ( 8500 − 5900 ) 2 2 × 734.8 5 2 ) = 1.0384 × 1 0 − 6 P (  Income  = 8500 ∣  loan  = 1 ) = 1 2 π × 2576.81 exp ⁡ ( − ( 8500 − 10500 ) 2 2 × 2576.8 1 2 ) = 1.1456 × 1 0 − 4 \begin{aligned} & P(\text { Age }=24 \mid \text { loan }=0)=\frac{1}{\sqrt{2 \pi} \times 2.42} \exp \left(-\frac{(24-21.4)^2}{2 \times 2.42^2}\right)=0.0926 \\ & P(\text { Age }=24 \mid \text { loan }=1)=\frac{1}{\sqrt{2 \pi} \times 8.38} \exp \left(-\frac{(24-29.8)^2}{2 \times 8.38^2}\right)=0.0375 \\ & P(\text { Income }=8500 \mid \text { loan }=0)=\frac{1}{\sqrt{2 \pi} \times 734.85} \exp \left(-\frac{(8500-5900)^2}{2 \times 734.85^2}\right) \\ & =1.0384 \times 10^{-6} \\ & P(\text { Income }=8500 \mid \text { loan }=1)=\frac{1}{\sqrt{2 \pi} \times 2576.81} \exp \left(-\frac{(8500-10500)^2}{2 \times 2576.81^2}\right) \\ & =1.1456 \times 10^{-4} \\ & \end{aligned} P( Age =24 loan =0)=2π ×2.421exp(2×2.422(2421.4)2)=0.0926P( Age =24 loan =1)=2π ×8.381exp(2×8.382(2429.8)2)=0.0375P( Income =8500 loan =0)=2π ×734.851exp(2×734.852(85005900)2)=1.0384×106P( Income =8500 loan =1)=2π ×2576.811exp(2×2576.812(850010500)2)=1.1456×104

贝叶斯后验概率:

P (  loan  = 0 ∣  Age  = 24 ,  Income  = 8500 ) = P (  loan  = 0 ) × P (  Age  = 24 ∣  loan  = 0 ) × P (  Income  = 8500 ∣  loan  = 0 ) = 0.5 × 0.0926 × 1.0384 × 1 0 − 6 = 4.8079 × 1 0 − 8 P (  loan  = 1 ∣  Age  = 24 ,  Income  = 8500 ) = P (  loan  = 1 ) × P (  Age  = 24 ∣  loan  = 1 ) × P (  Income  = 8500 ∣  loan  = 1 ) = 0.5 × 0.0375 × 1.1456 × 1 0 − 4 = 2.1479 × 1 0 − 6 \begin{aligned} & P(\text { loan }=0 \mid \text { Age }=24, \text { Income }=8500) \\ & =P(\text { loan }=0) \times P(\text { Age }=24 \mid \text { loan }=0) \times P(\text { Income }=8500 \mid \text { loan }=0) \\ & =0.5 \times 0.0926 \times 1.0384 \times 10^{-6}=4.8079 \times 10^{-8} \\ & P(\text { loan }=1 \mid \text { Age }=24, \text { Income }=8500) \\ & =P(\text { loan }=1) \times P(\text { Age }=24 \mid \text { loan }=1) \times P(\text { Income }=8500 \mid \text { loan }=1) \\ & =0.5 \times 0.0375 \times 1.1456 \times 10^{-4}=2.1479 \times 10^{-6}\end{aligned} P( loan =0 Age =24, Income =8500)=P( loan =0)×P( Age =24 loan =0)×P( Income =8500 loan =0)=0.5×0.0926×1.0384×106=4.8079×108P( loan =1 Age =24, Income =8500)=P( loan =1)×P( Age =24 loan =1)×P( Income =8500 loan =1)=0.5×0.0375×1.1456×104=2.1479×106

经过上面的计算可知,当客户的年龄为24岁,并且收入为8500时,被预测为不放贷的概率是 4.8079 × 1 0 − 8 4.8079 \times 10^{-8} 4.8079×108,放贷的概率为 2.1479 × 1 0 − 6 2.1479 \times 10^{-6} 2.1479×106,所以根据 argmax ⁡ P ( C i ) P ( X ∣ C i ) \operatorname{argmax} P\left(C_i\right) P\left(X \mid C_i\right) argmaxP(Ci)P(XCi)的原则,可以给客户放贷。

3、实验环境

Python 3.9

Anaconda

Jupyter Notebook

4、高斯贝叶斯模型-面部皮肤判别

4.1数据说明

数据集信息:

皮肤数据集是通过从 FERET 数据库和 PAL 数据库中获得的不同年龄组(年轻、中年和老年)、种族组(白人、黑人和亚洲人)和性别的人脸图像中随机采样 B、G、R 值来收集的. 总学习样本量为245057;其中 50859 是皮肤样本,194198 是非皮肤样本。

属性信息:

该数据集的维度为 245057 * 4,其中前三列是 B、G、R(x1、x2 和 x3 特征)值,第四列是类标签(决策变量 y)。

4.2数据准备

导入数据

# 导入第三方包
import pandas as pd
# 读入数据
skin = pd.read_excel(r"D:\CSDN\machine learning\data\Skin_NonSkin.xlsx")
skin.head()

在这里插入图片描述

设置正例和负例

skin.y = skin.y.map({2:0,1:1})
print(skin.y.value_counts())

在这里插入图片描述

0表示负例,说明样本为非人类面部皮肤,含有194198个;1表示正例,说明样本为人类面部皮肤,含有50859

4.3划分训练集和测试集

将数据集划分为训练集和测试集,分别用于模型的构建和评估。

# 导入第三方模块
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)

4.4高斯贝叶斯模型建立

# 导入第三方模块
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()

在这里插入图片描述

经统计,预测为负例的有50630条样本;预测为正例的有10635条样本。

4.5绘制混淆矩阵

# 导入第三方包
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))

在这里插入图片描述
在这里插入图片描述

经过对混淆矩阵的计算,可以得到模型的整体预测准确率为92.30%。通过准确率、精准率和覆盖率对比,模型的预测效果比较理想的。

4.6计算正例的预测概率,用于生成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()

在这里插入图片描述

由图可知,计算得到的AUC值为0.94,超过了用于评判模型好坏的阈值0.8.所以可以认为构建的高斯贝叶斯分类器是非常理想的。


📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

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

相关文章

ROS--机器人小车仿真rviz

URDF练习 需求描述: 创建一个四轮圆柱状机器人模型,机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状&…

企业业财数字化建设-财务管理领域的产品设计

数字经济时代,企业数字化建设成为发展的必经之路,更多的企业搭建全渠道的营销,交易,履约和售后体系触达和服务用户,特别是面向小B和C端用户,交易变得更灵活多变。使得资源管控,稳定保守为底层基…

C语言的缺陷/错误处理问题探讨

最近遇到一个问题,先看看如下代码: uint8_t Bcd2Dec01(uint8_t bcd) {uint8_t one (bcd & 0x0F);uint8_t ten (bcd & 0xF0) >> 4;if ((one > 9) || (ten > 9)){printf("请输入合法的BCD码!");return 0;}retu…

《C++内存管理》

本文主要介绍C内存管理的知识,主要包括new和delete,其实很简单,类比我们的C语言的内存管理malloc/free,就是在堆上申请内存的 小知识点: C构造对象的顺序:先构造全局,再构造局部静态对象&#x…

一些解决方案

文件异步下载方案 1 set QueryBussessType manually different type --> different resolving code、wherecondition 2. frontend request with the type 3. get excelHeader --> groovyUtil load from db 4. getData from db with pagination 5. saveData in an excel 6…

【测试面试】你要的宝典,软件接口测试面试题大全(总结)--附答案

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、接口测试主要目…

将war包发布到容器中的tomcat

文章目录 将war包直接发布到容器中使用数据卷将war包持久化到docker的宿主机(CentOS7) 将war包直接发布到容器中 1、将windows中的文件通过xftp程序传到centOS7中 2、创建容器,通过docker中的命令将web.jar复制到tomcat容器中 # 查看docker中的镜像 ~]$ docker imag…

0.8秒捕捉,速度超乎想象,小米和WPS用户太激动,office用户已用

只需0.8秒就能捕捉 距离4月18日小米13ultra发布会时间还剩一天。这几天雷军的微博已经把小米13ultra的亮点已经做了很多铺垫宣传。 除了系统和硬件之外,就是这次小米13ultra最大的“杀手锏”的就是“徕卡相机”。连宣传文案都改成了:一个伟大的瞬间&…

【UE】玩家位置存档

在上一篇博客中(【UE】将存档的值显示在控件蓝图上)我们介绍了如何将存档的值显示在控件蓝图上,本篇博客要介绍的是如何将玩家位置进行存档。 效果 可以看到重新进入游戏时,角色在存档点出现,而不是玩家出生点 步骤 …

XMU 算法分析与设计第三次上机题解

文章目录 一、BFS试炼之微博转发二、DFS试炼之不同路径数三、并查集试炼之合并集合并查集的介绍 四、堆排序堆排序的介绍 五、厦大GPA(分组背包)分组背包介绍 六、消防安全指挥问题(最短路Floyd)七、铺设光纤问题(最小生成树Prim)…

干货满满~如何解决跨域!!

1. 为什么会存在跨域 首先要知道,在浏览器/app中使用异步请求(ajax)发送到服务器时,会出现跨域问题。若是服务与服务之间通信是没有跨域这一说的 2. 浏览器为什么要设置跨域的存在? 为了防止恶意网页可以获取其他网站的本地数据&#xff0…

4.23、TCP状态转换(为什么四次挥手)

4.23、TCP状态转换 1.TCP状态转换图2.为什么需要四次挥手,状态转换 1.TCP状态转换图 2.为什么需要四次挥手,状态转换 2MSL(Maximum Segment Lifetime) 主动断开连接的一方, 最后进入一个 TIME_WAIT状态, 这个状态会持续: 2msl ms…

实例化构造方法static统统都学会

文章目录 前言一、实例化是什么?二、构造方法1.概念2.特性3.. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的 四.static1.static修饰成员变量2.static修饰成员方法3.static成员变量初始化 总结 前言 …

AR实战-基于Krpano的多场景融合及热点自定义

背景 在之前的博客中,曾经介绍了关于Krpano的相关知识,原文:全景自动切片技术-krpano初识。简单讲解了基于krpano1.19-pr13下单张全景照片的处理与展示。随着实景中国在各地的落地生根,三维园区、三维景区、三维乡村等等需求的集中…

ERP系统给企业管理带来哪些改变?

企业资源计划(ERP)系统是一种综合性的管理工具,它可以集成和管理企业内部所有的业务流程和信息。自上世纪90年代以来,ERP系统已成为许多企业的重要工具,为企业管理带来了巨大的变革。 第一,ERP系统可以将企…

ArrayList与顺序表

目录 ​编辑 一、线性表 二、顺序表 1、接口的实现 (1)打印顺序表 (2)新增元素 (3)判定是否包含某个元素 (4)查找某个元素对应的位置下标 (5)获取 …

基于QTableView中的MVD代理添加总结

目录 1、Qt中MVD说明 1.1 View 1.2 Delegate 1.3 Model/View的基本原理 2、代码是现实示例 2.1 设置样式文件 2.2 set base attribute 2.3 设置model 2.4 设置表头 2.5 设置数据 2.6 添加代理控件 2.6.1 添加 QSpinBox 代理 2.6.2 添加 QComboBox 代理 2.6.…

【JS】vis.js使用之vis-timeline使用攻略,vis-timeline在vue3中实现时间轴、甘特图

vis.js使用之vis-timeline使用攻略,vis-timeline实现时间轴、甘特图 1、vis-timeline简介2、安装插件及依赖3、简单示例4、疑难问题集合1. 中文zh-cn本地化2. 关于自定义class样式无法被渲染3. 关于双向数据绑定 vis.js是一个基于浏览器的可视化库,它提供…

深度探索vector

vector是什么 ? vector就是一个可以自动扩充的array。 源码解析 vector主要是通过三个指针来维护的,分别是起点,当前终点,以及当前最大空间 sizeof(vector对象) 3 * 指针大小 vector每当遇到空间不同的情况,都会…

Windows逆向安全(一)之基础知识(十三)

Switch语句 先前讲了分支结构的if else形式,除此之外还有一种分支结构:switch 此次就来以反汇编的角度研究switch语句,并与if else进行比较 Switch语句的使用 有关Switch语句在vc6.0中生成的反汇编可分为4种情况,这4种情况的区…