您现在的位置是:首页 >技术教程 >机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析网站首页技术教程
机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析
基于高斯贝叶斯对面部皮肤进行预测分析
作者:i阿极
作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页
😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍
📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪
文章目录
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(y∣x1,x2,…,xn)=p(x1,x2,…,xn)p(y)p(x1∣y)p(x2∣y)…p(xn∣y)
p ( y ) p(y) p(y) 表示类别 y y y 在样本中出现的概率, p ( x i ∣ y ) p(x_i|y) p(xi∣y) 表示在类别 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(xi∣y) 和 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(xi∣y)=2πσy,i21exp(−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(xi∣y) 数学公式计算过程,我们将使用一个例子来解释。
假设我们有一个数据集,其中包含了年龄、收入以及一些其他特征,如下所示:
年龄 | 性别 | 是否放贷 |
---|---|---|
23 | 8000 | 1 |
27 | 12000 | 1 |
25 | 6000 | 0 |
21 | 6500 | 0 |
32 | 15000 | 1 |
45 | 10000 | 1 |
18 | 4500 | 0 |
22 | 7500 | 1 |
23 | 6000 | 0 |
20 | 6500 | 0 |
我们的目标是通过这些特征来预测是否放贷。假设我们现在想要预测是否放贷,他的年龄为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(24−21.4)2)=0.0926P( Age =24∣ loan =1)=2π×8.381exp(−2×8.382(24−29.8)2)=0.0375P( Income =8500∣ loan =0)=2π×734.851exp(−2×734.852(8500−5900)2)=1.0384×10−6P( Income =8500∣ loan =1)=2π×2576.811exp(−2×2576.812(8500−10500)2)=1.1456×10−4
贝叶斯后验概率:
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×10−6=4.8079×10−8P( 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×10−4=2.1479×10−6
经过上面的计算可知,当客户的年龄为24岁,并且收入为8500时,被预测为不放贷的概率是 4.8079 × 1 0 − 8 4.8079 imes 10^{-8} 4.8079×10−8,放贷的概率为 2.1479 × 1 0 − 6 2.1479 imes 10^{-6} 2.1479×10−6,所以根据 argmax P ( C i ) P ( X ∣ C i ) operatorname{argmax} Pleft(C_i ight) Pleft(X mid C_i ight) argmaxP(Ci)P(X∣Ci)的原则,可以给客户放贷。
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博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗