作者:i阿极
作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页
如果觉得文章不错或能帮助到你学习,可以点赞收藏评论+关注哦!
如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!
专栏案例:机器学习案例 |
---|
机器学习(一):线性回归之最小二乘法 |
机器学习(二):线性回归之梯度下降法 |
机器学习(三):基于线性回归对波士顿房价预测 |
机器学习(十四):基于逻辑回归对超市销售活动预测分析 |
机器学习(十五):基于神经网络对用户评论情感分析预测 |
机器学习(十六):线性回归分析女性身高与体重之间的关系 |
机器学习(十七):基于支持向量机(SVM)进行人脸识别预测 |
机器学习(十八):基于逻辑回归对优惠券使用情况预测分析 |
机器学习(十九):基于逻辑回归对某银行客户违约预测分析 |
机器学习(二十):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测 |
高斯朴素贝叶斯算法是一种分类算法,它基于贝叶斯定理和特征之间的高斯分布假设。该算法被广泛应用于文本分类、垃圾邮件过滤、生物信息学等领域。
高斯朴素贝叶斯算法假设每个特征都是独立的,且每个特征在每个类别下都符合高斯分布。假设样本的特征为 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(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 ) 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(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 的标准差。
在训练阶段,需要根据训练数据集计算出每个类别下每个特征的均值和标准差。在预测阶段,需要根据已有的均值和标准差计算每个类别下的概率,并选择概率最大的类别作为预测结果
为了更好的理解 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 \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(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 \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×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 \times 10^{-8} 4.8079×10−8,放贷的概率为 2.1479 × 1 0 − 6 2.1479 \times 10^{-6} 2.1479×10−6,所以根据 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(X∣Ci)的原则,可以给客户放贷。
Python 3.9
Anaconda
Jupyter Notebook
数据集信息:
皮肤数据集是通过从 FERET 数据库和 PAL 数据库中获得的不同年龄组(年轻、中年和老年)、种族组(白人、黑人和亚洲人)和性别的人脸图像中随机采样 B、G、R 值来收集的. 总学习样本量为245057;其中 50859 是皮肤样本,194198 是非皮肤样本。
属性信息:
该数据集的维度为 245057 * 4,其中前三列是 B、G、R(x1、x2 和 x3 特征)值,第四列是类标签(决策变量 y)。
导入数据
# 导入第三方包
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
将数据集划分为训练集和测试集,分别用于模型的构建和评估。
# 导入第三方模块
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)
# 导入第三方模块
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条样本。
# 导入第三方包
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%。通过准确率、精准率和覆盖率对比,模型的预测效果比较理想的。
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博客,创作不易,如果觉得文章不错,可以点赞收藏评论
你的支持和鼓励是我创作的动力❗❗❗