您现在的位置是:首页 >技术教程 >机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析网站首页技术教程

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

i阿极 2023-06-02 00:00:03
简介机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析

在这里插入图片描述

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

作者:i阿极

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

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

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


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


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 ) pleft(y mid x_{1}, x_{2}, ldots, x_{n} ight)=frac{p(y) pleft(x_{1} mid y ight) pleft(x_{2} mid y ight) ldots pleft(x_{n} mid y ight)}{pleft(x_{1}, x_{2}, ldots, x_{n} ight)} 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 ) pleft(x_i mid y ight)=frac{1}{sqrt{2 pi sigma_{y, i}^2}} exp left(-frac{left(x_i-mu_{y, i} ight)^2}{2 sigma_{y, i}^2} ight) 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 egin{aligned} & P( ext { loan }=0)=5 / 10=0.5 \ & P( ext { loan }=1)=5 / 10=0.5end{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 egin{aligned} & mu_{ ext {Age }_0}=21.40 \ & mu_{ ext {Age }_1}=29.8 \ & mu_{ ext {Income }_0}=5900 \ & mu_{ ext {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 egin{aligned} sigma_{ ext {Age }_0} & =2.42 & & sigma_{ ext {Age }_1}=8.38 \ sigma_{ ext {Income }_0} & =734.85 & & sigma_{ ext {Income }_1} 2576.81end{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 egin{aligned} & P( ext { Age }=24 mid ext { loan }=0)=frac{1}{sqrt{2 pi} imes 2.42} exp left(-frac{(24-21.4)^2}{2 imes 2.42^2} ight)=0.0926 \ & P( ext { Age }=24 mid ext { loan }=1)=frac{1}{sqrt{2 pi} imes 8.38} exp left(-frac{(24-29.8)^2}{2 imes 8.38^2} ight)=0.0375 \ & P( ext { Income }=8500 mid ext { loan }=0)=frac{1}{sqrt{2 pi} imes 734.85} exp left(-frac{(8500-5900)^2}{2 imes 734.85^2} ight) \ & =1.0384 imes 10^{-6} \ & P( ext { Income }=8500 mid ext { loan }=1)=frac{1}{sqrt{2 pi} imes 2576.81} exp left(-frac{(8500-10500)^2}{2 imes 2576.81^2} ight) \ & =1.1456 imes 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 egin{aligned} & P( ext { loan }=0 mid ext { Age }=24, ext { Income }=8500) \ & =P( ext { loan }=0) imes P( ext { Age }=24 mid ext { loan }=0) imes P( ext { Income }=8500 mid ext { loan }=0) \ & =0.5 imes 0.0926 imes 1.0384 imes 10^{-6}=4.8079 imes 10^{-8} \ & P( ext { loan }=1 mid ext { Age }=24, ext { Income }=8500) \ & =P( ext { loan }=1) imes P( ext { Age }=24 mid ext { loan }=1) imes P( ext { Income }=8500 mid ext { loan }=1) \ & =0.5 imes 0.0375 imes 1.1456 imes 10^{-4}=2.1479 imes 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 imes 10^{-8} 4.8079×108,放贷的概率为 2.1479 × 1 0 − 6 2.1479 imes 10^{-6} 2.1479×106,所以根据 argmax ⁡ P ( C i ) P ( X ∣ C i ) operatorname{argmax} Pleft(C_i ight) Pleft(X mid C_i ight) 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:CSDNmachine learningdataSkin_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('模型的准确率为:
',metrics.accuracy_score(y_test, gnb_pred))
print('模型的评估报告:
',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博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。